diff --git a/.gitignore b/.gitignore
index 78f0b4ff60d2a69216c6f3dfe1b825cef4a028e2..53097a1535ff81fd9321801a1f793105c142dc0b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,4 +9,6 @@ TAGS
 .idea
 .composer
 **/.sass-cache/
-node_modules
\ No newline at end of file
+node_modules
+import/solrmarc.log
+vendor/.git
diff --git a/.travis.yml b/.travis.yml
index c9b4cb0d3361fb75f0a880f30d44f3312a0586dd..6ef1fd1ab9c4a3a3ae4fb26fa5511bfe64e5d0b3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,11 +7,13 @@ env:
   - VUFIND_HOME=$PWD VUFIND_LOCAL_DIR=$PWD/local
 
 before_script:
-  - pear install pear/PHP_CodeSniffer
+  # Note: locked phpcs to 2.3.4 due to a bug in 2.4.0; can relax restriction after next release.
+  - pear install pear/PHP_CodeSniffer-2.3.4
   - pear channel-discover pear.phing.info
   - pear install phing/phing
   - composer global require fabpot/php-cs-fixer
   - export PATH="$HOME/.composer/vendor/bin:$PATH"
+  - phpenv config-rm xdebug.ini
   - phpenv rehash
 
 script:
diff --git a/build.xml b/build.xml
index f0eeb3336f10bb0bfd8403359fb075c017d599a8..db8bf0c420c8754d0f155b2a9d43e6db7046ed23 100644
--- a/build.xml
+++ b/build.xml
@@ -22,6 +22,7 @@
   <property name="pgsqlrootuser" value="postgres" />
   <property name="phpunit_extra_params" value="" />
   <property name="mink_driver" value="zombiejs" /><!-- may also be set to selenium -->
+  <property name="snooze_multiplier" value="1" /><!-- can be used to slow down tests (selenium only) -->
   <property name="php-cs-fixers" value="no_blank_lines_before_namespaces,function_call_space,trailing_spaces,unused_use,lowercase_keywords,encoding,parenthesis,php_closing_tag,visibility,duplicate_semicolon,extra_empty_lines,no_blank_lines_after_class_opening,no_empty_lines_after_phpdocs,operators_spaces,spaces_before_semicolon,ternary_spaces,concat_with_spaces,short_array_syntax,phpdoc_no_access,remove_leading_slash_use" />
 
 
@@ -111,12 +112,12 @@
 
   <!-- PHPUnit -->
   <target name="phpunit" description="Run tests">
-    <exec dir="${srcdir}/module/VuFind/tests" command="NODE_PATH=${nodepath} VUFIND_MINK_DRIVER=${mink_driver} VUFIND_LOCAL_DIR=${srcdir}/local VUFIND_URL=${vufindurl} phpunit -dzend.enable_gc=0 --log-junit ${builddir}/reports/phpunit.xml --coverage-clover ${builddir}/reports/coverage/clover.xml --coverage-html ${builddir}/reports/coverage/ ${phpunit_extra_params}" passthru="true" checkreturn="true" />
+    <exec dir="${srcdir}/module/VuFind/tests" command="NODE_PATH=${nodepath} VUFIND_MINK_DRIVER=${mink_driver} VUFIND_SNOOZE_MULTIPLIER=${snooze_multiplier} VUFIND_LOCAL_DIR=${srcdir}/local VUFIND_URL=${vufindurl} phpunit -dzend.enable_gc=0 --log-junit ${builddir}/reports/phpunit.xml --coverage-clover ${builddir}/reports/coverage/clover.xml --coverage-html ${builddir}/reports/coverage/ ${phpunit_extra_params}" passthru="true" checkreturn="true" />
   </target>
 
   <!-- PHPUnit without logging output -->
   <target name="phpunitfast" description="Run tests">
-    <exec dir="${srcdir}/module/VuFind/tests" command="NODE_PATH=${nodepath} VUFIND_MINK_DRIVER=${mink_driver} VUFIND_LOCAL_DIR=${srcdir}/local VUFIND_URL=${vufindurl} phpunit -dzend.enable_gc=0 ${phpunit_extra_params}" passthru="true" checkreturn="true" />
+    <exec dir="${srcdir}/module/VuFind/tests" command="NODE_PATH=${nodepath} VUFIND_MINK_DRIVER=${mink_driver} VUFIND_SNOOZE_MULTIPLIER=${snooze_multiplier} VUFIND_LOCAL_DIR=${srcdir}/local VUFIND_URL=${vufindurl} phpunit -dzend.enable_gc=0 ${phpunit_extra_params}" passthru="true" checkreturn="true" />
   </target>
 
   <!-- Install and Activate VuFind -->
diff --git a/composer.json b/composer.json
index d8ac671051093e540a8b14112c8fa268d1676dca..8a20b7a7aaed6105011fd934925b3b11758d1cd6 100644
--- a/composer.json
+++ b/composer.json
@@ -1,60 +1,50 @@
-{
-    "name": "vufind/vufind",
-    "description": "A flexible discovery layer.",
-    "authors": [
-        {
-            "name": "Demian Katz",
-            "email": "demian.katz@villanova.edu"
-        }
-    ],
-    "license": "GPL-2.0",
-    "repositories": [
-        {
-            "type": "composer",
-            "url": "https://packages.zendframework.com/"
-        },
-        {
-            "type": "pear",
-            "url": "http://pear.php.net"
-        },
-        {
-            "type": "package",
-            "package": {
-                "name": "mobileesp/mdetect",
-                "version": "dev-master",
-                "dist": {
-                    "url": "https://raw.githubusercontent.com/ahand/mobileesp/master/PHP/mdetect.php",
-                    "type": "file"
-                },
-                "autoload": {
-                    "classmap": ["/"]
-                }
-            }
-        }
-    ],
-    "require": {
-        "aferrandini/phpqrcode": "1.0.1",
-        "jasig/phpcas": "1.3.3",
-        "cap60552/php-sip2": "1.0.0",
-        "los/losrecaptcha": "1.0.0",
-        "mobileesp/mdetect": "dev-master",
-        "ocramius/proxy-manager": "1.0.2",
-        "oyejorge/less.php": "1.7.0.9",
-        "pear-pear.php.net/file_marc": "1.1.2",
-        "pear-pear.php.net/pear": "1.10.1",
-        "pear-pear.php.net/validate_ispn": "0.6.1",
-        "serialssolutions/summon": "1.0.0",
-        "symfony/yaml": "2.7.6",
-        "vufind-org/vufindcode": "1.0.2",
-        "vufind-org/vufindhttp": "2.0.0",
-        "zendframework/zendframework": "2.4.6",
-        "zendframework/zendrest": "2.0.2",
-        "zendframework/zendservice-amazon": "2.0.4",
-        "zf-commons/zfc-rbac": "2.5.2"
-    },
-    "require-dev": {
-        "behat/mink": "1.7.0",
-        "behat/mink-selenium2-driver": "1.3.0",
-        "behat/mink-zombie-driver": "1.3.0"
-    }
-}
+{
+    "name": "vufind/vufind",
+    "description": "A flexible discovery layer.",
+    "authors": [
+        {
+            "name": "Demian Katz",
+            "email": "demian.katz@villanova.edu"
+        }
+    ],
+    "license": "GPL-2.0",
+    "repositories": [
+        {
+            "type": "composer",
+            "url": "https://packages.zendframework.com/"
+        },
+        {
+            "type": "pear",
+            "url": "http://pear.php.net"
+        },
+        {
+            "type": "vcs",
+            "url": "https://github.com/ahand/mobileesp"
+        }
+    ],
+    "require": {
+        "aferrandini/phpqrcode": "1.0.1",
+        "jasig/phpcas": "1.3.3",
+        "cap60552/php-sip2": "1.0.0",
+        "los/losrecaptcha": "1.0.0",
+        "ahand/mobileesp": "dev-master",
+        "ocramius/proxy-manager": "1.0.2",
+        "oyejorge/less.php": "1.7.0.9",
+        "pear-pear.php.net/file_marc": "1.1.2",
+        "pear-pear.php.net/pear": "1.10.1",
+        "pear-pear.php.net/validate_ispn": "0.6.1",
+        "serialssolutions/summon": "1.0.0",
+        "symfony/yaml": "2.7.6",
+        "vufind-org/vufindcode": "1.0.2",
+        "vufind-org/vufindhttp": "2.0.0",
+        "zendframework/zendframework": "2.4.6",
+        "zendframework/zendrest": "2.0.2",
+        "zendframework/zendservice-amazon": "2.0.4",
+        "zf-commons/zfc-rbac": "2.5.2"
+    },
+    "require-dev": {
+        "behat/mink": "1.7.0",
+        "behat/mink-selenium2-driver": "1.3.0",
+        "behat/mink-zombie-driver": "1.3.0"
+    }
+}
diff --git a/composer.lock b/composer.lock
index 4b8d070e19e0acdaeeccacf2ecfafc4e6c560697..164cae7238c6cfa5a292eefb5a59bd0ee55b56b6 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,8 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "9420a0bbc2e584b4023a6c43958b1a07",
-    "content-hash": "a0447b7d3321558bb291167cabb9097d",
+    "hash": "70752de0b828ea3005b2308508a5ec38",
+    "content-hash": "0bfc46ce6a8b8acd28e89a131f59c002",
     "packages": [
         {
             "name": "aferrandini/phpqrcode",
@@ -52,123 +52,61 @@
             "time": "2013-07-08 09:39:08"
         },
         {
-            "name": "behat/mink",
-            "version": "v1.7.0",
+            "name": "ahand/mobileesp",
+            "version": "dev-master",
             "source": {
                 "type": "git",
-                "url": "https://github.com/minkphp/Mink.git",
-                "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf"
+                "url": "https://github.com/ahand/mobileesp.git",
+                "reference": "098bc79938fceec7bbb298456ed1aba6271a0bac"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/minkphp/Mink/zipball/6c129030ec2cc029905cf969a56ca8f087b2dfdf",
-                "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf",
+                "url": "https://api.github.com/repos/ahand/mobileesp/zipball/098bc79938fceec7bbb298456ed1aba6271a0bac",
+                "reference": "098bc79938fceec7bbb298456ed1aba6271a0bac",
                 "shasum": ""
             },
-            "require": {
-                "php": ">=5.3.1",
-                "symfony/css-selector": "~2.1"
-            },
-            "require-dev": {
-                "symfony/phpunit-bridge": "~2.7"
-            },
-            "suggest": {
-                "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
-                "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
-                "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
-                "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
-            },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.7.x-dev"
-                }
-            },
             "autoload": {
-                "psr-4": {
-                    "Behat\\Mink\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Konstantin Kudryashov",
-                    "email": "ever.zet@gmail.com",
-                    "homepage": "http://everzet.com"
-                }
-            ],
-            "description": "Browser controller/emulator abstraction for PHP",
-            "homepage": "http://mink.behat.org/",
-            "keywords": [
-                "browser",
-                "testing",
-                "web"
-            ],
-            "time": "2015-09-20 20:24:03"
-        },
-        {
-            "name": "behat/mink-selenium2-driver",
-            "version": "v1.3.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/minkphp/MinkSelenium2Driver.git",
-                "reference": "bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9",
-                "reference": "bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9",
-                "shasum": ""
-            },
-            "require": {
-                "behat/mink": "~1.7@dev",
-                "instaclick/php-webdriver": "~1.1",
-                "php": ">=5.3.1"
-            },
-            "require-dev": {
-                "symfony/phpunit-bridge": "~2.7"
-            },
-            "type": "mink-driver",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.3.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Behat\\Mink\\Driver\\": "src/"
-                }
+                "classmap": [
+                    "PHP"
+                ]
             },
-            "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "Apache-2.0"
             ],
             "authors": [
                 {
-                    "name": "Konstantin Kudryashov",
-                    "email": "ever.zet@gmail.com",
-                    "homepage": "http://everzet.com"
-                },
-                {
-                    "name": "Pete Otaqui",
-                    "email": "pete@otaqui.com",
-                    "homepage": "https://github.com/pete-otaqui"
+                    "name": "Anthony Hand",
+                    "email": "anthony.hand@gmail.com",
+                    "role": "Maintainer"
                 }
             ],
-            "description": "Selenium2 (WebDriver) driver for Mink framework",
-            "homepage": "http://mink.behat.org/",
+            "description": "Since 2008, MobileESP provides web site developers an easy-to-use and lightweight API for detecting whether visitors are using a mobile device, and if so, what kind. The APIs provide simple boolean results ('true' or 'false') for identifying individual device categories (such as iPhone, BlackBerry, Android, and Windows Mobile), device capabilities (e.g., J2ME), and broad classes of devices, such as 'iPhone Tier' (iPhone/Android/Tizen) or 'Tablet Tier.' APIs are available in PHP, JavaScript, Java, C#, Ruby Python, and more.",
+            "homepage": "http://www.mobileesp.org",
             "keywords": [
-                "ajax",
                 "browser",
-                "javascript",
-                "selenium",
-                "testing",
-                "webdriver"
-            ],
-            "time": "2015-09-21 21:02:54"
+                "detect android",
+                "detect ipad",
+                "detect iphone",
+                "detect tablet",
+                "mobile",
+                "mobile detect",
+                "mobile detector",
+                "mobile device",
+                "mobile esp",
+                "mobile redirect",
+                "mobile view managing",
+                "mobile-detect",
+                "mobiledetect",
+                "responsive web",
+                "user agent",
+                "useragent"
+            ],
+            "support": {
+                "issues": "https://github.com/ahand/mobileesp/issues",
+                "source": "https://github.com/ahand/mobileesp/"
+            },
+            "time": "2015-12-03 05:20:25"
         },
         {
             "name": "cap60552/php-sip2",
@@ -205,64 +143,6 @@
             "homepage": "https://github.com/cap60552/php-sip2",
             "time": "2015-11-03 04:42:39"
         },
-        {
-            "name": "instaclick/php-webdriver",
-            "version": "1.4.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/instaclick/php-webdriver.git",
-                "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/instaclick/php-webdriver/zipball/0c20707dcf30a32728fd6bdeeab996c887fdb2fb",
-                "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb",
-                "shasum": ""
-            },
-            "require": {
-                "ext-curl": "*",
-                "php": ">=5.3.2"
-            },
-            "require-dev": {
-                "satooshi/php-coveralls": "dev-master"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "WebDriver": "lib/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Justin Bishop",
-                    "email": "jubishop@gmail.com",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Anthon Pang",
-                    "email": "apang@softwaredevelopment.ca",
-                    "role": "Fork Maintainer"
-                }
-            ],
-            "description": "PHP WebDriver for Selenium 2",
-            "homepage": "http://instaclick.com/",
-            "keywords": [
-                "browser",
-                "selenium",
-                "webdriver",
-                "webtest"
-            ],
-            "time": "2015-06-15 20:19:33"
-        },
         {
             "name": "jasig/phpcas",
             "version": "1.3.3",
@@ -376,22 +256,6 @@
             ],
             "time": "2015-04-28 15:40:23"
         },
-        {
-            "name": "mobileesp/mdetect",
-            "version": "dev-master",
-            "dist": {
-                "type": "file",
-                "url": "https://raw.githubusercontent.com/ahand/mobileesp/master/PHP/mdetect.php",
-                "reference": null,
-                "shasum": null
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "/"
-                ]
-            }
-        },
         {
             "name": "ocramius/proxy-manager",
             "version": "1.0.2",
@@ -791,56 +655,6 @@
             "description": "Library for interacting with Serials Solutions' Summon API.",
             "time": "2013-11-13 19:07:09"
         },
-        {
-            "name": "symfony/css-selector",
-            "version": "v2.7.6",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/css-selector.git",
-                "reference": "e1b865b26be4a56d22a8dee398375044a80c865b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b865b26be4a56d22a8dee398375044a80c865b",
-                "reference": "e1b865b26be4a56d22a8dee398375044a80c865b",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.9"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\CssSelector\\": ""
-                }
-            },
-            "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": "2015-10-11 09:39:48"
-        },
         {
             "name": "symfony/yaml",
             "version": "v2.7.6",
@@ -1365,6 +1179,125 @@
         }
     ],
     "packages-dev": [
+        {
+            "name": "behat/mink",
+            "version": "v1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/minkphp/Mink.git",
+                "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/minkphp/Mink/zipball/6c129030ec2cc029905cf969a56ca8f087b2dfdf",
+                "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.1",
+                "symfony/css-selector": "~2.1"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "~2.7"
+            },
+            "suggest": {
+                "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
+                "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
+                "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
+                "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.7.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Behat\\Mink\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                }
+            ],
+            "description": "Browser controller/emulator abstraction for PHP",
+            "homepage": "http://mink.behat.org/",
+            "keywords": [
+                "browser",
+                "testing",
+                "web"
+            ],
+            "time": "2015-09-20 20:24:03"
+        },
+        {
+            "name": "behat/mink-selenium2-driver",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/minkphp/MinkSelenium2Driver.git",
+                "reference": "bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9",
+                "reference": "bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9",
+                "shasum": ""
+            },
+            "require": {
+                "behat/mink": "~1.7@dev",
+                "instaclick/php-webdriver": "~1.1",
+                "php": ">=5.3.1"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "~2.7"
+            },
+            "type": "mink-driver",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Behat\\Mink\\Driver\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                },
+                {
+                    "name": "Pete Otaqui",
+                    "email": "pete@otaqui.com",
+                    "homepage": "https://github.com/pete-otaqui"
+                }
+            ],
+            "description": "Selenium2 (WebDriver) driver for Mink framework",
+            "homepage": "http://mink.behat.org/",
+            "keywords": [
+                "ajax",
+                "browser",
+                "javascript",
+                "selenium",
+                "testing",
+                "webdriver"
+            ],
+            "time": "2015-09-21 21:02:54"
+        },
         {
             "name": "behat/mink-zombie-driver",
             "version": "v1.3.0",
@@ -1427,18 +1360,129 @@
             ],
             "time": "2015-09-21 21:07:53"
         },
+        {
+            "name": "instaclick/php-webdriver",
+            "version": "1.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/instaclick/php-webdriver.git",
+                "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/instaclick/php-webdriver/zipball/0c20707dcf30a32728fd6bdeeab996c887fdb2fb",
+                "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "satooshi/php-coveralls": "dev-master"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "WebDriver": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Justin Bishop",
+                    "email": "jubishop@gmail.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Anthon Pang",
+                    "email": "apang@softwaredevelopment.ca",
+                    "role": "Fork Maintainer"
+                }
+            ],
+            "description": "PHP WebDriver for Selenium 2",
+            "homepage": "http://instaclick.com/",
+            "keywords": [
+                "browser",
+                "selenium",
+                "webdriver",
+                "webtest"
+            ],
+            "time": "2015-06-15 20:19:33"
+        },
+        {
+            "name": "symfony/css-selector",
+            "version": "v2.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/css-selector.git",
+                "reference": "b600fec37c0efca08046d481d79e7eabc07108ff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/b600fec37c0efca08046d481d79e7eabc07108ff",
+                "reference": "b600fec37c0efca08046d481d79e7eabc07108ff",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-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": "2015-10-30 20:15:42"
+        },
         {
             "name": "symfony/process",
-            "version": "v2.7.6",
+            "version": "v2.8.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7"
+                "reference": "1b988a88e3551102f3c2d9e1d47a18c3a78d6312"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7",
-                "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7",
+                "url": "https://api.github.com/repos/symfony/process/zipball/1b988a88e3551102f3c2d9e1d47a18c3a78d6312",
+                "reference": "1b988a88e3551102f3c2d9e1d47a18c3a78d6312",
                 "shasum": ""
             },
             "require": {
@@ -1447,13 +1491,16 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
                     "Symfony\\Component\\Process\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -1471,13 +1518,13 @@
             ],
             "description": "Symfony Process Component",
             "homepage": "https://symfony.com",
-            "time": "2015-10-23 14:47:27"
+            "time": "2015-11-30 12:35:10"
         }
     ],
     "aliases": [],
     "minimum-stability": "stable",
     "stability-flags": {
-        "mobileesp/mdetect": 20
+        "ahand/mobileesp": 20
     },
     "prefer-stable": false,
     "prefer-lowest": false,
diff --git a/config/vufind/EDS.ini b/config/vufind/EDS.ini
index 56404656056371cb0a1839a7a03798f441db0be8..8a8b35f5edca03cb61a7f8408087842326d6a56a 100644
--- a/config/vufind/EDS.ini
+++ b/config/vufind/EDS.ini
@@ -1,3 +1,8 @@
+; IMPORTANT NOTE: By default, VuFind will block access to certain EDS content
+; unless it knows which users are authorized (by IP, etc.). Please configure the
+; access.EDSExtendedResults permission in permissions.ini to allow users to
+; see this content. You are responsible for complying with your license.
+
 ; This section contains global settings affecting search behavior.
 [General]
 ; This setting controls the default sort order of search results; the selected
@@ -184,8 +189,9 @@ next_prev_navigation = false
 ; If using IP Authentication, then the user_id and password should remain blank
 ; and ip_auth should be set to true.
 [EBSCO_Account]
+; IP authentication for the API
 ip_auth = false
 user_name = [USERNAME]
 password  = [PASSWORD]
 profile   = [PROFILE]
-organization_id =
\ No newline at end of file
+organization_id = "VuFind 2.x from MyUniversity"
diff --git a/config/vufind/combined.ini b/config/vufind/combined.ini
index 48625a997ba82d8e92ac615eefe94871dd613d39..f7eb945885940f6355782dc19125cb53ec830100 100644
--- a/config/vufind/combined.ini
+++ b/config/vufind/combined.ini
@@ -28,6 +28,8 @@
 ;                           will be suppressed (default).
 ; filter = One or more filters to apply to search results displayed in the column.
 ;          Use multiple "filter[] = ..." lines if multiple filters are needed.
+; shard = Limit results to one or more shards (use names from searches.ini, not
+;         URLs). Use multiple "shard[] = ..." lines if multiple shards are needed.
 ;
 ; All display text is subject to translation and may be added to the language
 ; .ini files.
diff --git a/config/vufind/config.ini b/config/vufind/config.ini
index d2472498d45e021eb7c2776171bf5c00cd23c06a..d28382d9143cacf1f40af1d4448b625732407ad9 100644
--- a/config/vufind/config.ini
+++ b/config/vufind/config.ini
@@ -77,9 +77,11 @@ defaultLoggedInModule = MyResearch
 ; or omit to attempt to retain the user's current context after log out.
 ;logOutRoute = home
 ; This tab will show by default when a record is viewed:
-defaultRecordTab= Holdings
+defaultRecordTab = Holdings
 ; Hide the holdings tab if no holdings are available from the ILS
 hideHoldingsTabWhenEmpty = false
+; Whether to load all tabs (including default tab) via ajax (default is false):
+;ajaxTabs = true
 ; This page will show by default when a user accesses the MyResearch module:
 defaultAccountPage = Favorites
 ; Allow access to the Admin module? (See the access.AdminModule setting in
@@ -97,6 +99,8 @@ showBookBag = false
 bookBagMaxSize = 100
 ; Display bulk items (export, save, etc.) and checkboxes on search result screens?
 showBulkOptions = false
+; Should users be allowed to save searches in their accounts?
+allowSavedSearches = true
 ; Generator value to display in an HTML header <meta> tag:
 generator = "VuFind 2.5"
 
@@ -288,6 +292,13 @@ ils_encryption_key = false
 ;minimum_password_length = 4
 ;maximum_password_length = 32
 
+; Uncomment this line to switch on "privacy mode" in which no user information
+; will be stored in the database. Note that this is incompatible with social
+; features, password resets, and many other features. It is not recommended for
+; use with "Database" authentication, since the user will be forced to create a
+; new account upon every login.
+;privacy = true
+
 ; See the comments in library/VF/Auth/MultiAuth.php for full details
 ; on using multiple authentication methods.  Note that MultiAuth assumes login
 ; with username and password, so some methods (i.e. Shibboleth) may not be
@@ -561,7 +572,7 @@ database          = mysql://root@localhost/vufind
 ;coversize = false
 
 ; You can select Syndetics, LibraryThing, Summon, Amazon, Booksite, OpenLibrary,
-; Contentcafe and/or Google Books.
+; Contentcafe, Buchhandel.de and/or Google Books.
 ;   Note: Summon service takes a Serials Solutions client key, NOT Summon API key!
 ;coverimages     = Syndetics:MySyndeticsId,Amazon:MyAccessKeyId,Booksite,LibraryThing:MyLibraryThingId,Google,OpenLibrary,Summon:MySerialsSolutionsClientKey,Contentcafe:MyContentCafeID
 
@@ -572,6 +583,13 @@ database          = mysql://root@localhost/vufind
 ; some services will never have images cached even if caching is enabled.
 coverimagesCache = true
 
+; This setting controls which proxied image URLs will be cached to local disk (when
+; using the ?proxy= parameter of the standard /Cover/Show routes). The setting may
+; contain one or more regular expressions matching hostnames. The example
+; below will match any images from the mylibrary.edu domain; you can also use
+; "/.*/" to turn on caching for all proxied images.
+;coverproxyCache[] = "/.*\.?mylibrary\.edu/"
+
 ; These settings control the image to display when no book cover is available.
 ; If makeDynamicCovers is not false and the GD library is installed, VuFind will draw
 ; cover images on the fly. Possible values: false, solid, grid
@@ -623,6 +641,14 @@ authors         = Wikipedia
 ; You can select from Google, OpenLibrary, HathiTrust.  You should consult
 ; http://code.google.com/apis/books/branding.html before using Google Book Search.
 ; previews       = Google,OpenLibrary,HathiTrust
+ 
+; This section is needed for Buchhandel.de cover loading. You need an authentication
+; token. It may also be necessary to customize your templates in order to comply with
+; terms of service; please look at http://info.buchhandel.de/handbuch_links for
+; details before turning this on.
+[Buchhandel]
+url = "https://api.vlb.de/api/v1/cover/"
+; token = "XXXXXX-XXXX-XXXXX-XXXXXXXXXXXX" 
 
 ; Possible HathiRights options = pd,ic,op,orph,und,umall,ic-world,nobody,pdus,cc-by,cc-by-nd,
 ; cc-by-nc-nd,cc-by-nc,cc-by-nc-sa,cc-by-sa,orphcand,cc-zero,und-world,icus
diff --git a/config/vufind/facets.ini b/config/vufind/facets.ini
index 71b19b36e207c889b7873e90518e55bdf29bd0da..419d1f6348ef61b542069c745e3a983871905af3 100644
--- a/config/vufind/facets.ini
+++ b/config/vufind/facets.ini
@@ -39,7 +39,7 @@ dateRange[] = publishDate
 ;genericRange[] = example_field_str
 ; Any fields listed below will be treated as hierarchical facets
 ; (see https://wiki.apache.org/solr/HierarchicalFaceting but note that we always
-; use a trailing slash to avoid ambiquities)
+; use a trailing slash to avoid ambiguities)
 ;hierarchical[] = building
 ; Sort options for hierarchical facets:
 ; How hierarchical facets are sorted. Default is result count, but alternative ways
diff --git a/config/vufind/httpd-vufind.conf b/config/vufind/httpd-vufind.conf
index c54df1c87433e7761bd249d1a6d9dc2496512a2e..36c41cb36ddbf7c8861ac29f72efd4cffca1e877 100644
--- a/config/vufind/httpd-vufind.conf
+++ b/config/vufind/httpd-vufind.conf
@@ -25,15 +25,18 @@ Alias /vufind /usr/local/vufind/public
   </IfModule>
   AllowOverride All
 
+  php_value short_open_tag On
+
   # If you wish to use the Shibboleth authentication, uncomment the following lines
   # AND comment out the "Require all granted" line above. There must not be any other
   # "Require" lines in this configuration section for the "Require shibboleth"
   # directive to be effective.
   #AuthType shibboleth
   #Require shibboleth
+</Directory>
 
+<Location /vufind>
   RewriteEngine On
-  RewriteBase /vufind
 
   # If using VuDL, uncomment the following line, fill in your appropriate Fedora
   # server and port, and make sure that Apache mod_proxy and mod_proxy_http are
@@ -46,8 +49,6 @@ Alias /vufind /usr/local/vufind/public
   RewriteRule ^.*$ - [NC,L]
   RewriteRule ^.*$ index.php [NC,L]
 
-  php_value short_open_tag On
-
   # Uncomment this line to put VuFind into development mode in order to see more detailed messages:
   #SetEnv VUFIND_ENV development
 
@@ -66,7 +67,7 @@ Alias /vufind /usr/local/vufind/public
   # encounter unexpected side effects -- while this directory may be outside of the
   # local settings directory, there should be exactly one separate cache location per
   # local settings directory.
-  #SetEnv VUFIND_CACHE_DIR /usr/local/vufind/cache
+  #SetEnv VUFIND_CACHE_DIR /usr/local/vufind/local/cache
 
   # This line specifies additional Zend Framework 2 modules to load after the standard VuFind module.
   # Multiple modules may be specified separated by commas.  This mechanism can be used to override
@@ -77,4 +78,4 @@ Alias /vufind /usr/local/vufind/public
   # the location of the index.php file, but in case it is e.g. symlinked or there is another reason
   # to define the path manually, you can uncomment and modify this line.
   #SetEnv VUFIND_APPLICATION_PATH /usr/local/vufind
-</Directory>
+</Location>
diff --git a/config/vufind/permissions.ini b/config/vufind/permissions.ini
index d0950159d3e84c21fcf5186eac9bfc7a4f2cfa86..44ed60c13aeb872803ebef19d6c09bd59d19e9d0 100644
--- a/config/vufind/permissions.ini
+++ b/config/vufind/permissions.ini
@@ -62,6 +62,7 @@
 ;
 ; access.AdminModule - Controls access to the admin panel (if enabled in config.ini)
 ; access.DebugMode - Allows ?debug=true GET parameter to turn on debug mode
+; access.EDSExtendedResults - Controls visibility of protected EDS results
 ; access.EITModule - Controls access to the EBSCO EIT module (if active)
 ; access.StaffViewTab - Controls access to the staff view tab in record mode
 ; access.SummonExtendedResults - Controls visibility of protected Summon results
@@ -82,6 +83,12 @@ permission = access.StaffViewTab
 ;username[] = admin
 ;permission = access.DebugMode
 
+; Example for EDS
+;[default.EDSModule]
+;ipRange[] = "127.0.0.1"
+;ipRange[] = "192.168.11"
+;permission = access.EDSExtendedResults
+
 ; Examples for Shibboleth
 ;
 ; Only users that have either common-lib-terms and entityid from idp1 or 
diff --git a/index-alphabetic-browse.bat b/index-alphabetic-browse.bat
index d8d645c1b1cf131ccfca150dcc017773a00b88ad..edab122365799dcc74ed311b309e66a993fbc49d 100644
--- a/index-alphabetic-browse.bat
+++ b/index-alphabetic-browse.bat
@@ -41,11 +41,11 @@ set JAVA="%JAVA_HOME%\bin\java"
 :javaset
 
 cd %VUFIND_HOME%\import
-SET CLASSPATH="browse-indexing.jar;..\solr\lib\*"
+SET CLASSPATH="browse-indexing.jar;%SOLR_HOME%\lib\*"
 
-SET bib_index=..\solr\biblio\index
-SET auth_index=..\solr\authority\index
-SET index_dir=..\solr\alphabetical_browse
+SET bib_index=%SOLR_HOME%\biblio\index
+SET auth_index=%SOLR_HOME%\authority\index
+SET index_dir=%SOLR_HOME%\alphabetical_browse
 
 rem #####################################################
 rem If we're being called for the build_browse function, jump there now:
diff --git a/index-alphabetic-browse.sh b/index-alphabetic-browse.sh
index 60ff54234e25f676f7954c34798e17b8ed5bec2f..9f53b798267d4ca033abbecf71a31162a3134775 100755
--- a/index-alphabetic-browse.sh
+++ b/index-alphabetic-browse.sh
@@ -10,11 +10,18 @@ else
   JAVA="java"
 fi
 
+if [ "$SOLR_HOME" ]
+then
+  SOLR_HOME="$SOLR_HOME"
+else
+  SOLR_HOME="`dirname $0`/solr"
+fi
+
 set -e
 set -x
 
 cd "`dirname $0`/import"
-CLASSPATH="browse-indexing.jar:../solr/lib/*"
+CLASSPATH="browse-indexing.jar:${SOLR_HOME}/lib/*"
 
 # make index work with replicated index
 # current index is stored in the last line of index.properties
@@ -38,9 +45,9 @@ function locate_index
     eval $targetVar="$indexDir/$subDir"
 }
 
-locate_index "bib_index" "../solr/biblio"
-locate_index "auth_index" "../solr/authority"
-index_dir="../solr/alphabetical_browse"
+locate_index "bib_index" "${SOLR_HOME}/biblio"
+locate_index "auth_index" "${SOLR_HOME}/authority"
+index_dir="${SOLR_HOME}/alphabetical_browse"
 
 mkdir -p "$index_dir"
 
diff --git a/install.php b/install.php
index 6740d6d4e3b58228b869dd2e6a6f81a437d3f433..3c49205ad482b6eff2b34260ea0bc2d7ef566bc9 100644
--- a/install.php
+++ b/install.php
@@ -169,6 +169,11 @@ if (!empty($host)) {
         "\nneed to do some virtual host configuration. See\n" .
         "     http://httpd.apache.org/docs/2.2/vhosts/\n\n";
 }
+if ('/' == $basePath) {
+    echo "Since you are installing VuFind at the root of your domain, you will also"
+        . "\nneed to edit your Apache configuration to change DocumentRoot to:\n"
+        . $baseDir . "/public\n\n";
+}
 echo "Once the configuration is linked, restart Apache.  You should now be able\n";
 echo "to access VuFind at http://localhost{$basePath}\n\n";
 echo "For proper use of command line tools, you should also ensure that your\n";
@@ -207,12 +212,12 @@ function getApacheLocation($overrideDir)
         } else if (is_dir('/etc/apache2/2.2/conf.d')) {         // Solaris
             $confD = '/etc/apache2/2.2/conf.d';
             $httpdConf = '/etc/apache2/2.2/httpd.conf';
-        } else if (is_dir('/etc/apache2/conf.d')) {         // old Ubuntu / OpenSUSE
-            $confD = '/etc/apache2/conf.d';
-            $httpdConf = '/etc/apache2/httpd.conf';
         } else if (is_dir('/etc/apache2/conf-enabled')) {   // new Ubuntu / OpenSUSE
             $confD = '/etc/apache2/conf-enabled';
             $httpdConf = '/etc/apache2/apache2.conf';
+        } else if (is_dir('/etc/apache2/conf.d')) {         // old Ubuntu / OpenSUSE
+            $confD = '/etc/apache2/conf.d';
+            $httpdConf = '/etc/apache2/httpd.conf';
         } else if (is_dir('/opt/local/apache2/conf/extra')) {   // Mac with Mac Ports
             $confD = '/opt/local/apache2/conf/extra';
             $httpdConf = '/opt/local/apache2/conf/httpd.conf';
@@ -235,7 +240,7 @@ function getApacheLocation($overrideDir)
         echo "You can do it in either of two ways:\n\n";
         echo "    a) Add this line to your {$httpdConf} file:\n";
         echo "       Include {$overrideDir}/httpd-vufind.conf\n\n";
-        echo "    b) Link the configuration to Apache's conf.d directory like this:";
+        echo "    b) Link the configuration to Apache's config directory like this:";
         echo "\n       ln -s {$overrideDir}/httpd-vufind.conf {$confD}/{$symlink}\n";
         echo "\nOption b is preferable if your platform supports it,\n";
         echo "but option a is more certain to be supported.\n\n";
@@ -496,12 +501,17 @@ function buildApacheConfig($baseDir, $overrideDir, $basePath, $module, $multi, $
     if (empty($config)) {
         die("Problem reading {$baseConfig}.\n\n");
     }
-    $config = str_replace("/usr/local/vufind/local", "%override-dir%", $config);
-    $config = str_replace("/usr/local/vufind", "%base-dir%", $config);
-    $config = preg_replace("|([^/])\/vufind|", "$1%base-path%", $config);
-    $config = str_replace("%override-dir%", $overrideDir, $config);
-    $config = str_replace("%base-dir%", $baseDir, $config);
-    $config = str_replace("%base-path%", $basePath, $config);
+    $config = str_replace('/usr/local/vufind/local', '%override-dir%', $config);
+    $config = str_replace('/usr/local/vufind', '%base-dir%', $config);
+    $config = preg_replace('|([^/])\/vufind|', '$1%base-path%', $config);
+    $config = str_replace('%override-dir%', $overrideDir, $config);
+    $config = str_replace('%base-dir%', $baseDir, $config);
+    $config = str_replace('%base-path%', $basePath, $config);
+    // Special cases for root basePath:
+    if ('/' == $basePath) {
+        $config = str_replace('//', '/', $config);
+        $config = str_replace('Alias /', '#Alias /', $config);
+    }
     if (!empty($module)) {
         $config = str_replace(
             "#SetEnv VUFIND_LOCAL_MODULES VuFindLocalTemplate",
diff --git a/languages/ar.ini b/languages/ar.ini
index f5d28142548e0b8fd9f6ce55693a3513904b764d..ef6f67cb092428017ce6743c7d966940eb2114aa 100644
--- a/languages/ar.ini
+++ b/languages/ar.ini
@@ -25,7 +25,7 @@ add_other_libraries = "إدراج المقالات من مكتبات أخرى"
 add_search = "إضافة حقل بحث"
 add_search_group = "إضافة مجموعة بحث"
 add_tag_error = "خطأ: لا يمكن حفظ الوسوم"
-add_tag_note = "ستقوم المسافات بفضل الوسوم.  استخدم الأقواس للوسوم المكونة من أكثر من كلمة."
+add_tag_note = "ستقوم المسافات بفضل الوسوم. استخدم الأقواس للوسوم المكونة من أكثر من كلمة."
 add_tag_success = "تم حفظ الوسوم"
 Address = "العنوان"
 adv_search_all = "كل الحقول"
@@ -329,8 +329,8 @@ export_fail = "لم يتم تصدير موادك"
 export_invalid_format = "تنسيق التصدير المحدد غير مدعوم بواسطة هذه التسجيلة."
 export_missing = "بعض البيانات مفقودة. لم يتم تصدير موادك."
 export_no_formats = "هذه التسجيلة لا تدعم التصدير."
-export_redirect = "بدء التصدير إلى  %%service%%"
-export_refworks = "بدء التصدير إلى  RefWorks"
+export_redirect = "بدء التصدير إلى %%service%%"
+export_refworks = "بدء التصدير إلى RefWorks"
 export_save = "حفظ الملف"
 export_selected = "تصدير المحدد"
 export_selected_favorites = "تصدير المفضلة المحددة"
@@ -342,7 +342,7 @@ fav_delete_deleting = "تم حذف مفضلتك."
 fav_delete_fail = "عذرا، لقد حدث خطأ. لم يتم حذف مفضلتك."
 fav_delete_missing = "بعض البيانات مفقودة. لم يتم حذف مفضلتك."
 fav_delete_success = "تم حذف مفضلتك"
-fav_delete_warn = "أنت على وشك حذف هذه المفضلات من كل قوائمك  - إذا كنت ترغب في حذف المفضلات من قائمة محددة فقط، يرجى تحديد القائمة قبل النقر على حذف."
+fav_delete_warn = "أنت على وشك حذف هذه المفضلات من كل قوائمك - إذا كنت ترغب في حذف المفضلات من قائمة محددة فقط، يرجى تحديد القائمة قبل النقر على حذف."
 fav_email_fail = "عذرا، لقد حدث خطأ. لم يتم إرسال مفضلتك عبر البريد الالكتروني"
 fav_email_missing = "بعض البيانات مفقودة. لم يتم إرسال مفضلتك عبر البريد الالكتروني."
 fav_email_success = "تم إرسال مفضلتك بالبريد الالكتروني كما طلبت."
@@ -434,7 +434,7 @@ hold_login = "لمعلومات الحجز والاستدعاء"
 hold_place = "وضع طلب"
 hold_place_fail_missing = "لقد فشل طلبك. بعض البيانات مفقودة. يرجى الاتصال بمكتب الاستعارة للمزيد من المساعدة"
 hold_place_success_html = "لقد نجح طلبك. <a href="%%url%%">حجوزاتك واستدعاءاتك</a>."
-hold_profile_html = "لمعلومات الحجز والاستدعاء، يرجى إنشاء  <a href="%%url%%">ملف فهرس مكتبك </a>."
+hold_profile_html = "لمعلومات الحجز والاستدعاء، يرجى إنشاء <a href="%%url%%">ملف فهرس مكتبك</a>."
 hold_queue_position = "وضع الصف"
 hold_request_group = "طلب من"
 hold_requested_group = "مطلوب من"
@@ -625,7 +625,7 @@ no_items_selected = "لم يتم تحديد مواد"
 nohit_filters = "المرشحات المطبقة حاليا على هذا البحث :"
 nohit_heading = "لا توجد نتائج!"
 nohit_no_filters = "لم يتم تطبيق أي مرشحات على هذا البحث."
-nohit_parse_error = "يبدو أن هناك مشكلة في استعلام بحثك.  يرجى التحقق من التركيب.  إذا لم تكن تحاول استخدام خواص متقدمة، قد يساعدك وضع الاستعلام بين قوسين مزدوجين."
+nohit_parse_error = "يبدو أن هناك مشكلة في استعلام بحثك. يرجى التحقق من التركيب. إذا لم تكن تحاول استخدام خواص متقدمة، قد يساعدك وضع الاستعلام بين قوسين مزدوجين."
 nohit_prefix = "بحثك"
 nohit_spelling = "ربما يجب عليك تجربة بعض المتغيرات الهجائية"
 nohit_suffix = "لم يطابق أي من المصادر."
@@ -661,7 +661,7 @@ note_785_3 = "ملغي جزئيا بواسطة"
 note_785_4 = "منشور بواسطة"
 note_785_5 = "منشور جزئيا بواسطة"
 note_785_6 = "منقسم إلى"
-note_785_7 = "مدمج مع  / نماذج"
+note_785_7 = "مدمج مع / نماذج"
 note_785_8 = "تغير إلى"
 Notes = "ملاحظات"
 Number = "رقم"
@@ -707,7 +707,7 @@ Place a Hold = "أحجز النسخة"
 Playing Time = "وقت التشغيل"
 Please check back soon = "يرجى التحقق مرة أخرى قريبا"
 Please contact the Library Reference Department for assistance = "يرجى الاتصال بقسم مرجعية المكتبة للمساعدة"
-Please enable JavaScript. = "الرجاء تفعيل  JavaScript."
+Please enable JavaScript. = "الرجاء تفعيل JavaScript."
 Please upgrade your browser. = "الرجاء ترقية متصفحك."
 Posted by = "منشور بواسطة"
 posted_on = "في"
@@ -745,7 +745,7 @@ query time = "وقت الاستعلام"
 random_recommendation_title = "مواد عشوائية من نتائجك"
 Range = "نطاق"
 Range slider = "تمرير النطاق"
-Read the full review online... = "قراءة المراجعة الكاملة  أونلاين..."
+Read the full review online... = "قراءة المراجعة الكاملة أونلاين..."
 Recall This = "إستدعي هذه النسخة"
 recaptcha_not_passed = "CAPTCHA لم تمر"
 Record Citations = "استشهادات التسجيلة"
@@ -754,7 +754,7 @@ Recover Account = "استعادة الحساب"
 recovery_by_email = "استعادة بواسطة البريد الالكتروني"
 recovery_by_username = "استعادة بواسطة اسم المستخدم"
 recovery_disabled = "استعادة كلمة المرور غير مفعلة"
-recovery_email_notification = "تم عمل طلب لاستعادة كلمة المرور لحسابك بـ  %%library%%."
+recovery_email_notification = "تم عمل طلب لاستعادة كلمة المرور لحسابك بـ %%library%%."
 recovery_email_sent = "تم إرسال تعليمات استعادة كلمة المرور إلى عنوان البريد الالكتروني المسجل بهذا الحساب."
 recovery_email_subject = "VuFind استعادة حساب"
 recovery_email_url_pretext = "يمكنك إعادة ضبط كلمة مرورك من خلال هذا الرابط : %%url%%"
@@ -850,7 +850,7 @@ skip_confirm = "هل أنت متأكد من أنك تريد تخطي هذه ال
 skip_fix_metadata = "لا تصلح الميتاداتا في الوقت الحالي."
 skip_step = "تخطي هذه الخطوة"
 Slide = "شريحة"
-sms_failure = "خطأ!  لا يمكن إرسال الرسالة."
+sms_failure = "خطأ! لا يمكن إرسال الرسالة."
 sms_phone_number = "رقم هاتف مكون من 10 أرقام"
 sms_sending = "جاري إرسال الرسالة..."
 sms_success = "تم إرسال الرسالة."
@@ -898,7 +898,7 @@ storage_retrieval_request_place_fail_missing = "لقد فشل طلبك. بعض 
 storage_retrieval_request_place_success = "تم طلبك بنجاح"
 storage_retrieval_request_place_text = "وضع طلب استرجاع تخزين"
 storage_retrieval_request_processed = "تمت معالجة"
-storage_retrieval_request_profile_html = "لمعلومات طلب استرجاع التخزين، يرجى إنشاء  <a href="%%url%%">ملف فهرس مكتبتك </a>."
+storage_retrieval_request_profile_html = "لمعلومات طلب استرجاع التخزين، يرجى إنشاء <a href="%%url%%">ملف فهرس مكتبتك</a>."
 storage_retrieval_request_reference = "المرجع"
 storage_retrieval_request_selected_item = "المادة المحددة"
 storage_retrieval_request_submit_text = "وضع طلب"
@@ -932,8 +932,8 @@ Table of Contents = "جدول المحتويات"
 Table of Contents unavailable = "جدول المحتويات غير متاح"
 Tag = "الوسم"
 Tag Management = "إدارة الوسوم"
-tag_delete_filter = "أنت تستخدم المرشح التالي  - اسم المستخدم: %username%, وسم: %tag%, المصدر: %resource%"
-tag_delete_warning = "تحذير! أنت على وشك حذف وسوم مصدر  %count%"
+tag_delete_filter = "أنت تستخدم المرشح التالي - اسم المستخدم: %username%, وسم: %tag%, المصدر: %resource%"
+tag_delete_warning = "تحذير! أنت على وشك حذف وسوم مصدر %count%"
 tag_filter_empty = "لا توجد وسوم متاحة لهذا المرشح"
 Tags = "الوسوم"
 tags_deleted = "%count% تم حذف وسوم"
@@ -973,13 +973,13 @@ total_saved_items = "إجمالي المواد المحفوظة"
 total_tags = "إجمالي الوسوم"
 total_users = "إجمالي المستخدمين"
 Transliterated Title = "عنوان ترانسليتريتد"
-tree_search_limit_reached_html = "لقد أعاد بحثك نتائج أكثر من اللازم لعرضها في الشجرة. عرض المواد الأولى  <b>%%limit%%</b> فقط. للبحث الكامل قم بالنقر على  <a id="fullSearchLink" href="%%url%%" target="_blank">هنا.</a>"
+tree_search_limit_reached_html = "لقد أعاد بحثك نتائج أكثر من اللازم لعرضها في الشجرة. عرض المواد الأولى <b>%%limit%%</b> فقط. للبحث الكامل قم بالنقر على <a id="fullSearchLink" href="%%url%%" target="_blank">هنا.</a>"
 unique_tags = "وسوم متفردة"
 University Library = "مكتبة الجامعة"
 Unknown = "غير معروف"
 unrecognized_facet_label = "أخرى"
 Upgrade VuFind = "ترقية VuFind"
-upgrade_description = "إذا كنت تقوم بترقية إصدار  VuFind سابق، يمكنك تحميل إعداداتك القديمة بهذه الأداة."
+upgrade_description = "إذا كنت تقوم بترقية إصدار VuFind سابق، يمكنك تحميل إعداداتك القديمة بهذه الأداة."
 URL = "URL"
 Use for = "استخدم لـ"
 Use instead = "استخدم بدلا من"
@@ -996,7 +996,7 @@ View Book Bag = "عرض سلة الكتب"
 View Full Collection = "عرض المجموعة كاملة"
 View Full Record = "عرض التسجيلة الكاملة"
 View in EDS = "أعرض في EDS"
-View online: Full view Book Preview from the Hathi Trust = "عرض على أونلاين أونلاين: معاينة كاملة لعرض الكتاب من  Hathi Trust"
+View online: Full view Book Preview from the Hathi Trust = "عرض على أونلاين أونلاين: معاينة كاملة لعرض الكتاب من Hathi Trust"
 View Record = "عرض التسجيلة"
 View Records = "عرض التسجيلات"
 View this record in EBSCOhost = "عرض هذه التسجيلة في EBSCOhost"
@@ -1007,8 +1007,8 @@ vudl_access_denied = "تم رفض الوصول."
 vudl_tab_docs = "وثائق"
 vudl_tab_pages = "الصفحات"
 VuFind Configuration = "VuFind تهيئة"
-vufind_upgrade_fail = "لا يمكننا ترقية   VuFind في الوقت الحالي"
-Warning: These citations may not always be 100% accurate = "تحذير: قد لا تكون هذه الاستشهادات دائما دقيقة بنسبة  100%"
+vufind_upgrade_fail = "لا يمكننا ترقية VuFind في الوقت الحالي"
+Warning: These citations may not always be 100% accurate = "تحذير: قد لا تكون هذه الاستشهادات دائما دقيقة بنسبة 100%"
 wcterms_broader = "موضوعات أوسع"
 wcterms_exact = "موضوعات ذات صلة"
 wcterms_narrower = "موضوعات أضيق"
@@ -1025,7 +1025,7 @@ You do not have any holds or recalls placed = "لا يوجد لديك أي حج
 You do not have any interlibrary loan requests placed = "لا توجد لديك أي طلبات استعارة ما بين المكتبات"
 You do not have any items checked out = "لا توجد لديك أي مواد معارة"
 You do not have any library cards = "ليس لديك أي بطاقة مكتبة"
-You do not have any saved resources = "لا توجد لديك أي مصادر محفوظة. قم بإجراء بحث واستخدام زر أضف إلى المفضلة  لحفظ المواد."
+You do not have any saved resources = "لا توجد لديك أي مصادر محفوظة. قم بإجراء بحث واستخدام زر أضف إلى المفضلة لحفظ المواد."
 You do not have any storage retrieval requests placed = "لا يوجد لديك أي طلبات استعادة تخزين "
 You must be logged in first = "يجب تسجيل دخولك أولا"
 Your Account = "حسابك"
diff --git a/languages/ca.ini b/languages/ca.ini
index f5b366bec946238cac1b55fe9a2209bf0e869b3f..1b2f472c24bf5feb79779f7de4d9629a9b99e383 100644
--- a/languages/ca.ini
+++ b/languages/ca.ini
@@ -36,7 +36,7 @@ add_other_libraries = "Inclou articles a altres biblioteques"
 add_search = "Afegir camp de cerca"
 add_search_group = "Afegir grup de cerca"
 add_tag_error = "Error: no es poden guardar les etiquetes"
-add_tag_note = "Els espais separen etiquetes.  Utilitzeu cometes per etiquetes de diverses paraules."
+add_tag_note = "Els espais separen etiquetes. Utilitzeu cometes per etiquetes de diverses paraules."
 add_tag_success = "Etiquetes guardades"
 Address = "Adressa"
 adv_search_all = "Tots els camps"
@@ -65,7 +65,7 @@ All Fields = "Tots els camps"
 All Pages Loaded = "S'han carregat totes les pàgines"
 All Text = "Tot el text"
 alphabrowse_matches = "Resultats"
-alphabrowselink_html = "Revisar registres per  %%index%% desde fins <a href="%%url%%">%%from%%</a>."
+alphabrowselink_html = "Revisar registres per %%index%% desde fins <a href="%%url%%">%%from%%</a>."
 An error has occurred = "S'ha produït un error"
 An error occurred during execution; please try again later. = "S'ha produït un error durant el procés; si us plau espera una estona i torna a provar-ho."
 AND = "i"
@@ -81,7 +81,7 @@ authentication_error_creation_blocked = "No estàs autoritzat per crear un usuar
 authentication_error_denied = "Les credencials no coincideixen! Accés denegat."
 authentication_error_invalid = "Inici de sessió no vàlid -- torneu-ho a intentar."
 authentication_error_loggedout = "Ha sortir del seu compte."
-authentication_error_technical = "No podem iniciar la vostra sessió en aquests moments.  Torneu-ho a provar més tard."
+authentication_error_technical = "No podem iniciar la vostra sessió en aquests moments. Torneu-ho a provar més tard."
 Author = "Autor"
 Author Browse = "Explorar autor"
 Author Notes = "Notes de l'autor"
@@ -363,7 +363,6 @@ fav_list_delete_fail = "Disculpeu, hi ha hagut un error. La vostra llista no s
 Favorites = "Favorits"
 Fee = "Quota"
 Feedback = "Feedback"
-Feedback Email = "Correu de suggerències"
 feedback_name = "Nom"
 File Description = "Descripció del fitxer"
 Filter = "Filtre"
@@ -484,7 +483,7 @@ ill_request_place_fail_missing = "Ha fallat la vostra petició. Algunes dades s
 ill_request_place_success = "Petició correcta"
 ill_request_place_text = "Demana un prèstec interbibliotecari"
 ill_request_processed = "Processat"
-ill_request_profile_html = "Per informació sobre la petició de prèstec, si us plau configura la seva  <a href="%%url%%">configuració de catàleg de biblioteca</a>."
+ill_request_profile_html = "Per informació sobre la petició de prèstec, si us plau configura la seva <a href="%%url%%">configuració de catàleg de biblioteca</a>."
 ill_request_submit_text = "Demanar"
 Illustrated = "Il·lustrat"
 ils_offline_holdings_message = "La informació de disponibilitat dels exemplars no està disponible en aquests moments, sentim les inconveniències:"
@@ -701,7 +700,7 @@ Password Again = "Contrasenya un altre cop"
 Password cannot be blank = "La contrasenya no pot estar en blanc"
 password_error_invalid = "Nova contrassenya no vàlida (ex. conté caracters no vàlids)"
 password_error_not_unique = "La constrasenya no s'ha canviat"
-password_maximum_length = "Longitut màxima de la contrasenya  %%maxlength%% caracters"
+password_maximum_length = "Longitut màxima de la contrasenya %%maxlength%% caracters"
 password_minimum_length = "El password ha tenor almenys %%minlength%% caracters"
 Passwords do not match = "Les contrasenyes no coincideixen"
 Past = "Anterior"
@@ -860,7 +859,7 @@ skip_confirm = "Vol ignorar aquest pas?"
 skip_fix_metadata = "No corregir les metadades ara."
 skip_step = "Ignora aquest pas"
 Slide = "Diapositiva"
-sms_failure = "Error!  No es pot enviar el missatge."
+sms_failure = "Error! No es pot enviar el missatge."
 sms_phone_number = "Número de telèfon de 10 dígits"
 sms_sending = "Enviant missatge..."
 sms_success = "Missatge enviat."
diff --git a/languages/cs.ini b/languages/cs.ini
index 3a48f5478eb95e89937edbb087c4044b21c9e450..0c20a3b5de4fb154a70824eba0edf3e66a7f5426 100644
--- a/languages/cs.ini
+++ b/languages/cs.ini
@@ -101,8 +101,8 @@ Book Cover = "Obálka"
 bookbag_confirm_empty = "Jste si jist(á), že chcete vyprázdnit košík?"
 bookbag_delete = "Odstranit vybrané položky"
 bookbag_delete_selected = "Odstranit vybrané"
-bookbag_email = "Poslat vybrané položky e-mailem"
-bookbag_email_selected = "Poslat e-mailem vybrané"
+bookbag_email = "Poslat vybrané položky emailem"
+bookbag_email_selected = "Poslat emailem vybrané"
 bookbag_export = "Exportovat vybrané položky"
 bookbag_export_selected = "Exportovat vybrané"
 bookbag_full = "Plný"
@@ -130,7 +130,7 @@ browse_lcc = "Procházet podle lcc čísel"
 browse_publishDate = "Rok vydání"
 browse_title = "Název"
 browse_topic = "Téma"
-bulk_email_success = "Položky odeslány e-mailem"
+bulk_email_success = "Položky odeslány emailem"
 bulk_email_title = "Položky z knihovního katalogu"
 bulk_error_missing = "Některé údaje chybí. Váš požadavek nebyl úspěšný."
 bulk_export_not_supported = "Záznam(y), který(é) jste vybral(a) nelze exportovat hromadně."
@@ -287,21 +287,21 @@ eds_mode_bool = "Přesná fráze"
 eds_mode_smart = "Vyhledávání metodou SmartText"
 eds_modes_and_expanders = "Vyhledávací režimy a rozšíření"
 Electronic = "Elektronický zdroj"
-Email = "Poslat e-mailem"
-Email Address = "E-mailová adresa"
-Email address is invalid = "E-mailová adresa není platná"
-Email Record = "Zaslat záznam e-mailem"
-Email this = "Poslat e-mailem"
-Email this Search = "Poslat e-mailem"
-email_failure = "Chyba při odesílání e-mailu"
+Email = "Poslat emailem"
+Email Address = "Emailová adresa"
+Email address is invalid = "Emailová adresa není platná"
+Email Record = "Zaslat záznam emailem"
+Email this = "Poslat emailem"
+Email this Search = "Poslat emailem"
+email_failure = "Chyba při odesílání emailu"
 email_link = "Odkaz"
 email_maximum_recipients_note = "Je možné určit maximálně %%max%% příjemců zprávy."
 email_multiple_recipients_note = "Můžete určit více příjemců zprávy. Jednotlivé adresy oddělte čárkou."
-email_selected = "Poslat e-mailem"
-email_selected_favorites = "Poslat oblíbené e-mailem"
-email_sending = "Odesílám e-mail"
+email_selected = "Poslat emailem"
+email_selected_favorites = "Poslat oblíbené emailem"
+email_sending = "Odesílám email"
 email_subject = "Téma"
-email_success = "Odeslání e-mailu bylo úspěšné"
+email_success = "Odeslání emailu bylo úspěšné"
 Empty = "Prázdný"
 Empty Book Bag = "Vyprázdnit košík"
 Enable Auto Config = "Zapnout automatickou konfiguraci"
@@ -340,9 +340,9 @@ fav_delete_fail = "Promiňte, došlo k chybě. Vaše oblíbené položky nebyly
 fav_delete_missing = "Některé údaje chybí. Vaše oblíbené položky nebyly smazány."
 fav_delete_success = "Vaše oblíbené položky byly smazány."
 fav_delete_warn = "Chystáte se smazat tyto oblíbené položky z vašich seznamů - pokud chcete smazat oblíbené jen z určitého seznamu, prosím, vyberte seznam před kliknutím na smazat."
-fav_email_fail = "Promiňte, došlo k chybě. Vaše oblíbené položky nebylo možné odeslat e-mailem."
-fav_email_missing = "Některé údaje chybí. Vaše oblíbené položky nebyly odeslány e-mailem."
-fav_email_success = "Vaše oblíbené položky byly odeslány e-mailem jak bylo požadováno."
+fav_email_fail = "Promiňte, došlo k chybě. Vaše oblíbené položky nebylo možné odeslat emailem."
+fav_email_missing = "Některé údaje chybí. Vaše oblíbené položky nebyly odeslány emailem."
+fav_email_success = "Vaše oblíbené položky byly odeslány emailem jak bylo požadováno."
 fav_export = "Exportovat oblíbené"
 fav_list_delete = "Seznam byl odstraněn."
 fav_list_delete_cancel = "Seznam nebyl odstraněn."
@@ -350,7 +350,6 @@ fav_list_delete_fail = "Promiňte, ale došlo k chybě. Váš seznam nebyl odstr
 Favorites = "Oblíbené"
 Fee = "Poplatek"
 Feedback = "Váš názor"
-Feedback Email = "E-mail"
 feedback_name = "Jméno"
 File Description = "Popis souboru"
 Filter = "Filtr"
@@ -748,11 +747,11 @@ recaptcha_not_passed = "Kód CAPTCHA nesouhlasí."
 Record Citations = "Citace záznamu"
 Record Count = "Počet záznamů"
 Recover Account = "Obnovit účet"
-recovery_by_email = "Obnovit pomocí e-mailu"
+recovery_by_email = "Obnovit pomocí emailu"
 recovery_by_username = "Obnovit pomocí uživatelského jména"
 recovery_disabled = "Obnovení hesla není povoleno"
 recovery_email_notification = "Bylo vyžádáno obnovení hesla u Vašeho účtu v %%library%%."
-recovery_email_sent = "Instrukce pro obnovení hesla byly odeslány na e-mail registrovany k tomuto účtu."
+recovery_email_sent = "Instrukce pro obnovení hesla byly odeslány na email registrovany k tomuto účtu."
 recovery_email_subject = "Obnovení hesla pro katalog knihovny"
 recovery_email_url_pretext = "Na této adrese můžete dokončit obnovení hesla: %%url%%"
 recovery_expired_hash = "Tento odkaz na obnovení hesla již je bohužel zastarralý."
@@ -847,7 +846,7 @@ skip_confirm = "Opravdu chcete přeskočit tento krok?"
 skip_fix_metadata = "Nyní nelze metadata opravit."
 skip_step = "Přeskočit tento krok"
 Slide = "Video"
-sms_failure = "Chyba!  Nelze odeslat SMS."
+sms_failure = "Chyba! Nelze odeslat SMS."
 sms_phone_number = "Desetimístné telefonní číslo"
 sms_sending = "Odesílám SMS"
 sms_success = "SMS úspěšně odeslána."
@@ -939,13 +938,13 @@ test_fix = "Opravit"
 test_ok = "OK"
 Text this = "Zaslat SMS"
 Thank you for your feedback. = "Děkujeme za Váš názor."
-That email address is already used = "Tato e-mailová adresa je již použita"
+That email address is already used = "Tato emailová adresa je již použita"
 That username is already taken = "Toto uživatelské jméno již existuje"
 The record you selected is not part of any of your lists. = "Zvolený záznam není součástí žádného vašeho seznamu."
 The record you selected is not part of the selected list. = "Zvolený záznam není součástí vybraného seznamu."
 The system is currently unavailable due to system maintenance = "Aplikace je momentálně nedostupná z důvodu údržby"
 Theme = "Å ablona"
-This email was sent from = "Tento e-mail byl odeslán z"
+This email was sent from = "Tento email byl odeslán z"
 This field is required = "Vyplnění toho pole je povinné"
 This item is already part of the following list/lists = "Tato položka se již nachází v následujícím seznamu/seznamech"
 This result not is displayed to guests = "Tyto položky nemohou být zobrazeny nepřihlášeným uživatelům."
diff --git a/languages/cy.ini b/languages/cy.ini
index 916aea09b87ff7e0b6efba23f1c4542623d33462..3e4425a766919a71c70fc5fd6607cf10da176b17 100644
--- a/languages/cy.ini
+++ b/languages/cy.ini
@@ -44,7 +44,7 @@ adv_search_toc = "Tabl Cynhwysion"
 adv_search_year = "Blwyddyn Gyhoeddi"
 Advanced = "Uwch"
 Advanced Search = "Chwiliad Uwch"
-advSearchError_noRights = "Mae'n ddrwg gennym, ond nid oes hawl gennych olygu'r chwiliad hwnnw.  Efallai bod eich sesiwn pori wedi dod i ben?"
+advSearchError_noRights = "Mae'n ddrwg gennym, ond nid oes hawl gennych olygu'r chwiliad hwnnw. Efallai bod eich sesiwn pori wedi dod i ben?"
 advSearchError_notAdvanced = "Nid yw'r chwiliad yr ydych wedi ceisio ei olygu'n chwiliad uwch"
 advSearchError_notFound = "Ni ddaethpwyd o hyd i'r chwiliad a geisiwyd"
 ajaxview_label_information = "Gwybodaeth"
@@ -352,7 +352,6 @@ fav_list_delete_fail = "Mae'n ddrwg gennym, mae gwall wedi digwydd. Ni ddilëwyd
 Favorites = "Ffefrynnau"
 Fee = "Fee"
 Feedback = "Adborth"
-Feedback Email = "E-bost Adborth"
 feedback_name = "Enw"
 File Description = "Disgrifiad Ffeil"
 Filter = "Hidlo"
@@ -476,9 +475,9 @@ ill_request_processed = "Proseswyd"
 ill_request_profile_html = "Am wybodaeth am gais am Fenthyciad Rhwnglyfrgellol, rhaid i chi sefydlu'ch <a href="%%url%%">Proffil Catalog Llyfrgell</a>."
 ill_request_submit_text = "Cyflwyno'r Cais"
 Illustrated = "Darluniadol"
-ils_offline_holdings_message = "Nid yw gwybodaeth am y stoc nac am argaeledd yr eitemau ar gael ar hyn o bryd. Rydym yn ymddiheuro am unrhyw anhwylustod.  Cysylltwch â ni am ragor o wybodaeth."
-ils_offline_home_message = "Ni fydd manylion eich cyfrif na gwybodaeth fyw am eitemau ar gael yn ystod y cyfnod hwn. Rydym yn ymddiheuro am unrhyw anhwylustod.  Cysylltwch â ni am ragor o wybodaeth."
-ils_offline_login_message = "Ni fydd manylion eich cyfrif ar gael yn ystod y cyfnod hwn. Rydym yn ymddiheuro am unrhyw anhwylustod.  Cysylltwch â ni am ragor o wybodaeth."
+ils_offline_holdings_message = "Nid yw gwybodaeth am y stoc nac am argaeledd yr eitemau ar gael ar hyn o bryd. Rydym yn ymddiheuro am unrhyw anhwylustod. Cysylltwch â ni am ragor o wybodaeth."
+ils_offline_home_message = "Ni fydd manylion eich cyfrif na gwybodaeth fyw am eitemau ar gael yn ystod y cyfnod hwn. Rydym yn ymddiheuro am unrhyw anhwylustod. Cysylltwch â ni am ragor o wybodaeth."
+ils_offline_login_message = "Ni fydd manylion eich cyfrif ar gael yn ystod y cyfnod hwn. Rydym yn ymddiheuro am unrhyw anhwylustod. Cysylltwch â ni am ragor o wybodaeth."
 ils_offline_status = "Rydym yn gwneud gwaith cynnal a chadw ar ein System Rheoli'r Llyfrgell ar hyn o bryd"
 ils_offline_title = "Gwaith Cynnal a Chadw ar y Gweill"
 Import Record = "Mewnforio Cofnod"
@@ -849,7 +848,7 @@ skip_confirm = "Ydych chi'n siŵr eich bod am hepgor y cam hwn?"
 skip_fix_metadata = "Peidio â thrwsio'r metadata ar hyn o bryd"
 skip_step = "Hepgor y cam hwn"
 Slide = "Sleid"
-sms_failure = "Gwall:  Ni ellir anfon y neges"
+sms_failure = "Gwall: Ni ellir anfon y neges"
 sms_phone_number = "Rhif Ffôn 10-Digid"
 sms_sending = "Wrthi'n anfon neges..."
 sms_success = "Neges wedi'i anfon"
diff --git a/languages/da.ini b/languages/da.ini
index 00e6d462af50973e457d5234305e6bcaa90a33b6..44266fecdbeaa880faf650a2489c628ada26ac7b 100644
--- a/languages/da.ini
+++ b/languages/da.ini
@@ -427,7 +427,7 @@ no_items_selected = "Ingen emner valgt"
 nohit_filters = "Anvendte filter på denne søgning:"
 nohit_heading = "Ingen resultater!"
 nohit_no_filters = "Ingen filter blev anvendt på denne søgning."
-nohit_parse_error = "Der forekommer at være et problem med din søgning.  Check venligst syntaksen."
+nohit_parse_error = "Der forekommer at være et problem med din søgning. Check venligst syntaksen."
 nohit_prefix = "Din søgning"
 nohit_spelling = "Prøv at variere din stavemåde"
 nohit_suffix = "ingen ressourcematch."
@@ -562,7 +562,7 @@ Set = "Sæt"
 Showing = "viser"
 Similar Items = "Lignende værker"
 Slide = "Slide"
-sms_failure = "Fejl!  Kunne ikke sende besked."
+sms_failure = "Fejl! Kunne ikke sende besked."
 sms_phone_number = "10-cifret telefonnummer"
 sms_sending = "Sender besked..."
 sms_success = "Besked sendt."
diff --git a/languages/de.ini b/languages/de.ini
index e53ebbf1ee49e74ed9326b11553cdc886452d903..3f2ea664af5b81fc280998b0e3c9235f1989187e 100644
--- a/languages/de.ini
+++ b/languages/de.ini
@@ -351,7 +351,6 @@ fav_list_delete_fail = "Leider ist ein Fehler aufgetreten. Ihre Liste wurde nich
 Favorites = "Favoriten"
 Fee = "Gebühr"
 Feedback = "Feedback"
-Feedback Email = "E-Mail Feedback"
 feedback_name = "Name"
 File Description = "Dateibeschreibung"
 Filter = "Filter"
@@ -690,7 +689,7 @@ Password cannot be blank = "Das Passwort darf nicht leer sein"
 password_error_invalid = "Ungültiges neues Passwort (enthält z.B. ungültige Zeichen)"
 password_error_not_unique = "Das Passwort wurde nicht geändert"
 password_maximum_length = "Die maximale Länge des Passowrts beträgt %%maxlength%% Zeichen"
-password_minimum_length = "Die minimale Länge des Passowrts beträgt  %%minlength%% Zeichen"
+password_minimum_length = "Die minimale Länge des Passowrts beträgt %%minlength%% Zeichen"
 Passwords do not match = "Die Passwörter stimmen nicht überein"
 Past = "seit"
 PDF Full Text = "PDF-Volltext"
diff --git a/languages/el.ini b/languages/el.ini
index c785c4f14da8e438fcd867e6607b3ede00744b52..fceb61decd4a093dd9516bcd478406c7e7662d02 100644
--- a/languages/el.ini
+++ b/languages/el.ini
@@ -1,6 +1,6 @@
 ; For future reference:
 ;Greek = "Ελληνικά"
-;note_785_7 = "Συγχωνευμένο με"  ; incomplete translation (en.ini was later revised)
+;note_785_7 = "Συγχωνευμένο με" ; incomplete translation (en.ini was later revised)
 Abstract = "Περίληψη"
 Access = "Πρόσβαση"
 Access URL = "Σύνδεσμος πρόσβασης"
@@ -343,7 +343,7 @@ fav_delete_missing = "Ελλιπή στοιχεία. Τα αγαπημένα σ
 fav_delete_success = "Τα αγαπημένα σας διαγράφηκαν"
 fav_delete_warn = "Πρόκειται να διαγράψετε αυτά τα αγαπημένα από όλες τις λίστες σας - Αν θέλετε να διαγράψετε τα αγαπημένα μόνο από μια λίστα παρακαλώ επιλέξτε τη λίστα πριν επιλέξετε διαγραφή."
 fav_email_fail = "Παρουσιάστηκε σφάλμα. Τα αγαπημένα σας δεν στάλθηκαν."
-fav_email_missing = "Ελλιπή στοιχεία.  Τα αγαπημένα σας δεν στάλθηκαν."
+fav_email_missing = "Ελλιπή στοιχεία. Τα αγαπημένα σας δεν στάλθηκαν."
 fav_email_success = " Τα αγαπημένα σας στάλθηκαν"
 fav_export = "Εξαγωγή αγαπημένων"
 fav_list_delete = "Η λίστα αγαπημένων διαγράφηκε"
@@ -352,7 +352,6 @@ fav_list_delete_fail = "Παρουσιάστηκε σφάλμα. Η λίστα 
 Favorites = "Αγαπημένα"
 Fee = "Χρέωση"
 Feedback = "σχόλιά"
-Feedback Email = "Email"
 feedback_name = "Όνομα"
 File Description = "Περιγραφή αρχείου"
 Filter = "Φίλτρο"
diff --git a/languages/en-gb.ini b/languages/en-gb.ini
index ad0cc2e8604797f0438326426b9a413774d1c389..a6287be75929a2ff9e7a986d7f08f66c8fa78764 100644
--- a/languages/en-gb.ini
+++ b/languages/en-gb.ini
@@ -24,7 +24,7 @@ fav_delete_fail = "Sorry, an error has occurred. Your favourite(s) were not dele
 fav_delete_missing = "Some data was missing. Your favourite(s) were not deleted."
 fav_delete_success = "Your favourite(s) were deleted."
 fav_delete_warn = "You are about to delete these favourites from all your lists - If you want to delete favourites from a specific list only, please select the list before clicking delete."
-fav_email_fail = "Sorry, an error has occurred. Your favourite(s) were not e-mailed."
+fav_email_fail = "Sorry, an error has occurred. Your favourite(s) were not emailed."
 fav_email_missing = "Some data was missing. Your favourite(s) were not emailed."
 fav_email_success = "Your favourite(s) were emailed as requested."
 fav_export = "Export Favourites"
diff --git a/languages/en.ini b/languages/en.ini
index 942426857bf471035b3f31570bf26e841274e628..8264879eba8932c1ee8cdd045635e3a1d89dc18f 100644
--- a/languages/en.ini
+++ b/languages/en.ini
@@ -24,7 +24,7 @@ add_other_libraries = "Include articles at other libraries"
 add_search = "Add Search Field"
 add_search_group = "Add Search Group"
 add_tag_error = "Error: Could Not Save Tags"
-add_tag_note = "Spaces will separate tags.  Use quotes for multi-word tags."
+add_tag_note = "Spaces will separate tags. Use quotes for multi-word tags."
 add_tag_success = "Tags Saved"
 Address = "Address"
 adv_search_all = "All Fields"
@@ -63,13 +63,13 @@ Article = "Article"
 Ask a Librarian = "Ask a Librarian"
 Audience = "Audience"
 Audio = "Audio"
-authentication_error_admin = "We cannot log you in at this time.  Please contact your system administrator for assistance."
+authentication_error_admin = "We cannot log you in at this time. Please contact your system administrator for assistance."
 authentication_error_blank = "Login information cannot be blank."
 authentication_error_creation_blocked = "You do not have permission to create an account."
 authentication_error_denied = "Credentials do not match! Access denied."
 authentication_error_invalid = "Invalid login -- please try again."
 authentication_error_loggedout = "You have logged out."
-authentication_error_technical = "We cannot log you in at this time.  Please try again later."
+authentication_error_technical = "We cannot log you in at this time. Please try again later."
 Author = "Author"
 Author Browse = "Author Browse"
 Author Notes = "Author Notes"
@@ -131,7 +131,7 @@ browse_lcc = "Call Number (LC)"
 browse_publishDate = "Year of Publication"
 browse_title = "Title"
 browse_topic = "Topic"
-bulk_email_success = "Your item(s) were e-mailed"
+bulk_email_success = "Your item(s) were emailed"
 bulk_email_title = "Library Catalog Items"
 bulk_error_missing = "Some data was missing. Your request was not successful."
 bulk_export_not_supported = "The record(s) you have selected do not support bulk export."
@@ -342,7 +342,7 @@ fav_delete_fail = "Sorry, an error has occurred. Your favorite(s) were not delet
 fav_delete_missing = "Some data was missing. Your favorite(s) were not deleted."
 fav_delete_success = "Your favorite(s) were deleted."
 fav_delete_warn = "You are about to delete these favorites from all your lists - If you want to delete favorites from a specific list only, please select the list before clicking delete."
-fav_email_fail = "Sorry, an error has occurred. Your favorite(s) were not e-mailed."
+fav_email_fail = "Sorry, an error has occurred. Your favorite(s) were not emailed."
 fav_email_missing = "Some data was missing. Your favorite(s) were not emailed."
 fav_email_success = "Your favorite(s) were emailed as requested."
 fav_export = "Export Favorites"
@@ -352,7 +352,6 @@ fav_list_delete_fail = "Sorry, an error has occurred. Your list was not deleted.
 Favorites = "Saved Items"
 Fee = "Fee"
 Feedback = "Feedback"
-Feedback Email = "Feedback Email"
 feedback_name = "Name"
 File Description = "File Description"
 Filter = "Filter"
@@ -385,6 +384,7 @@ Get RSS Feed = "Get RSS Feed"
 Globe = "Globe"
 Go = "Go"
 Go to Standard View = "Go to Standard View"
+go_to_list = "Go to List"
 google_map_cluster = "Cluster"
 google_map_cluster_points = "Cluster Points"
 Grid = "Grid"
@@ -624,7 +624,7 @@ no_items_selected = "No Items were Selected"
 nohit_filters = "Filters currently applied to this search:"
 nohit_heading = "No Results!"
 nohit_no_filters = "No filters were applied to this search."
-nohit_parse_error = "There seems to be a problem with your search query.  Please check the syntax.  If you are not trying to use advanced features, putting the query inside double quotes may help."
+nohit_parse_error = "There seems to be a problem with your search query. Please check the syntax. If you are not trying to use advanced features, putting the query inside double quotes may help."
 nohit_prefix = "Your search"
 nohit_spelling = "Perhaps you should try some spelling variations"
 nohit_suffix = "did not match any resources."
@@ -849,7 +849,7 @@ skip_confirm = "Are you sure you want to skip this step?"
 skip_fix_metadata = "Do not fix the metadata at this time."
 skip_step = "Skip this step"
 Slide = "Slide"
-sms_failure = "Error!  Could not send message."
+sms_failure = "Error! Could not send message."
 sms_phone_number = "10-Digit Phone Number"
 sms_sending = "Sending message..."
 sms_success = "Message sent."
diff --git a/languages/es.ini b/languages/es.ini
index 6d2246e30dd4987716f0d8218d9cb8f7647a5407..ccfda50b315a6fad6ab38085647fb1405cd7e0e5 100644
--- a/languages/es.ini
+++ b/languages/es.ini
@@ -64,7 +64,7 @@ Article = "Artículo"
 Ask a Librarian = "Consulte a un Bibliotecario"
 Audience = "Público"
 Audio = "Audiom"
-authentication_error_admin = "No podemos iniciar su sesión en este momento.  Por favor contacte a su Administrador del Sistema."
+authentication_error_admin = "No podemos iniciar su sesión en este momento. Por favor contacte a su Administrador del Sistema."
 authentication_error_blank = "La información para su Ingreso no pueden estar vacíos."
 authentication_error_creation_blocked = "No tiene permisos para crear una cuenta."
 authentication_error_denied = "Las Credenciales no coinciden! Acceso negado."
@@ -137,8 +137,8 @@ bulk_email_title = "Elementos del Catálogo de la Biblioteca"
 bulk_error_missing = "Algún dato falta. Su solicitud no fue exitosa"
 bulk_export_not_supported = "Los registros seleccionados no soportan exportación masiva."
 bulk_fail = "Lo sentimos, un error ha ocurrido. Por favor intentar nuevamente."
-bulk_noitems_advice = "Ninguna copia fue seleccionada.  Por favor hacer clic en la casilla cercana a la copia e intentar nuevamente."
-bulk_save_error = "Algún dato falta.  Sus elementos no fueron guardados."
+bulk_noitems_advice = "Ninguna copia fue seleccionada. Por favor hacer clic en la casilla cercana a la copia e intentar nuevamente."
+bulk_save_error = "Algún dato falta. Sus elementos no fueron guardados."
 bulk_save_success = "Sus elementos han sido guardados"
 By = "Por"
 by = "por"
@@ -310,7 +310,7 @@ Empty Book Bag = "Bolsa para libros vacía"
 Enable Auto Config = "Habilitar auto configuración"
 End Page = "Fin de Página"
 Era = "Época"
-error_inconsistent_parameters = "Un error ha ocurrido.  Parámetros inconsistentes detectados."
+error_inconsistent_parameters = "Un error ha ocurrido. Parámetros inconsistentes detectados."
 error_page_parameter_list_heading = "Solicitar parámetros"
 Exception = "Excepción"
 Excerpt = "Extracto"
@@ -353,7 +353,6 @@ fav_list_delete_fail = "Lo sentimos, un error ha ocurrido. Su lista no ha sido b
 Favorites = "Favoritos"
 Fee = "Cuota"
 Feedback = "Comentarios"
-Feedback Email = "Correo Electrónico"
 feedback_name = "Nombre"
 File Description = "Descripción del Archivo"
 Filter = "Filtro"
@@ -432,7 +431,7 @@ hold_invalid_pickup = "Ubicación inválida, intente de nuevo."
 hold_invalid_request_group = "Grupo de solicitud de reserva inválido. Por favor, intentar de nuevo"
 hold_login = "Para información de reservas y retiradas"
 hold_place = "Hacer solicitud"
-hold_place_fail_missing = "Su solicitud  ha fallado, contactar al personal del mostrador de circulación"
+hold_place_fail_missing = "Su solicitud ha fallado, contactar al personal del mostrador de circulación"
 hold_place_success_html = "Se ha realizado su solicitud. <a href="%%url%%">Sus reservas y reclamos</a>."
 hold_profile_html = "Para información de reservas y apartados, por favor establecer su <a href="%%url%%">Perfil del Catálogo de Biblioteca</a>."
 hold_queue_position = "En Cola"
@@ -625,7 +624,7 @@ no_items_selected = "No se han seleccionado elementos"
 nohit_filters = "Filtros aplicados a esta búsqueda"
 nohit_heading = "¡Sin Resultados!"
 nohit_no_filters = "Ningún filtro fue aplicado a esta búsqueda."
-nohit_parse_error = "Parece que hay un problema con su consulta.  Por favor revise la sintaxis de su consulta. Si no está intentando con búsquedas avanzadas, utilice doble comilla."
+nohit_parse_error = "Parece que hay un problema con su consulta. Por favor revise la sintaxis de su consulta. Si no está intentando con búsquedas avanzadas, utilice doble comilla."
 nohit_prefix = "Su búsqueda"
 nohit_spelling = "Tal vez debería intentar con algunas variantes ortográficas"
 nohit_suffix = "No coincide ningún recurso."
@@ -850,7 +849,7 @@ skip_confirm = "Seguro que quiere omitir este paso"
 skip_fix_metadata = "No fijar metadatos en este momento."
 skip_step = "Omitir este paso"
 Slide = "Deslizar"
-sms_failure = "¡Error!  No se puede enviar mensaje."
+sms_failure = "¡Error! No se puede enviar mensaje."
 sms_phone_number = "Número de teléfono de 10-dígitos"
 sms_sending = "Enviando mensaje..."
 sms_success = "Mensaje enviado."
@@ -958,7 +957,7 @@ Title View = "Vista del Título"
 title_hold_place = "Coloque una solicitud de título"
 To = "a"
 Too Many Email Recipients = "Demasiados destinatarios de correo electrónico"
-too_many_favorites = "Lista muy larga para desplegar.  Intente con sus favoritos en más de una lista o delimitelos con etiquetas."
+too_many_favorites = "Lista muy larga para desplegar. Intente con sus favoritos en más de una lista o delimitelos con etiquetas."
 too_many_new_items = "Demasiados nuevos elementos para desplegar en una sola lista. Intente limitando su búsqueda."
 too_many_reserves = "Demasiadas reservas de cursos para desplegar en una sola lista. Intente limitando su búsqueda."
 top_facet_additional_prefix = "Adicional"
diff --git a/languages/eu.ini b/languages/eu.ini
index 5660bc6d8f8d715a6b1b22dc674c6d8d546dc306..6c2e3cd9747faaa446a483e539e230e080a8dd55 100644
--- a/languages/eu.ini
+++ b/languages/eu.ini
@@ -747,7 +747,7 @@ bulk_error_missing = "Algún dato falta. Su solicitud no fue exitosa"
 bulk_export_not_supported = "Los registros seleccionados no soportan exportación masiva."
 bulk_fail = "Sentitzen dugu errorea. Mesedez, berriro saiatu."
 bulk_noitems_advice = "Ez da inongo kopiarik aukeratu. Mesedez, berriro saiatu."
-bulk_save_error = "Algún dato falta.  Sus ítemes no fueron guardados."
+bulk_save_error = "Algún dato falta. Sus ítemes no fueron guardados."
 bulk_save_success = "Sus ítem han sido guardados"
 By = "Bidez"
 by = "nork"
@@ -762,7 +762,7 @@ By Instructor = "Irakaslearen arabera"
 By Popularity = "Ospearen arabera"
 By Recent = "Berrienen artean"
 By Region = "Herrialdearen araberan"
-By Title = "Izenburuaren  arabera"
+By Title = "Izenburuaren arabera"
 By Topic = "Gaiaren arabera"
 Call Number = "Sailkapena"
 callnumber_abbrev = "Sailkapen-zenbakia"
@@ -907,7 +907,7 @@ Empty Book Bag = "Liburu Saskia hutsik dago"
 Enable Auto Config = "Gaitu Autokonfig."
 End Page = "Orriaren bukaera"
 Era = "Garaia"
-error_inconsistent_parameters = "Un error ha ocurrido.  Parámetros inconsistentes detectados."
+error_inconsistent_parameters = "Un error ha ocurrido. Parámetros inconsistentes detectados."
 error_page_parameter_list_heading = "Eskaeraren parametroak"
 Exception = "Salbuespena"
 Excerpt = "Testu"
@@ -950,7 +950,6 @@ fav_list_delete_fail = "Errorea gertatu da. Ez dugu zure zerrenda ezabatu."
 Favorites = "Gogokoenak"
 Fee = "Kuota"
 Feedback = "Feedback"
-Feedback Email = "Feedback-Posta elektronikoa"
 feedback_name = "Feedback-Izena"
 Filter = "Iragazkia"
 filter_tags = "Iragazteko etiketak"
@@ -1510,7 +1509,7 @@ Title not available = "Dokumentu hau ez dago liburutegian"
 Title View = "Izenburuaren bista"
 title_hold_place = "Egin eskaera izenbururako"
 To = "Nori"
-too_many_favorites = "Lista muy larga para desplegar.  Intente con sus favoritos en más de una lista o delimitar con etiquetas."
+too_many_favorites = "Lista muy larga para desplegar. Intente con sus favoritos en más de una lista o delimitar con etiquetas."
 too_many_new_items = "Demasiados nuevos ítemes para desplegar en una sola lista. Intente limitando su búsqueda."
 too_many_reserves = "Demasiadas reservas de cursos para desplegar en una sola lista. Intente limitando su búsqueda."
 top_facet_additional_prefix = "Aurrezenbaki gehigarria"
@@ -1521,9 +1520,9 @@ Total Balance Due = "Balantzearen guztizkoa"
 total_comments = "Iruzkinen guztizkoa"
 total_lists = "Zerrenden guztizkoa"
 total_resources = "Baliabideen guztizkoa"
-total_saved_items = "Gordetako elementuen  guztizkoa"
+total_saved_items = "Gordetako elementuen guztizkoa"
 total_tags = "Etiketen guztizkoa"
-total_users = "Erabiltzaileen  guztizkoa"
+total_users = "Erabiltzaileen guztizkoa"
 tree_search_limit_reached_html = "Zure bilaketak aurkitu zituen erakusteko emaitza gehiegi. Erakusten dira bakarrik lehenengo <b>%%limit%%</b> items. Emaitza gehiago ikusteko, sakatu <a id="fullSearchLink" href="%%url%%" target="_blank">here.</a>"
 unique_tags = "Etiketa bakarrak"
 University Library = "Liburutegi unibertsitarioa"
diff --git a/languages/fi.ini b/languages/fi.ini
index 55332dc0b1af973c590a0fb9e84f5ac418b11597..33014091ee596bca426d870c06cae7f8f9f588cb 100644
--- a/languages/fi.ini
+++ b/languages/fi.ini
@@ -62,13 +62,13 @@ Article = "Artikkeli"
 Ask a Librarian = "Kysy kirjastosta"
 Audience = "Yleisö"
 Audio = "Ääni"
-authentication_error_admin = "Sisäänkirjautuminen epäonnistui.  Ota yhteyttä järjestelmän ylläpitäjään."
+authentication_error_admin = "Sisäänkirjautuminen epäonnistui. Ota yhteyttä järjestelmän ylläpitäjään."
 authentication_error_blank = "Käyttäjätunnus/salasana ei voi olla tyhjä."
 authentication_error_creation_blocked = "Sinulla ei ole oikeutta luoda käyttäjätiliä."
 authentication_error_denied = "Käyttäjätunnus/salasana ei täsmää! Ei pääsyä järjestelmään."
 authentication_error_invalid = "Käyttäjätunnus/salasana ei täsmää. Yritä uudestaan."
 authentication_error_loggedout = "Olet kirjautunut ulos."
-authentication_error_technical = "Sisäänkirjautuminen epäonnistui.  Yritä uudestaan hetken kuluttua."
+authentication_error_technical = "Sisäänkirjautuminen epäonnistui. Yritä uudestaan hetken kuluttua."
 Author = "Tekijä"
 Author Browse = "Tekijäselaus"
 Author Notes = "Tekijähuomautukset"
@@ -350,7 +350,6 @@ fav_list_delete_fail = "Tapahtui virhe. Listaa ei poistettu."
 Favorites = "Suosikit"
 Fee = "Maksu"
 Feedback = "Palaute"
-Feedback Email = "Sähköpostiosoite palautteelle"
 feedback_name = "Nimi"
 File Description = "Tiedoston kuvaus"
 Filter = "Suodatin"
@@ -772,13 +771,13 @@ renew_all = "Uusi kaikki lainat"
 renew_determine_fail = "Ei tietoa uusintaoikeudesta. Ota yhteyttä kirjaston asiakaspalveluun."
 renew_empty_selection = "Yhtään lainaa ei valittu"
 renew_error = "Lainojasi ei voitu uusia. Ota yhteyttä kirjaston asiakaspalveluun."
-renew_fail = "Lainaa ei voitu uusia."
+renew_fail = "Lainaa ei voitu uusia"
 renew_item = "Uusi laina"
-renew_item_due = "Laina-aikaa jäljellä alle vuorokausi."
-renew_item_limit = "Tämän lainan uusimiskerrat ovat tulleet täyteen."
-renew_item_no = "Tätä lainaa ei voida uusia."
-renew_item_overdue = "Laina on myöhässä."
-renew_item_requested = "Toinen asiakas on varannut tämän kohteen."
+renew_item_due = "Laina-aikaa jäljellä alle vuorokausi"
+renew_item_limit = "Tämän lainan uusimiskerrat ovat tulleet täyteen"
+renew_item_no = "Tätä lainaa ei voida uusia"
+renew_item_overdue = "Laina on myöhässä"
+renew_item_requested = "Varattu toiselle asiakkaalle"
 renew_select_box = "Uusi laina"
 renew_selected = "Uusi valitut lainat"
 renew_success = "Uusiminen onnistui"
@@ -847,7 +846,7 @@ skip_confirm = "Haluatko varmasti ohittaa tämän vaiheen?"
 skip_fix_metadata = "Älä korjaa metadataa tällä kertaa."
 skip_step = "Ohita tämä vaihe"
 Slide = "Dia"
-sms_failure = "Virhe!  Viestiä ei voitu lähettää."
+sms_failure = "Virhe! Viestiä ei voitu lähettää."
 sms_phone_number = "Tekstiviestinumero"
 sms_sending = "Viestiä lähetetään..."
 sms_success = "Viesti lähetetty."
@@ -955,7 +954,7 @@ Title View = "Nimekenäkymä"
 title_hold_place = "Varaa teos"
 To = "Vastaanottaja"
 Too Many Email Recipients = "Liian monta sähköpostin vastaanottajaa"
-too_many_favorites = "Listaa ei voida näyttää yhdellä kertaa sen koon vuoksi.  Jaa suosikkisi useammalle listalle tai rajaa hakua käyttämällä tageja."
+too_many_favorites = "Listaa ei voida näyttää yhdellä kertaa sen koon vuoksi. Jaa suosikkisi useammalle listalle tai rajaa hakua käyttämällä tageja."
 too_many_new_items = "Kaikkia uutuuksia ei voida näyttää yhdellä listalla. Kokeile haun rajaamista."
 too_many_reserves = "Kaikkia kurssikirjoja ei voida näyttää yhdellä listalla. Kokeile haun rajaamista."
 top_facet_additional_prefix = "Lisää "
diff --git a/languages/fr.ini b/languages/fr.ini
index 01c6a00e86c82e4d776693fb173a1066e20b675f..6836c6e53465c1d9f4238113d0c2ac73b5934de9 100644
--- a/languages/fr.ini
+++ b/languages/fr.ini
@@ -276,7 +276,7 @@ eds_mode_smart = "Recherche intelligente"
 eds_modes_and_expanders = "Modes de recherche et rebonds"
 Electronic = "Électronique"
 Email = "Courriel"
-Email Address = "adresse e-mail"
+Email Address = "adresse email"
 Email address is invalid = "Cette adresse de courriel n'est pas valide"
 Email Record = "Envoyer la notice par courriel"
 Email this = "Envoyer ceci"
@@ -338,7 +338,6 @@ fav_list_delete_fail = "Désolé, une erreur est survenue. Votre liste n'a pas 
 Favorites = "Favoris"
 Fee = "Tarifs"
 Feedback = "Commentaire"
-Feedback Email = "Commentaire par courriel"
 feedback_name = "Nom"
 Filter = "Filtre"
 filter_tags = "Filtrer les mots-clés"
@@ -520,7 +519,7 @@ Library Web Search = "Recherche sur le site de la bibliothèque"
 lightbox_error = "Erreur: impossible d'ouvrir la pop-up"
 Limit To = "Limiter à"
 List = "Liste"
-List Tags = "Liste des  mots-clés"
+List Tags = "Liste des mots-clés"
 list_access_denied = "Vous n'avez pas les droits pour consulter cette liste."
 list_edit_name_required = "Le nom de la liste est obligatoire."
 load_tag_error = "Erreur: Chargement des tags impossible"
diff --git a/languages/he.ini b/languages/he.ini
index 054280b6f0ecf07abff1f9c2f85eca63ca393aa1..2b5d1009022f540e12785dabbc9c123a10ef9406 100644
--- a/languages/he.ini
+++ b/languages/he.ini
@@ -231,7 +231,7 @@ email_failure = "שגיאה -- לא ניתן לשלוח הודעה"
 email_link = "קישור"
 email_selected = "דואל נבחרים"
 email_selected_favorites = "דואל מועדפים נבחרים"
-email_sending = "שולח הודעה  ..."
+email_sending = "שולח הודעה ..."
 email_subject = "נושא"
 email_success = "הודעה משולח"
 Empty = "ריק"
diff --git a/languages/it.ini b/languages/it.ini
index a4aa27af74d3935b8fe1c0d839c00618dca8e328..451ff0055ae50f13daaf071dcddd8c2b8a845739 100644
--- a/languages/it.ini
+++ b/languages/it.ini
@@ -351,7 +351,6 @@ fav_list_delete_fail = "Ops, si è verificato un errore. La tua lista non è sta
 Favorites = "Elementi salvati"
 Fee = "Tariffa"
 Feedback = "Feedback"
-Feedback Email = "Email"
 feedback_name = "Nome"
 File Description = "Descrizione del file"
 Filter = "Filtra"
@@ -940,7 +939,7 @@ test_fix = "Ripara"
 test_ok = "OK"
 Text this = "Invia SMS"
 Thank you for your feedback. = "Grazie per averci inviato il tuo parere."
-That email address is already used = "L'indirizzo e-mail è già in uso"
+That email address is already used = "L'indirizzo email è già in uso"
 That username is already taken = "Lo username è già in uso"
 The record you selected is not part of any of your lists. = "Il record selezionato non fa parte di nessuna delle nostre liste."
 The record you selected is not part of the selected list. = "Il record selezionato non fa parte della lista selezionata."
diff --git a/languages/ja.ini b/languages/ja.ini
index 071d1a3082cdee2cb64a186e513310e034d1bcb0..be814a0e65fe6f579724d5d826b879aa359f6e8a 100644
--- a/languages/ja.ini
+++ b/languages/ja.ini
@@ -352,7 +352,6 @@ fav_list_delete_fail = "エラーが発生したので、リストを削除で
 Favorites = "お気に入り"
 Fee = "料金"
 Feedback = "ご意見"
-Feedback Email = "メールアドレス"
 feedback_name = "お名前"
 File Description = "ファイル記述"
 Filter = "フィルター"
@@ -849,7 +848,7 @@ skip_confirm = "本当にこのステップを省略しますか?"
 skip_fix_metadata = "今回はメタデータを修正しない"
 skip_step = "このステップを省略"
 Slide = "スライド"
-sms_failure = "エラー!  メッセージを送れませんでした。"
+sms_failure = "エラー! メッセージを送れませんでした。"
 sms_phone_number = "10桁の電話番号"
 sms_sending = "メッセージ送信中..."
 sms_success = "メッセージを送信しました。"
diff --git a/languages/nl.ini b/languages/nl.ini
index 82dbd69af8a522faea8106eb4d8d7a95a38647d0..c0823be8d0c56356a3a9ba1f8a7e3b67220b2c4a 100644
--- a/languages/nl.ini
+++ b/languages/nl.ini
@@ -54,7 +54,7 @@ All Fields = "Alle velden"
 All Pages Loaded = "Alle pagina's zijn ingeladen"
 All Text = "Alle tekst"
 alphabrowse_matches = "Resultaten"
-alphabrowselink_html = "Doorblader de catalogus  met %%index%% beginnend vanaf %%from%%."
+alphabrowselink_html = "Doorblader de catalogus met %%index%% beginnend vanaf %%from%%."
 An error has occurred = "Er is een fout opgetreden"
 An error occurred during execution; please try again later. = "Er trad een fout op tijdens de uitvoering; probeer het later nog eens."
 AND = "AND"
@@ -290,10 +290,10 @@ eds_mode_bool = "Booleaans/Zin"
 eds_mode_smart = "SmartText Zoeken"
 eds_modes_and_expanders = "Zoekmodi en uitbreidingen"
 Electronic = "Elektronisch"
-Email = "E-mail"
-Email Address = "E-mail Adres"
-Email address is invalid = "E-mail adres is ongeldig"
-Email Record = "E-mail Record"
+Email = "Email"
+Email Address = "Email Adres"
+Email address is invalid = "Email adres is ongeldig"
+Email Record = "Email Record"
 Email this = "Versturen"
 Email this Search = "Zoekopdracht versturen"
 email_failure = "Foutmelding - Bericht kan niet worden verzonden"
@@ -353,7 +353,6 @@ fav_list_delete_fail = "Sorry, er is een fout opgetreden. Jouw lijst werd niet g
 Favorites = "Favorieten"
 Fee = "Bijdrage"
 Feedback = "Feedback"
-Feedback Email = "Feedback e-mail"
 feedback_name = "Naam"
 File Description = "Bestandsbeschrijving"
 Filter = "Filter"
@@ -499,8 +498,8 @@ Interlibrary Loan Requests = "IBL aanvraag"
 Internet = "Internet"
 Invalid Patron Login = "Ongeldige gebruikerslogin"
 Invalid phone number. = "Ongeldig telefoonnummer"
-Invalid Recipient Email Address = "E-mailadres van de ontvanger is ongeldig"
-Invalid Sender Email Address = "E-mailadres van de zender is ongeldig"
+Invalid Recipient Email Address = "Emailadres van de ontvanger is ongeldig"
+Invalid Sender Email Address = "Emailadres van de zender is ongeldig"
 ISBN = "ISBN"
 ISBN/ISSN = "ISBN/ISSN"
 ISSN = "ISSN"
@@ -563,7 +562,7 @@ Location = "Plaats"
 Log Out = "Uitloggen"
 Login = "Aanmelden"
 Login for full access = "Log in voor complete toegang."
-login_disabled = "Je login is momenteel niet beschikbaar."medium  = "Fysische informatiedrager"
+login_disabled = "Je login is momenteel niet beschikbaar."medium = "Fysische informatiedrager"
 login_target = "Bibliotheek"
 Logout = "Afmelden"
 Main Author = "Hoofdauteur"
@@ -751,7 +750,7 @@ recaptcha_not_passed = "Onjuiste CAPTCHA"
 Record Citations = "Record citatie"
 Record Count = "Aantal records"
 Recover Account = "Herstel je account"
-recovery_by_email = "Herstel met behulp van je e-mail"
+recovery_by_email = "Herstel met behulp van je email"
 recovery_by_username = "Herstel met behulp van je gebruikersnaam"
 recovery_disabled = "Wachtwoord herstellen niet geactiveerd"
 recovery_email_notification = "Er werd zonet verzocht het wachtwoord voor account van %%bibliotheek%% te herstellen."
@@ -942,7 +941,7 @@ test_fix = "Oplossen"
 test_ok = "OK"
 Text this = "SMS dit"
 Thank you for your feedback. = "Bedankt voor je feedback"
-That email address is already used = "Dat e-mail adres wordt reeds gebruikt"
+That email address is already used = "Dat email adres wordt reeds gebruikt"
 That username is already taken = "Deze gebruikersnaam is al in gebruik"
 The record you selected is not part of any of your lists. = "Het door jou geselecteerde record maakt geen deel uit van [een van] jouw lijst(en)."
 The record you selected is not part of the selected list. = "Het door jou geselecteerde record maakt geen deel uit van de geselecteerde lijst."
@@ -957,7 +956,7 @@ Title not available = "Titel niet beschikbaar"
 Title View = "Titel"
 title_hold_place = "Plaats een aanvraag op een titel"
 To = "Aan"
-Too Many Email Recipients = "Te veel e-mail geadresseerden"
+Too Many Email Recipients = "Te veel email geadresseerden"
 too_many_favorites = "Deze lijst is te lang om in één keer te tonen. Probeer je favorieten in verschillende lijsten te ordenen of gebruik tags."
 too_many_new_items = "Zoveel nieuwe items kunnen niet getoond worden in één lijst. Probeer je zoekopdracht specifieker te maken."
 too_many_reserves = "Er zijn teveel resultaten om in één lijst te tonen. Beperk je zoekopdracht."
diff --git a/languages/pl.ini b/languages/pl.ini
index 36cea31202df790f7e35c8da39604b096c858a20..9835c2558393867dccaf7012518d1078e0919613 100644
--- a/languages/pl.ini
+++ b/languages/pl.ini
@@ -21,8 +21,8 @@
 ;Changed Profile = "Nowe dane osobowe"
 ;Deadline = "Termin zwrotu"
 ;Emailprofile = "Aktualizacja danych osobowych"
-;email_from = "od (e-mail)"
-;email_to = "do (e-mail)"
+;email_from = "od (email)"
+;email_to = "do (email)"
 ;Failed to create request = "Zamówienie oraz rezerwacja niezrealizowana"
 ;feedback_duplicate = "Podwójny feedback. Spróbuj jeszcze raz."
 ;feedback_duplicate_issue = "Feedback z tym tytułem już istnieje"
@@ -164,8 +164,8 @@ Book Cover = "Okładka"
 bookbag_confirm_empty = "Czy chcesz wyczyścić zawartość listy podręcznej?"
 bookbag_delete = "Usuń zaznaczone książki z listy podręcznej"
 bookbag_delete_selected = "Usuń zaznaczone książki"
-bookbag_email = "Wwyślij zaznaczone książki z listy podręcznej e-mailem"
-bookbag_email_selected = "Wyślij zaznaczone książki e-mailem"
+bookbag_email = "Wwyślij zaznaczone książki z listy podręcznej emailem"
+bookbag_email_selected = "Wyślij zaznaczone książki emailem"
 bookbag_export = "Eksportuj zaznaczone książki z listy podręcznej"
 bookbag_export_selected = "Eksportuj zaznaczone książki"
 bookbag_full = "Pełny"
@@ -350,18 +350,18 @@ eds_mode_bool = "Boolean / fraza"
 eds_mode_smart = "Wyszukiwanie SmartText"
 eds_modes_and_expanders = "Tryby wyszukiwania i expandery"
 Electronic = "Elektroniczne"
-Email = "E-mail"
-Email Address = "E-mail"
+Email = "Email"
+Email Address = "Email"
 Email address is invalid = "E-Mail jest nieważny"
-Email Record = "Wyślij e-mailem"
-Email this = "Wyślij e-mailem"
-Email this Search = "Wyślij rezultaty e-mailem"
+Email Record = "Wyślij emailem"
+Email this = "Wyślij emailem"
+Email this Search = "Wyślij rezultaty emailem"
 email_failure = "Błąd: Nie udało się wysłać wiadomości."
-email_link = "e-mail"
+email_link = "email"
 email_maximum_recipients_note = "Najwyżej %%max%% adresatów jest dozwolone."
 email_multiple_recipients_note = "Można podać większą liczbę adresatów oddzielonych przecinkami."
-email_selected = "Wyślij zaznaczone książki przez e-maila"
-email_selected_favorites = "Wyślij zaznaczone ulubione książki przez e-maila"
+email_selected = "Wyślij zaznaczone książki przez emaila"
+email_selected_favorites = "Wyślij zaznaczone ulubione książki przez emaila"
 email_sending = "Wysyłka w trakcie..."
 email_subject = "Hasło przedmiotowe"
 email_success = "Wiadomość wysyłana"
@@ -403,9 +403,9 @@ fav_delete_fail = "Błąd: Nie udało się usunąć zaznaczonych ulubionych ksi
 fav_delete_missing = "Brak danych. Nie udało się usunąć zaznaczonych ulubionych książek."
 fav_delete_success = "Zaznaczone ulubione książki zostały usunięte."
 fav_delete_warn = "Czy chcesz usunąć zaznaczone ulubione książki z wszystkich list? Jak chcesz je usunąć tylko z jednej listy, wybierz odpowiednią listę."
-fav_email_fail = "Błąd: Nie udało się wysłać zaznaczonych ulubionych książek przez e-maila."
-fav_email_missing = "Brak danych. Nie udało się wysłać zaznaczonych ulubionych książek przez e-maila."
-fav_email_success = "Zaznaczone ulubione książki zostały wysłane przez e-maila."
+fav_email_fail = "Błąd: Nie udało się wysłać zaznaczonych ulubionych książek przez emaila."
+fav_email_missing = "Brak danych. Nie udało się wysłać zaznaczonych ulubionych książek przez emaila."
+fav_email_success = "Zaznaczone ulubione książki zostały wysłane przez emaila."
 fav_export = "Eksportuj ulubione książki"
 fav_list_delete = "Lista ulubionych książek została usunięta."
 fav_list_delete_cancel = "Nie udało się usunąć listy ulubionych książek."
@@ -413,7 +413,6 @@ fav_list_delete_fail = "Błąd: Nie udało się usunąć listy."
 Favorites = "Ulubione książki"
 Fee = "Opłata"
 Feedback = "Feedback"
-Feedback Email = "E-mail nadawcy"
 feedback_name = "Nazwisko"
 File Description = "Opis pliku"
 Filter = "filtr"
@@ -481,7 +480,7 @@ hold_cancel = "Anuluj zamówienia i rezerwacje"
 hold_cancel_all = "Anuluj wszystkie"
 hold_cancel_fail = "Nie udało się anulować zamówienia lub rezerwacji - skontaktuj się z biblioteką."
 hold_cancel_selected = "Anuluj zaznaczone"
-hold_cancel_success = "Zamówienia i rezerwacje  zostały anulowane."
+hold_cancel_success = "Zamówienia i rezerwacje zostały anulowane."
 hold_cancel_success_items = "Zamówienia i rezerwacje zostały anulowane."
 hold_date_invalid = "Podaj ważną datę"
 hold_date_past = "Podaj datę w przyszłości"
@@ -514,7 +513,7 @@ ill_request_cancel = "Anuluj zamówienie międzybiblioteczne"
 ill_request_cancel_all = "Anuluj wszystkie zamówienia międzybiblioteczne"
 ill_request_cancel_fail = "Nie udało się anulować zamówienia lub rezerwacji - skontaktuj się z biblioteką."
 ill_request_cancel_selected = "Anuluj zaznaczone zamówienia międzybiblioteczne"
-ill_request_cancel_success = "Zamówienia i rezerwacje  zostały anulowane."
+ill_request_cancel_success = "Zamówienia i rezerwacje zostały anulowane."
 ill_request_cancel_success_items = "Zamówienia i rezerwacje zostały anulowane."
 ill_request_canceled = "Anulowane"
 ill_request_check_text = "Sprawdź zamówienia międzybiblioteczne"
@@ -559,8 +558,8 @@ Interlibrary Loan Requests = "Zamówienia międzybiblioteczne"
 Internet = "Internet"
 Invalid Patron Login = "Nieważna nazwa użytkownika"
 Invalid phone number. = "Nieważny numer telefonu"
-Invalid Recipient Email Address = "Nieważny e-mail adresata"
-Invalid Sender Email Address = "Nieważny e-mail nadawcy"
+Invalid Recipient Email Address = "Nieważny email adresata"
+Invalid Sender Email Address = "Nieważny email nadawcy"
 ISBN = "ISBN"
 ISBN/ISSN = "ISBN / ISSN"
 ISSN = "ISSN"
@@ -811,11 +810,11 @@ recaptcha_not_passed = "CAPTCHA nie zweryfikowany"
 Record Citations = "Cytaty zapisu"
 Record Count = "Ilość zapisów"
 Recover Account = "Odzyskaj konto"
-recovery_by_email = "Odzyskaj przez e-mail"
+recovery_by_email = "Odzyskaj przez email"
 recovery_by_username = "Odzyskaj przez nazwę użytkownika"
 recovery_disabled = "Odzyskania hasła nie umożliwiono"
 recovery_email_notification = "Żądanie odzyskania hasła do konta bibliotecznego %%library%% zostało odrzucone."
-recovery_email_sent = "Instrukcje odzyskiwania hasła zostały wysłane na adres e-mail zarejestrowany na tym koncie."
+recovery_email_sent = "Instrukcje odzyskiwania hasła zostały wysłane na adres email zarejestrowany na tym koncie."
 recovery_email_subject = "Odzyskiwanie konta VuFind"
 recovery_email_url_pretext = "Otwórz ten adres URL, aby ustalić nowe hasło: %%url%%"
 recovery_expired_hash = "Link do odzyskania hasła wygasł"
@@ -942,7 +941,7 @@ storage_retrieval_request_cancel = "Anuluj zamówienia magazynowe"
 storage_retrieval_request_cancel_all = "Anuluj wszystkie zamówienia magazynowe"
 storage_retrieval_request_cancel_fail = "Nie udało się anulować zamówienia lub rezerwacji - skontaktuj się z biblioteką."
 storage_retrieval_request_cancel_selected = "Anuluj zaznaczone zamówienia magazynowe"
-storage_retrieval_request_cancel_success = "Zamówienia i rezerwacje  zostały anulowane."
+storage_retrieval_request_cancel_success = "Zamówienia i rezerwacje zostały anulowane."
 storage_retrieval_request_cancel_success_items = "Zamówienia i rezerwacje zostały anulowane."
 storage_retrieval_request_canceled = "Anuluj"
 storage_retrieval_request_check_text = "Sprawdź zamówienie magazynowe"
diff --git a/languages/pt-br.ini b/languages/pt-br.ini
index e05ab05a7c0196079397926a0c66681632f5da7a..9632a2af36be7482f330e6e8b69436d89f3e5fa3 100644
--- a/languages/pt-br.ini
+++ b/languages/pt-br.ini
@@ -6,7 +6,7 @@ Access URL = "Acessar a URL"
 Accession Number = "Número de chamada"
 Account = "Conta"
 Add = "Adicionar"
-Add a Library Card = "Adicionar Cartão de  Biblioteca"
+Add a Library Card = "Adicionar Cartão de Biblioteca"
 Add a Note = "Adicionar uma nota"
 Add Tag = "Adicionar Tag"
 Add Tags = "Adicionar Tags"
@@ -102,8 +102,8 @@ Book Cover = "Capa do livro"
 bookbag_confirm_empty = "Tem a certeza que quer esvaziar a sua cesta?"
 bookbag_delete = "Apagar os registros selecionados da cesta"
 bookbag_delete_selected = "Apagar os registros selecionados"
-bookbag_email = "Mandar por e-mail os registros contidos na cesta"
-bookbag_email_selected = "Mandar por e-mail os selecionados"
+bookbag_email = "Mandar por email os registros contidos na cesta"
+bookbag_email_selected = "Mandar por email os selecionados"
 bookbag_export = "Exportar os registros contidos na cesta"
 bookbag_export_selected = "Exportar os registros selecionados"
 bookbag_full = "Cheio"
@@ -131,9 +131,9 @@ browse_lcc = "Call Number (LC)"
 browse_publishDate = "Ano de Publicação"
 browse_title = "Título"
 browse_topic = "Assunto"
-bulk_email_success = "O(s) item(ns) foram enviados por e-mail"
+bulk_email_success = "O(s) item(ns) foram enviados por email"
 bulk_email_title = "Itens do Catálogo da Biblioteca"
-bulk_error_missing = "Alguns dados estavam faltando. Seu pedido não foi bem sucedida."
+bulk_error_missing = "Alguns dados estavam faltando. Seu pedido não foi bem-sucedida."
 bulk_export_not_supported = "Pedimos desculpa: a sua lista contém registros dos quais o sistema ainda não permite fazer a exportação. Dentro em breve, esta funcionalidade estará 100% operacional. Obrigado pela sua compreensão!"
 bulk_fail = "Desculpe, ocorreu um erro. Por favor, tente novamente."
 bulk_noitems_advice = "Nenhum item foi selecionado. Por favor, clique na caixa de seleção ao lado de um item e tente novamente."
@@ -185,6 +185,7 @@ citation_singlepage_abbrev = "P."
 citation_volume_abbrev = "Vol."
 Cite this = "Citar"
 City = "Cidade"
+Clear = "Limpar"
 clear_tag_filter = "Limpar filtro"
 close = "fechar"
 Code = "Código"
@@ -202,7 +203,7 @@ Company/Entity = "Companhia/Entidade"
 Configuration = "Configuração"
 confirm_delete = "Tem certeza que quer apagar este usuário?"
 confirm_delete_brief = "Apagar registro?"
-confirm_delete_library_card_brief = "Remover Cartão de  Biblioteca Library Card?"
+confirm_delete_library_card_brief = "Remover Cartão de Biblioteca?"
 confirm_delete_library_card_text = "Tem certeza que deseja remover este cartão de biblioteca?"
 confirm_delete_list_brief = "Apagar a Lista?"
 confirm_delete_list_text = "Tem certeza que quer apagar esta lista?"
@@ -287,19 +288,19 @@ eds_mode_any = "Encontrar algum dos termos"
 eds_mode_bool = "Booleano/frase"
 eds_mode_smart = "Busca com algorítmo SmartText"
 eds_modes_and_expanders = "Modos de Busca e expansores"
-Electronic = "Recurso Electrónico"
-Email = "E-mail"
-Email Address = "Endereço de e-mail"
-Email address is invalid = "E-mail inválido"
-Email Record = "Gravar e-mail"
-Email this = "Enviar por e-mail"
-Email this Search = "Enviar busca por e-mail"
+Electronic = "Recurso Eletrônico"
+Email = "Email"
+Email Address = "Endereço de email"
+Email address is invalid = "Email inválido"
+Email Record = "Gravar email"
+Email this = "Enviar por email"
+Email this Search = "Enviar busca por email"
 email_failure = "Erro - Mensagem não pode ser enviada"
 email_link = "Link"
 email_maximum_recipients_note = "No máximo %%max%% destinatários são permitidos."
 email_multiple_recipients_note = "Você pode especificar múltiplos destinatários separados por vírgulas."
-email_selected = "E-mail selec."
-email_selected_favorites = "E-mail os Favoritos selecionados"
+email_selected = "Email selecionado"
+email_selected_favorites = "Email os Favoritos selecionados"
 email_sending = "A enviar a mensagem..."
 email_subject = "Assunto"
 email_success = "Mensagem Enviada"
@@ -341,9 +342,9 @@ fav_delete_fail = "Desculpe, ocorreu um erro. Os seu(s) favorito(s) não foram a
 fav_delete_missing = "Alguns dados foram perdidos. Os seu(s) favorito(s) não foram apagados."
 fav_delete_success = "Favorito(s) apagado(s)."
 fav_delete_warn = "Você está prestes a apagar os favoritos a partir de todas as suas listas - Se você quiser apagar favoritos a partir de uma lista específica, selecione a lista antes de clicar em apagar."
-fav_email_fail = "Desculpe, ocorreu um erro. Favorito (s) não enviado(s) por e-mail."
-fav_email_missing = "Alguns dados foram perdidos. Favorito (s) não enviado(s) por e-mail."
-fav_email_success = "Favorito(s) enviado(s) por e-mail conforme solicitado."
+fav_email_fail = "Desculpe, ocorreu um erro. Favorito(s) não enviado(s) por email."
+fav_email_missing = "Alguns dados foram perdidos. Favorito(s) não enviado(s) por email."
+fav_email_success = "Favorito(s) enviado(s) por email conforme solicitado."
 fav_export = "Exportar Favoritos"
 fav_list_delete = "Lista de favoritos apagada"
 fav_list_delete_cancel = "Lista não apagada"
@@ -351,7 +352,6 @@ fav_list_delete_fail = "Desculpe, ocorreu um erro. Lista não eliminada."
 Favorites = "Itens Guardados"
 Fee = "Multas"
 Feedback = "Comentário"
-Feedback Email = "E-mail"
 feedback_name = "Nome"
 File Description = "Descrição de arquivo"
 Filter = "Filtro"
@@ -368,7 +368,7 @@ First = "Primeiro"
 First Name = "Primeiro nome"
 fix_metadata = "Sim, corrigir os metadados, eu espero"
 for search = "para a busca"
-Forgot Password = "Esqueceu sua senha"
+Forgot Password = "Esqueci minha senha"
 Form Submitted! = "Comentário enviado!"
 Format = "Formato"
 found = "Encontrado"
@@ -377,7 +377,7 @@ Full description = "ver descrição completa"
 Full text is not displayed to guests = "Texto completo não é apresentado para usuários convidados (não logados)."
 fulltext_limit = "Limitar a artigos com texto completo disponível"
 Genre = "Gênero"
-Geographic Terms = "Termos Geograficos"
+Geographic Terms = "Termos Geográficos"
 Geography = "Geografia"
 Get full text = "Obter o texto integral"
 Get RSS Feed = "Obter Feed RSS"
@@ -425,14 +425,14 @@ hold_date_invalid = "Por favor, introduza uma data válida"
 hold_date_past = "Por favor, introduza uma data no futuro"
 hold_empty_selection = "Não selecionou nenhuma reserva"
 hold_error_blocked = "Os seus privilégios não lhe permitem colocar uma reserva sobre este exemplar"
-hold_error_fail = "O seu pedido não foi bem sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional"
+hold_error_fail = "O seu pedido não foi bem-sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional"
 hold_invalid_pickup = "Não introduziu um local de levantamento válido; por favor, tente novamente"
 hold_invalid_request_group = "Um pedido inválido foi entrado. Por favor tente novamente"
 hold_login = "para informação da reserva e levantamento"
 hold_place = "Reservar"
-hold_place_fail_missing = "O seu pedido não foi bem sucedido: é necessário introduzir mais dados; por favor, contate o Balcão de Atendimento para ajuda adicional"
+hold_place_fail_missing = "O seu pedido não foi bem-sucedido: é necessário introduzir mais dados; por favor, contate o Balcão de Atendimento para ajuda adicional"
 hold_place_success_html = "O seu pedido foi salvo com sucesso. <a href="%%url%%">As suas Reservas e Pedidos</a>."
-hold_profile_html = "Para reservas e devoluções, por favor estabelecer sua <a href="%%url%%">Perfil no Catálogo da Biblioteca</a>."
+hold_profile_html = "Para reservas e devoluções, por favor estabeleça seu <a href="%%url%%">Perfil no Catálogo da Biblioteca</a>."
 hold_queue_position = "Posição na fila"
 hold_request_group = "Pedido de"
 hold_requested_group = "Requisitado por"
@@ -461,14 +461,14 @@ ill_request_date_invalid = "Por favor, insira uma data válida"
 ill_request_date_past = "Por favor, insira uma data no futuro"
 ill_request_empty_selection = "Nenhum pedido de débito interbiblioteca foi selecionado"
 ill_request_error_blocked = "Não possui privilégios suficiente para colocar um pedido de débito interbiblioteca para este item"
-ill_request_error_fail = "O seu pedido não foi bem sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional"
+ill_request_error_fail = "O seu pedido não foi bem-sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional"
 ill_request_error_technical = "Sua solicitação falhou devido a um erro do sistema. Por favor, entre em contato com o balcão de circulação para obter mais assistência"
 ill_request_error_unknown_patron_source = "Conta do usuário da biblioteca não identificado para pedido de débito interbiblioteca."
 ill_request_in_transit = "Em trânsito para Coletar Localização"
 ill_request_invalid_pickup = "Não introduziu um local de levantamento válido; por favor, tente novamente"
 ill_request_pick_up_library = "Coletar Biblioteca"
 ill_request_pick_up_location = "Coletar Localização"
-ill_request_place_fail_missing = "O seu pedido não foi bem sucedido: é necessário introduzir mais dados; por favor, contate o Balcão de Atendimento para ajuda adicional"
+ill_request_place_fail_missing = "O seu pedido não foi bem-sucedido: é necessário introduzir mais dados; por favor, contate o Balcão de Atendimento para ajuda adicional"
 ill_request_place_success = "O seu pedido foi salvo com sucesso"
 ill_request_place_text = "Colocar um Pedido de Débito Interbiblioteca"
 ill_request_processed = "Processado"
@@ -497,8 +497,8 @@ Interlibrary Loan Requests = "Pedido de Débito Interbiblioteca"
 Internet = "Internet"
 Invalid Patron Login = "Login Inválido do Usuário"
 Invalid phone number. = "Número de telefone inválido."
-Invalid Recipient Email Address = "E-mail inválido de destinatário"
-Invalid Sender Email Address = "E-mail inválido de Remetente"
+Invalid Recipient Email Address = "Email inválido de destinatário"
+Invalid Sender Email Address = "Email inválido de Remetente"
 ISBN = "ISBN"
 ISBN/ISSN = "ISBN/ISSN"
 ISSN = "ISSN"
@@ -627,7 +627,7 @@ nohit_parse_error = "Parece haver um problema com a sua busca. Por favor, verifi
 nohit_prefix = "A sua busca"
 nohit_spelling = "Talvez deva tentar algumas variações de ortografia"
 nohit_suffix = "não corresponde a nenhum registro."
-nohit_suggest = "Poderá querer rever sua equação de busca retirando alguns termos ou verificando a ortografia."
+nohit_suggest = "Você pode revisar a sua busca retirando alguns termos ou verificando a ortografia."
 NOT = "NÃO"
 Not Illustrated = "Não Ilustrado"
 Not On Reserve = "Não reservado"
@@ -752,7 +752,7 @@ Recover Account = "Recuperar Conta"
 recovery_by_email = "Recuperar por email"
 recovery_by_username = "Recuperar pela identificação do usuário"
 recovery_disabled = "Recuperação de senha não disponível"
-recovery_email_notification = "Um pedido foi feito para recuperar a senha para a conta com  %%library%%."
+recovery_email_notification = "Um pedido foi feito para recuperar a senha para a conta com %%library%%."
 recovery_email_sent = "Instruções para recuperação de senha foi enviada para o endereço de Email registrado na conta."
 recovery_email_subject = "Recuperação de Conta VuFind"
 recovery_email_url_pretext = "Por favor navegue para esta URL para colocar uma nova senha: %%url%%"
@@ -889,10 +889,10 @@ storage_retrieval_request_date_invalid = "Por favor, insira uma data válida"
 storage_retrieval_request_date_past = "Por favor, insira uma data no futuro"
 storage_retrieval_request_empty_selection = "Nenhum pedido de recuperação armazenado foi selecionado"
 storage_retrieval_request_error_blocked = "Não possui privilégios suficientes para colocar um pedido de recuperação armazenamento neste item"
-storage_retrieval_request_error_fail = "O seu pedido não foi bem sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional"
+storage_retrieval_request_error_fail = "O seu pedido não foi bem-sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional"
 storage_retrieval_request_invalid_pickup = "Não introduziu um local de levantamento válido; por favor, tente novamente"
 storage_retrieval_request_issue = "Data"
-storage_retrieval_request_place_fail_missing = "O seu pedido não foi bem sucedido: é necessário introduzir mais dados; por favor, contate o Balcão de Atendimento para ajuda adicional"
+storage_retrieval_request_place_fail_missing = "O seu pedido não foi bem-sucedido: é necessário introduzir mais dados; por favor, contate o Balcão de Atendimento para ajuda adicional"
 storage_retrieval_request_place_success = "O seu pedido foi salvo com sucesso"
 storage_retrieval_request_place_text = "Colocar um pedido de recuperação armazenada"
 storage_retrieval_request_processed = "Processado"
@@ -919,19 +919,20 @@ summon_database_recommendations = "Pode encontrar recursos adicionais aqui:"
 Supplements = "Suplementos"
 Supplied by Amazon = "Fornecido pela Amazon"
 Switch view to = "Alterar a visualização para"
+switchquery_fuzzy = "Fazer uma busca fuzzy pode resultar em termos de grafias semelhantes"
 switchquery_intro = "Você pode obter mais resultados ajustando o argumento de busca."
 switchquery_lowercasebools = "Caso esteja tentando utilizar os operadores booleanos, deve escrevê-los em Letras MAIÚSCULAS"
 switchquery_truncatechar = "Reduza sua consulta de pesquisa para ampliar seus resultados"
-switchquery_unwantedbools = "As palabras AND, OR e NOT pode ocasionar problemas na busca; tente utilizar as aspas"
+switchquery_unwantedbools = "As palavras AND, OR e NOT pode ocasionar problemas na busca; tente utilizar as aspas"
 switchquery_unwantedquotes = "Remover as aspas pode possibilitar buscas mais amplas"
-switchquery_wildcard = "Adicionar um caractere curinga pode recuperar variações da palavra buscada"
+switchquery_wildcard = "Adicionar um caractere coringa pode recuperar variações da palavra buscada"
 System Unavailable = "Sistema indisponível"
 Table of Contents = "Sumário"
 Table of Contents unavailable = "Índice indisponível"
 Tag = "Tag"
 Tag Management = "Gerenciamento de tag"
 tag_delete_filter = "Você está utilizando o(s) seguinte(s) filtro(s) - Nome: %username%, Tag: %tag%, Recurso: %resource%"
-tag_delete_warning = "Cuidado! Você está preste a deletar %count% tag(s) de recurso(s)"
+tag_delete_warning = "Cuidado! Você está prestes a deletar %count% tag(s) de recurso(s)"
 tag_filter_empty = "Nenhuma tag está disponível para este filtro"
 Tags = "Tags"
 tags_deleted = "Deletada %count% tag(s)"
@@ -940,13 +941,13 @@ test_fix = "Corrigir"
 test_ok = "OK"
 Text this = "Enviar por SMS"
 Thank you for your feedback. = "Obrigado por ter compartilhado a sua opinião."
-That email address is already used = "Endereço de e-mail já em uso"
+That email address is already used = "Endereço de email já em uso"
 That username is already taken = "Nome do Usuário já em uso"
 The record you selected is not part of any of your lists. = "O registro selecionado não faz parte de nenhuma das listas."
 The record you selected is not part of the selected list. = "O registro selecionado não faz parte da lista selecionada."
 The system is currently unavailable due to system maintenance = "O sistema está indisponível devido a manutenção do sistema"
 Theme = "Tema"
-This email was sent from = "E-mail enviado a partir de"
+This email was sent from = "Email enviado a partir de"
 This field is required = "Campo obrigatório"
 This item is already part of the following list/lists = "Este exemplar já faz parte da seguinte lista(s)"
 This result not is displayed to guests = "Este resultado não é apresentado para usuários convidados (não logados)."
@@ -971,7 +972,7 @@ total_saved_items = "Total de itens salvados"
 total_tags = "Total de tags"
 total_users = "Total de Usuários"
 Transliterated Title = "Título Transliterado"
-tree_search_limit_reached_html = "A sua busca devolveu muitos resultados para mostrar em árvore. Mostrando apenas o primeiro  <b>%%limit%%</b> registros. Para uma busca completa clique <a id="fullSearchLink" href="%%url%%" target="_blank">aqui.</a>"
+tree_search_limit_reached_html = "A sua busca devolveu muitos resultados para mostrar em árvore. Mostrando apenas os primeiros <b>%%limit%%</b> registros. Para uma busca completa clique <a id="fullSearchLink" href="%%url%%" target="_blank">aqui.</a>"
 unique_tags = "Tags únicas"
 University Library = "Biblioteca Universitária"
 Unknown = "online"
diff --git a/languages/pt.ini b/languages/pt.ini
index cc75e8c272902e66b06bd97007001d9de2038138..0096602a45f26e09768f76294ac8f190668f865a 100644
--- a/languages/pt.ini
+++ b/languages/pt.ini
@@ -125,7 +125,7 @@ browse_lcc = "Call Number (LC)"
 browse_publishDate = "Ano de Publicação"
 browse_title = "Título"
 browse_topic = "Assunto"
-bulk_email_success = "O(s) item(ns) foram enviados por e-mail"
+bulk_email_success = "O(s) item(ns) foram enviados por email"
 bulk_email_title = "Exemplares do Catálogo da Biblioteca"
 bulk_error_missing = "Alguns dados estava faltando. Seu pedido não foi bem sucedida."
 bulk_export_not_supported = "Pedimos desculpa: a sua lista contém registos dos quais o sistema ainda não permite fazer a exportação. Dentro em breve, esta funcionalidade estará 100% operacional. Obrigado pela sua compreensão!"
@@ -276,18 +276,18 @@ eds_mode_bool = "Booleana / Frase"
 eds_mode_smart = "Pesquisa SmartText"
 eds_modes_and_expanders = "Modos de pesquisa e expansores"
 Electronic = "Recurso Electrónico"
-Email = "E-mail"
-Email Address = "Endereço de e-mail"
+Email = "Email"
+Email Address = "Endereço de email"
 Email address is invalid = "Email inválido"
 Email Record = "Gravar-mail"
-Email this = "Enviar por e-mail"
-Email this Search = "Enviar pesquisa por e-mail"
+Email this = "Enviar por email"
+Email this Search = "Enviar pesquisa por email"
 email_failure = "Erro - Mensagem não pode ser enviada"
 email_link = "Link"
 email_maximum_recipients_note = "No máximo, são permitidos %%max%% destinatários."
 email_multiple_recipients_note = "Você pode especificar vários destinatários separados por vírgulas."
-email_selected = "E-mail selec."
-email_selected_favorites = "E-mail os Favoritos seleccionados"
+email_selected = "Email selec."
+email_selected_favorites = "Email os Favoritos seleccionados"
 email_sending = "A enviar a mensagem..."
 email_subject = "Assunto"
 email_success = "Mensagem Enviada"
@@ -339,7 +339,6 @@ fav_list_delete_fail = "Desculpe, ocorreu um erro. Lista não eliminada."
 Favorites = "Favoritos"
 Fee = "Multas"
 Feedback = "Comentário"
-Feedback Email = "E-mail"
 feedback_name = "Nome"
 Filter = "Filtro"
 filter_tags = "Filtro de Trags"
@@ -483,8 +482,8 @@ Interlibrary Loan Requests = "Pedidos de empréstimo interbibliotecas"
 Internet = "Internet"
 Invalid Patron Login = "Login Inválido de Utilizador "
 Invalid phone number. = "Número de telefone inválido."
-Invalid Recipient Email Address = "E-mail inválido de destinatário"
-Invalid Sender Email Address = "E-mail inválido de Remetente"
+Invalid Recipient Email Address = "Email inválido de destinatário"
+Invalid Sender Email Address = "Email inválido de Remetente"
 ISBN = "ISBN"
 ISBN/ISSN = "ISBN/ISSN"
 ISSN = "ISSN"
@@ -715,11 +714,11 @@ recaptcha_not_passed = "CAPTCHA errada"
 Record Citations = "Citações do registo"
 Record Count = "Número de Registos"
 Recover Account = "Recuperar Conta"
-recovery_by_email = "Recuperar por e-mail"
+recovery_by_email = "Recuperar por email"
 recovery_by_username = "Recuperar por nome de utilizador"
 recovery_disabled = "Recuperação de senha não permitida"
 recovery_email_notification = "A solicitação foi feita apenas para recuperar a senha da sua conta em %%library%%."
-recovery_email_sent = "Instruções de recuperação de senha foram enviadas para o endereço de e-mail registado nesta conta."
+recovery_email_sent = "Instruções de recuperação de senha foram enviadas para o endereço de email registado nesta conta."
 recovery_email_subject = "VuFind: Recuperação de conta"
 recovery_email_url_pretext = "Você pode redefinir sua senha no endereço: %%url%%"
 recovery_expired_hash = "Este link de recuperação já expirou"
@@ -904,13 +903,13 @@ test_fix = "Corrigir"
 test_ok = "OK"
 Text this = "Enviar por SMS"
 Thank you for your feedback. = "Obrigado por ter partilhado a sua opinião."
-That email address is already used = "Endereço de e-mail já em uso"
+That email address is already used = "Endereço de email já em uso"
 That username is already taken = "Nome de Utilizador já em uso"
 The record you selected is not part of any of your lists. = "O registo seleccionado não faz parte de nenhuma das listas."
 The record you selected is not part of the selected list. = "O registo seleccionado não faz parte da lista seleccionada."
 The system is currently unavailable due to system maintenance = "O sistema está indisponível devido a manutenção do sistema"
 Theme = "Tema"
-This email was sent from = "E-mail enviado a partir de"
+This email was sent from = "Email enviado a partir de"
 This field is required = "Campo obrigatório"
 This item is already part of the following list/lists = "Este exemplar já faz parte da seguinte lista(s)"
 This result not is displayed to guests = "Este resultado não é exibido em modo guest."
@@ -934,7 +933,7 @@ total_resources = "Total de Recursos"
 total_saved_items = "Total de Itens Gravados"
 total_tags = "Total de Tags"
 total_users = "Total de Utilizadores"
-tree_search_limit_reached_html = "A sua pesquisa devolveu muitos resultados para mostrar em árvore. Mostrando apenas o primeiro  <b>%%limit%%</b> registos. Para uma pesquisa completa clique <a id"
+tree_search_limit_reached_html = "A sua pesquisa devolveu muitos resultados para mostrar em árvore. Mostrando apenas o primeiro <b>%%limit%%</b> registos. Para uma pesquisa completa clique <a id"
 unique_tags = "Tags únicas"
 University Library = "Biblioteca Universitária"
 Unknown = "online"
diff --git a/languages/ru.ini b/languages/ru.ini
index 5a57310d4da5ece62c5575dded6123b4ccb1a479..671b448499726300620e96a2cf990020f1e89377 100644
--- a/languages/ru.ini
+++ b/languages/ru.ini
@@ -41,7 +41,7 @@ add_other_libraries = "Включите статьи в другие библи
 add_search = "Добавить поле для поиска"
 add_search_group = "Добавить группу для поиска"
 add_tag_error = "Ошибка: невозможно сохранить метки"
-add_tag_note = "Пробелы разделяют метки.  Используйте кавычки для многословных меток."
+add_tag_note = "Пробелы разделяют метки. Используйте кавычки для многословных меток."
 add_tag_success = "Метки сохранены"
 Address = "Адрес"
 adv_search_all = "Все поля"
@@ -80,13 +80,13 @@ Article = "Статья"
 Ask a Librarian = "Обратитесь к библиотекарю"
 Audience = "Аудитория"
 Audio = "Аудиозапись"
-authentication_error_admin = "Невозможно войти в систему сейчас.  Обратитесь к системному администратору."
+authentication_error_admin = "Невозможно войти в систему сейчас. Обратитесь к системному администратору."
 authentication_error_blank = "Логин не должны быть пуст."
 authentication_error_creation_blocked = "Вы не имеете прав на создание учетной записи."
 authentication_error_denied = "Ваши возможности не достаточны! Доступ не разрешен."
 authentication_error_invalid = "Неверный логин -- повторите попытку."
 authentication_error_loggedout = "Вы вышли из приложения."
-authentication_error_technical = "Сейчас невозможен вход в библиотеку.  Повторите попытку позднее."
+authentication_error_technical = "Сейчас невозможен вход в библиотеку. Повторите попытку позднее."
 Author = "Автор"
 Author Browse = "Просмотр авторов"
 Author Notes = "Авторские замечания"
@@ -119,8 +119,8 @@ Book Cover = "Значок книги"
 bookbag_confirm_empty = "Нужно ли очистить Вашу книжную сумку?"
 bookbag_delete = "Удалить выбранные документы из книжной сумки"
 bookbag_delete_selected = "Удалить выбранные"
-bookbag_email = "Отправить по E-mail выбранные в книжной сумке документы"
-bookbag_email_selected = "Отправить по E-mail выбранные"
+bookbag_email = "Отправить по Email выбранные в книжной сумке документы"
+bookbag_email_selected = "Отправить по Email выбранные"
 bookbag_export = "Экспортироовать выбранные в книжной сумке документы"
 bookbag_export_selected = "Экспортировать выбранные"
 bookbag_full = "Заполнено"
@@ -142,13 +142,13 @@ Browse the Catalog = "Просмотр каталога"
 Browse the Collection = "Просмотр коллекции"
 Browse the Collection Alphabetically = "Просмотр коллекции в алфавитном порядке"
 browse_author = "Автор"
-browse_dewey = "Шифр  (Dewey)"
+browse_dewey = "Шифр (Dewey)"
 browse_format = "Формат"
-browse_lcc = "Шифр  (LC)"
+browse_lcc = "Шифр (LC)"
 browse_publishDate = "Дата издания"
 browse_title = "Заглавие"
 browse_topic = "Тема"
-bulk_email_success = "Ваши документы отправлены по E-mail"
+bulk_email_success = "Ваши документы отправлены по Email"
 bulk_email_title = "Документы каталога библиотеки"
 bulk_error_missing = "Пропущены некоторые данные. Ващ запрос не выполнен."
 bulk_export_not_supported = "Выбранные записи не поддерживают массовый экспорт."
@@ -305,17 +305,17 @@ eds_mode_bool = "Boolean/Фраза"
 eds_mode_smart = "SmartText-поиск"
 eds_modes_and_expanders = "Режимы поиска и расширения поиска"
 Electronic = "Электронный ресурс"
-Email = "E-mail"
-Email Address = "E-mail-адрес"
-Email address is invalid = "Неверный E-mail-адрес"
-Email Record = "E-mail-запись"
-Email this = "Отправить на E-mail"
-Email this Search = "Отправить результаты поиска по E-mail"
+Email = "Email"
+Email Address = "Email-адрес"
+Email address is invalid = "Неверный Email-адрес"
+Email Record = "Email-запись"
+Email this = "Отправить на Email"
+Email this Search = "Отправить результаты поиска по Email"
 email_failure = "Ошибка - невозможно отправить сообщение"
 email_link = "Связь"
 email_maximum_recipients_note = "Допускается самое большее %%max%% получателей."
 email_multiple_recipients_note = "Допускается множество получателей, разделенных запятыми."
-email_selected = "Выбраны адреса по E-mail"
+email_selected = "Выбраны адреса по Email"
 email_selected_favorites = "Email выбранных Избранных"
 email_sending = "Идет отправка сообщения..."
 email_subject = "Предмет"
@@ -358,9 +358,9 @@ fav_delete_fail = "Произошла ошибка. Ваши избранные
 fav_delete_missing = "Пропущены некоторые данные. Ваши избранные удалены."
 fav_delete_success = "Ваши избранные удалены."
 fav_delete_warn = "Вы намереваетесь удалить эти избранные из всех своих списков - Если надо удалить избранные только из конкретных списков, выберите эти списки прежде, чем их удалять."
-fav_email_fail = "Произошла ошибка. Ваши избранные не были указаны по E-mail."
-fav_email_missing = "Пропущены некоторые данные. Ваши избранные не были указаны по E-mail."
-fav_email_success = "Ваши избранные были указаны по E-mail."
+fav_email_fail = "Произошла ошибка. Ваши избранные не были указаны по Email."
+fav_email_missing = "Пропущены некоторые данные. Ваши избранные не были указаны по Email."
+fav_email_success = "Ваши избранные были указаны по Email."
 fav_export = "Экспорт избранного"
 fav_list_delete = "Список избранного был удален"
 fav_list_delete_cancel = "Этот список не удален."
@@ -368,7 +368,6 @@ fav_list_delete_fail = "Произошла ошибка. Ваш список у
 Favorites = "Избранное"
 Fee = "взнос"
 Feedback = "обратной связи"
-Feedback Email = "Email-обратной связи"
 feedback_name = "Имя"
 File Description = "Описание файла"
 Filter = "Фильтр"
@@ -514,8 +513,8 @@ Interlibrary Loan Requests = "Межбиблиотечные запросы"
 Internet = "Internet"
 Invalid Patron Login = "Неверный пользователь библиотеки"
 Invalid phone number. = "Неверный номер телефона."
-Invalid Recipient Email Address = "Неверный E-mail-адрес получателя"
-Invalid Sender Email Address = "Неверный E-mail-адрес отправителя"
+Invalid Recipient Email Address = "Неверный Email-адрес получателя"
+Invalid Sender Email Address = "Неверный Email-адрес отправителя"
 ISBN = "ISBN"
 ISBN/ISSN = "ISBN/ISSN"
 ISSN = "ISSN"
@@ -640,7 +639,7 @@ no_items_selected = "Не выбраны метки."
 nohit_filters = "Сейчас применимы фильтры для этого поиска:"
 nohit_heading = "Нет результатов!"
 nohit_no_filters = "Не были применены для этого поиска."
-nohit_parse_error = "Кажется, возникла проблема при поиске. Проверьте синтаксис запроса.  Если попытаться использовать новые возможности, надо заключить запрос в двойные кавычки."
+nohit_parse_error = "Кажется, возникла проблема при поиске. Проверьте синтаксис запроса. Если попытаться использовать новые возможности, надо заключить запрос в двойные кавычки."
 nohit_prefix = "Ваш поиск"
 nohit_spelling = "Возможно, требуются некоторые другие вариации"
 nohit_suffix = "не найдены соответствующие книги."
@@ -772,7 +771,7 @@ recovery_disabled = "Восстановление пароля не включе
 recovery_email_notification = "Только что сделан запрос на восстановдение пароля Вашей учетной записм для %%library%%."
 recovery_email_sent = "Отправлены данные восстановления пароля по email-адресу, зарегистрированному для этой учетной записи."
 recovery_email_subject = "VuFind-восстановление учетной записи"
-recovery_email_url_pretext = "Переместитесь на указанный далее URL  для установки нового пароля: %%url%%"
+recovery_email_url_pretext = "Переместитесь на указанный далее URL для установки нового пароля: %%url%%"
 recovery_expired_hash = "Исчерпана ссылка на это восстановление"
 recovery_invalid_hash = "Не распознана ссылка на восстановление"
 recovery_new_disabled = "Вам не разрешено изменять свой пароль в данное время"
@@ -865,7 +864,7 @@ skip_confirm = "Нужно ли пропустить этот шаг?"
 skip_fix_metadata = "Не исправляйте метаданные в это время."
 skip_step = "Пропустить этот шаг"
 Slide = "Перемещать"
-sms_failure = "Ошибка!  Невозможно отправить сообщение."
+sms_failure = "Ошибка! Невозможно отправить сообщение."
 sms_phone_number = "10-цифровой номер телефона"
 sms_sending = "Идет отправка сообщения..."
 sms_success = "Сообщение отправлено."
@@ -890,7 +889,7 @@ Start a new Basic Search = "Начать новый основной поиск"
 Start Page = "Первая страница"
 starting from = "начиная с"
 Status = "Статус"
-status_unknown_message = "Недоступно состояние Live"  What does mean the status Live (working)"
+status_unknown_message = "Недоступно состояние Live" What does mean the status Live (working)"
 Storage Retrieval Requests = "Запросы выборки из хранилища"
 storage_retrieval_request_available = "Доступна ячейка подхвата"
 storage_retrieval_request_cancel = "Отменить запросы выборки из хранилища"
@@ -957,13 +956,13 @@ test_fix = "Фиксация"
 test_ok = "ОК"
 Text this = "Отправить по sms"
 Thank you for your feedback. = "Благодарю за ответ."
-That email address is already used = "Этот E-mail адрес уже используется"
+That email address is already used = "Этот Email адрес уже используется"
 That username is already taken = "Это имя пользователя уже используется"
 The record you selected is not part of any of your lists. = "Это имя пользователя уже используется"
 The record you selected is not part of the selected list. = "Выбранная запись не входит в состав выбранного списка."
 The system is currently unavailable due to system maintenance = "Сейчас система недоступна для ее обслуживания."
 Theme = "Тема"
-This email was sent from = "Это E-mail сообщение отправлено от "
+This email was sent from = "Это Email сообщение отправлено от "
 This field is required = "Требуется это поле"
 This item is already part of the following list/lists = "Этот документ входит в состав следующего списка/списков."
 This result not is displayed to guests = "Этот результат не отображается для гостей."
diff --git a/languages/sl.ini b/languages/sl.ini
index 06f77f87ad6b31e72e73e4721db1273bef1fe6cd..880d58bcfff9c6f6daae4a452d56923410901517 100644
--- a/languages/sl.ini
+++ b/languages/sl.ini
@@ -19,7 +19,7 @@ add_other_libraries = "Vključi članke iz drugih knjižnic"
 add_search = "Dodaj iskalno polje"
 add_search_group = "Dodaj iskalno skupino"
 add_tag_error = "Napaka: Ne more shraniti oznak"
-add_tag_note = "Presledki bodo ločili oznake.  Uporabite narekovaje za več-besedne oznake."
+add_tag_note = "Presledki bodo ločili oznake. Uporabite narekovaje za več-besedne oznake."
 add_tag_success = "Oznake shranjene"
 Address = "Naslov"
 adv_search_all = "Vsa polja"
@@ -52,12 +52,12 @@ APA Citation = "APA citiranje"
 Ask a Librarian = "Vprašaj knjižničarja"
 Audience = "Publika"
 Audio = "Avdio"
-authentication_error_admin = "Ne morete se prijaviti.  Kontaktirajte sistemskega administratorja za pomoč."
+authentication_error_admin = "Ne morete se prijaviti. Kontaktirajte sistemskega administratorja za pomoč."
 authentication_error_blank = "Prijava ne more biti prazna."
 authentication_error_denied = "Prijava ni skladna! Dostop zavrnjen."
 authentication_error_invalid = "Napačna prijava -- poizkusite znova."
 authentication_error_loggedout = "Odjavili ste se."
-authentication_error_technical = "Trenutno se ne morete prijaviti.  Poizkusite kasneje."
+authentication_error_technical = "Trenutno se ne morete prijaviti. Poizkusite kasneje."
 Author = "Avtor"
 Author Browse = "Prelistaj po avtorju"
 Author Notes = "Avtorjeve opombe"
@@ -294,7 +294,6 @@ fav_list_delete_fail = "Oprostite, pojavila se je napaka. Vaš seznam ni bil izb
 Favorites = "Priljubljene"
 Fee = "ÄŒlanarina/zamudnina"
 Feedback = "Pišite nam"
-Feedback Email = "Feedback Email"
 feedback_name = "Ime"
 Filter = "Filter"
 filter_tags = "Filter oznake"
@@ -513,7 +512,7 @@ no_items_selected = "Nobena knjiga/članek ni bil izbran"
 nohit_filters = "Veljavni filtri za to iskanje:"
 nohit_heading = "Ni rezultatov!"
 nohit_no_filters = "Ni veljavnih filtrov za to iskanje."
-nohit_parse_error = "Problem se je pojavil z vašim iskanjem.  Preverite sintakso.  Če ne uporabljate naprednega iskanja pomaga, če date iskalno zahtevo v dvojne narekovaje."
+nohit_parse_error = "Problem se je pojavil z vašim iskanjem. Preverite sintakso. Če ne uporabljate naprednega iskanja pomaga, če date iskalno zahtevo v dvojne narekovaje."
 nohit_prefix = "Vaše iskanje"
 nohit_spelling = "Poizkusite z različnim črkovanjem"
 nohit_suffix = "ne ujema se z nobenim virom."
@@ -615,8 +614,8 @@ Remove Filters = "Odstrani filtre"
 Remove from Book Bag = "Odstrani iz košarice"
 renew_all = "Podaljšaj vse knjige"
 renew_determine_fail = "Nismo mogli ugotoviti, če vam lahko knjigo podaljšamo. Pokličite v izposojo."
-renew_empty_selection = "Noben  predmet ni izbran"
-renew_error = "Nismo vam mogli podaljšati knjig(e)  - Pokličite v izposojo"
+renew_empty_selection = "Noben predmet ni izbran"
+renew_error = "Nismo vam mogli podaljšati knjig(e) - Pokličite v izposojo"
 renew_fail = "Te knjige ne moremo podaljšati"
 renew_item = "Knjige podaljšane"
 renew_item_due = "Izposoja bo potekla v naslednjih 24 urah"
@@ -681,7 +680,7 @@ skip_confirm = "Ste prepričani, da želite izpustiti naslednji korak?"
 skip_fix_metadata = "Trenutno ne popravi metapodatkov."
 skip_step = "Izpusti ta korak"
 Slide = "Slide"
-sms_failure = "Napaka!  Ne moremo poslati sporočila."
+sms_failure = "Napaka! Ne moremo poslati sporočila."
 sms_phone_number = "9 mestna telefonska Å¡tevilka"
 sms_sending = "Pošiljam sporočilo..."
 sms_success = "Sporočilo poslano."
@@ -763,7 +762,7 @@ Title = "Naslov"
 Title not available = "Naslov ni dosegljiv"
 title_hold_place = "Pošljite zahtevo"
 To = "Za"
-too_many_favorites = "Seznam je prevelik za enkraten prikaz.  Napravite več seznamov v vaših priljubljenih ali omejite uporabo oznak."
+too_many_favorites = "Seznam je prevelik za enkraten prikaz. Napravite več seznamov v vaših priljubljenih ali omejite uporabo oznak."
 too_many_new_items = "Preveč je zadetkov za prikaz na eni strani. Omejite vaše iskanje."
 too_many_reserves = "Preveč je naslovov obvezne literature za prikaz na eni strani.Omejite vaše iskanje."
 top_facet_additional_prefix = "Dodatno "
diff --git a/languages/sv.ini b/languages/sv.ini
index d99808985a615928da43045e53c6ab7bf7f96d34..d394bf05490647786d861e7983e67e5b6dd519f6 100644
--- a/languages/sv.ini
+++ b/languages/sv.ini
@@ -350,7 +350,6 @@ fav_list_delete_fail = "Ett fel har uppstått. Listan raderades inte."
 Favorites = "Favoriter"
 Fee = "Avgift"
 Feedback = "Feedback"
-Feedback Email = "Feedback Email"
 feedback_name = "Ditt namn"
 File Description = "Filbeskrivning"
 Filter = "Filter"
@@ -847,7 +846,7 @@ skip_confirm = "Är du säker du vill hoppa över detta steg?"
 skip_fix_metadata = "Reparera inte metadata vid denna tidpunkt."
 skip_step = "Hoppa över detta steg"
 Slide = "Dia"
-sms_failure = "Fel!  Textmeddelandet kunde inte skickas."
+sms_failure = "Fel! Textmeddelandet kunde inte skickas."
 sms_phone_number = "Telefonnummer för textmeddelande"
 sms_sending = "Skickar..."
 sms_success = "Skickats."
diff --git a/languages/tr.ini b/languages/tr.ini
index b6a153f0ec110093ace4ab48162343e49aa2333d..8fbf4cdf9d47dc31085a41131419d5b14f35485f 100644
--- a/languages/tr.ini
+++ b/languages/tr.ini
@@ -352,9 +352,9 @@ fav_delete_fail = "Bir hata oluÅŸtu. Bu nedenle favorileriniz silinemedi."
 fav_delete_missing = "Bazı veriler eksik. Bu nedenle favorileriniz silinemedi."
 fav_delete_success = "Favorileriniz Silindi."
 fav_delete_warn = "Bütün listelerinizden favorilerinizi siliyorsunuz - Eğer isterseniz sadece bazı özel listelerinizden silebilirsiniz, bunun için silmeden önce lütfen liste seçiniz."
-fav_email_fail = "Bir hata oluştu. Favorileriniz e-mail ile gönderilemedi."
-fav_email_missing = "Bazı bilgiler eksik. Favorileriniz e-mail ile gönderilemedi."
-fav_email_success = "Favorileriniz isteğiniz üzere e-mail ile gönderildi."
+fav_email_fail = "Bir hata oluştu. Favorileriniz email ile gönderilemedi."
+fav_email_missing = "Bazı bilgiler eksik. Favorileriniz email ile gönderilemedi."
+fav_email_success = "Favorileriniz isteğiniz üzere email ile gönderildi."
 fav_export = "Favorileri Aktar"
 fav_list_delete = "Favori listeniz silindi"
 fav_list_delete_cancel = "Bu liste silinmedi"
@@ -362,7 +362,6 @@ fav_list_delete_fail = "Bir hata oluÅŸtu. Listeniz silinemedi."
 Favorites = "Favorilerim"
 Fee = "Gecikme Cezası"
 Feedback = "Görüsleriniz"
-Feedback Email = "Görüsleriniz"
 feedback_name = "Adiniz"
 File Description = "Dosya tanımı"
 Filter = "Filtre"
diff --git a/languages/zh-cn.ini b/languages/zh-cn.ini
index c872f30994824af0eb49de7205519b53326dc830..a46ee942047d77c90e44356f31604f4e82166a55 100644
--- a/languages/zh-cn.ini
+++ b/languages/zh-cn.ini
@@ -52,7 +52,7 @@ authentication_error_admin = "我们暂时无法让你登录。请联系您的
 authentication_error_blank = "登录信息不能空白."
 authentication_error_denied = "帐户信息不合! 被拒绝."
 authentication_error_invalid = "无效的登入- 请再试一次."
-authentication_error_technical = "我们暂时无法让你登录.  请稍后再试."
+authentication_error_technical = "我们暂时无法让你登录. 请稍后再试."
 Author = "作者"
 Author Browse = "作者浏览"
 Author Notes = "作者笔记"
@@ -231,12 +231,12 @@ export_unsupported_format = "不支持导出格式"
 FAQs = "常见问题"
 fav_delete = "删除选定的最爱"
 fav_delete_deleting = "您的最爱正被删除."
-fav_delete_fail = "很抱歉,发生错误.  您的最爱没被删除."
-fav_delete_missing = "一些数据丢失.  您的最爱没被删除."
+fav_delete_fail = "很抱歉,发生错误. 您的最爱没被删除."
+fav_delete_missing = "一些数据丢失. 您的最爱没被删除."
 fav_delete_success = " 您的最爱已被删除."
 fav_delete_warn = "您将删除所有列出的这些收藏 - 如果你想删除特定列表中的一个最爱,请选择该列表,然后再点击删除."
 fav_email_fail = "很抱歉,发生错误。您所选的我的最爱没有发送出."
-fav_email_missing = "一些数据丢失.  您所选的我的最爱没有发送出."
+fav_email_missing = "一些数据丢失. 您所选的我的最爱没有发送出."
 fav_email_success = "您所选的我的最爱已按要求发送出."
 fav_export = "导出收藏夹"
 fav_list_delete = "您的最喜爱列表已被删除"
diff --git a/languages/zh.ini b/languages/zh.ini
index dd7eaf22b78e5b468030aa632f0714fcd0c8c95a..480697a8f58d49f1b8143fe47451f326bc5c4d2d 100644
--- a/languages/zh.ini
+++ b/languages/zh.ini
@@ -52,7 +52,7 @@ authentication_error_admin = "我們暫時無法讓你登錄。請聯系您的
 authentication_error_blank = "登錄信息不能空白."
 authentication_error_denied = "帳戶信息不合! 被拒絕."
 authentication_error_invalid = "無效的登入- 請再試一次."
-authentication_error_technical = "我們暫時無法讓你登錄.  請稍后再試."
+authentication_error_technical = "我們暫時無法讓你登錄. 請稍后再試."
 Author = "作者"
 Author Browse = "作者瀏覽"
 Author Notes = "作者筆記"
@@ -231,12 +231,12 @@ export_unsupported_format = "不支持導出格式"
 FAQs = "常見問題"
 fav_delete = "刪除選定的最愛"
 fav_delete_deleting = "您的最愛正被刪除."
-fav_delete_fail = "很抱歉,發生錯誤.  您的最愛沒被刪除."
-fav_delete_missing = "一些數據丟失.  您的最愛沒被刪除."
+fav_delete_fail = "很抱歉,發生錯誤. 您的最愛沒被刪除."
+fav_delete_missing = "一些數據丟失. 您的最愛沒被刪除."
 fav_delete_success = " 您的最愛已被刪除."
 fav_delete_warn = "您將刪除所有列出的這些收藏 - 如果你想刪除特定列表中的一個最愛,請選擇該列表,然后再點擊刪除."
 fav_email_fail = "很抱歉,發生錯誤。您所選的我的最愛沒有發送出."
-fav_email_missing = "一些數據丟失.  您所選的我的最愛沒有發送出."
+fav_email_missing = "一些數據丟失. 您所選的我的最愛沒有發送出."
 fav_email_success = "您所選的我的最愛已按要求發送出."
 fav_export = "導出收藏夾"
 fav_list_delete = "您的最喜愛列表已被刪除"
diff --git a/module/VuDL/src/VuDL/Controller/VudlController.php b/module/VuDL/src/VuDL/Controller/VudlController.php
index a27897385e64470898c4974aa50180e4fb07a629..daa5cc407ad1e3014dcbf237c433f9e7516aaff8 100644
--- a/module/VuDL/src/VuDL/Controller/VudlController.php
+++ b/module/VuDL/src/VuDL/Controller/VudlController.php
@@ -252,7 +252,7 @@ class VudlController extends AbstractVuDL
         $view->id = $root;
 
         try {
-            $driver = $this->getRecordLoader()->load($root, 'VuFind');
+            $driver = $this->getRecordLoader()->load($root);
         } catch(\Exception $e) {
         }
         if (isset($driver) && $driver->isProtected()) {
diff --git a/module/VuFind/config/module.config.php b/module/VuFind/config/module.config.php
index 48493d709d9b63e81dbbbc1ba8117d3a1e6acd53..7ec0151d5db4b738e00c0fd0cb1c8bddc4b099d4 100644
--- a/module/VuFind/config/module.config.php
+++ b/module/VuFind/config/module.config.php
@@ -129,6 +129,7 @@ $config = [
     'service_manager' => [
         'allow_override' => true,
         'factories' => [
+            'VuFind\AccountCapabilities' => 'VuFind\Service\Factory::getAccountCapabilities',
             'VuFind\AuthManager' => 'VuFind\Auth\Factory::getManager',
             'VuFind\AuthPluginManager' => 'VuFind\Service\Factory::getAuthPluginManager',
             'VuFind\AutocompletePluginManager' => 'VuFind\Service\Factory::getAutocompletePluginManager',
@@ -305,6 +306,7 @@ $config = [
                 'factories' => [
                     'amazon' => 'VuFind\Content\Covers\Factory::getAmazon',
                     'booksite' => 'VuFind\Content\Covers\Factory::getBooksite',
+                    'buchhandel' => 'VuFind\Content\Covers\Factory::getBuchhandel',
                     'contentcafe' => 'VuFind\Content\Covers\Factory::getContentCafe',
                     'syndetics' => 'VuFind\Content\Covers\Factory::getSyndetics',
                 ],
diff --git a/module/VuFind/sql/migrations/pgsql/3.0/001-modify-user-columns.sql b/module/VuFind/sql/migrations/pgsql/3.0/001-modify-user-columns.sql
new file mode 100644
index 0000000000000000000000000000000000000000..967b8ade6a5014552419aa70183a6aaace60288d
--- /dev/null
+++ b/module/VuFind/sql/migrations/pgsql/3.0/001-modify-user-columns.sql
@@ -0,0 +1,7 @@
+-- 
+-- Modifications to table `user`
+--
+
+ALTER TABLE "user"
+  ALTER COLUMN cat_password TYPE varchar(70),
+  ALTER COLUMN cat_pass_enc TYPE varchar(170);
diff --git a/module/VuFind/sql/mysql.sql b/module/VuFind/sql/mysql.sql
index 04727169c839bbb987ab495681adb24d8418546a..cac64f0d3109975721339d094b290250e3863ae5 100644
--- a/module/VuFind/sql/mysql.sql
+++ b/module/VuFind/sql/mysql.sql
@@ -172,8 +172,8 @@ CREATE TABLE `user` (
   `lastname` varchar(50) NOT NULL DEFAULT '',
   `email` varchar(255) NOT NULL DEFAULT '',
   `cat_username` varchar(50) DEFAULT NULL,
-  `cat_password` varchar(50) DEFAULT NULL,
-  `cat_pass_enc` varchar(110) DEFAULT NULL,
+  `cat_password` varchar(70) DEFAULT NULL,
+  `cat_pass_enc` varchar(170) DEFAULT NULL,
   `college` varchar(100) NOT NULL DEFAULT '',
   `major` varchar(100) NOT NULL DEFAULT '',
   `home_library` varchar(100) NOT NULL DEFAULT '',
diff --git a/module/VuFind/sql/pgsql.sql b/module/VuFind/sql/pgsql.sql
index 808e891dab646ac3da54ac98eb19000c5fe08f1d..ed0f8ff92d8345010dfe6c6d02de82bbd0727091 100644
--- a/module/VuFind/sql/pgsql.sql
+++ b/module/VuFind/sql/pgsql.sql
@@ -104,8 +104,8 @@ firstname varchar(50) NOT NULL DEFAULT '',
 lastname varchar(50) NOT NULL DEFAULT '',
 email varchar(255) NOT NULL DEFAULT '',
 cat_username varchar(50) DEFAULT NULL,
-cat_password varchar(50) DEFAULT NULL,
-cat_pass_enc varchar(110) DEFAULT NULL,
+cat_password varchar(70) DEFAULT NULL,
+cat_pass_enc varchar(170) DEFAULT NULL,
 college varchar(100) NOT NULL DEFAULT '',
 major varchar(100) NOT NULL DEFAULT '',
 home_library varchar(100) NOT NULL DEFAULT '',
diff --git a/module/VuFind/src/VuFind/Auth/CAS.php b/module/VuFind/src/VuFind/Auth/CAS.php
index cc3d2da81b89a7031ed8b2cee42c6ede82df7036..eef3d2fd442f3150670b881327b339b3e644a28a 100644
--- a/module/VuFind/src/VuFind/Auth/CAS.php
+++ b/module/VuFind/src/VuFind/Auth/CAS.php
@@ -140,6 +140,7 @@ class CAS extends AbstractBase
             "cat_username", "cat_password", "email", "lastname", "firstname",
             "college", "major", "home_library"
         ];
+        $catPassword = null;
         foreach ($attribsToCheck as $attribute) {
             if (isset($cas->$attribute)) {
                 $value = $casauth->getAttribute($cas->$attribute);
@@ -152,7 +153,7 @@ class CAS extends AbstractBase
         }
 
         // Save credentials if applicable:
-        if (!empty($catPassword) && !empty($user->cat_username)) {
+        if (!empty($user->cat_username)) {
             $user->saveCredentials($user->cat_username, $catPassword);
         }
 
diff --git a/module/VuFind/src/VuFind/Auth/LDAP.php b/module/VuFind/src/VuFind/Auth/LDAP.php
index c80c4fced3e17a2ace878c26ca521446dfb7334e..9bfb8683b4d4a3b19d5e368e0602be4f0dde5a9b 100644
--- a/module/VuFind/src/VuFind/Auth/LDAP.php
+++ b/module/VuFind/src/VuFind/Auth/LDAP.php
@@ -290,7 +290,7 @@ class LDAP extends AbstractBase
         }
 
         // Save credentials if applicable:
-        if (!empty($catPassword) && !empty($user->cat_username)) {
+        if (!empty($user->cat_username)) {
             $user->saveCredentials($user->cat_username, $catPassword);
         }
 
diff --git a/module/VuFind/src/VuFind/Auth/Manager.php b/module/VuFind/src/VuFind/Auth/Manager.php
index d4b0fa0eca53397ee1b0c80d02aed56e5ee1e7e9..8bcc6768f7872016fe84b0b6774b1a6de7ae4a7c 100644
--- a/module/VuFind/src/VuFind/Auth/Manager.php
+++ b/module/VuFind/src/VuFind/Auth/Manager.php
@@ -374,6 +374,7 @@ class Manager implements \ZfcRbac\Identity\IdentityProviderInterface
         // Clear out the cached user object and session entry.
         $this->currentUser = false;
         unset($this->session->userId);
+        unset($this->session->userDetails);
         $this->cookieManager->set('loggedOut', 1);
 
         // Destroy the session for good measure, if requested.
@@ -408,11 +409,22 @@ class Manager implements \ZfcRbac\Identity\IdentityProviderInterface
     {
         // If user object is not in cache, but user ID is in session,
         // load the object from the database:
-        if (!$this->currentUser && isset($this->session->userId)) {
-            $results = $this->userTable
-                ->select(['id' => $this->session->userId]);
-            $this->currentUser = count($results) < 1
-                ? false : $results->current();
+        if (!$this->currentUser) {
+            if (isset($this->session->userId)) {
+                // normal mode
+                $results = $this->userTable
+                    ->select(['id' => $this->session->userId]);
+                $this->currentUser = count($results) < 1
+                    ? false : $results->current();
+            } else if (isset($this->session->userDetails)) {
+                // privacy mode
+                $results = $this->userTable->createRow();
+                $results->exchangeArray($this->session->userDetails);
+                $this->currentUser = $results;
+            } else {
+                // unexpected state
+                $this->currentUser = false;
+            }
         }
         return $this->currentUser;
     }
@@ -441,6 +453,17 @@ class Manager implements \ZfcRbac\Identity\IdentityProviderInterface
         return false;
     }
 
+    /**
+     * Are we in privacy mode?
+     *
+     * @return bool
+     */
+    public function inPrivacyMode()
+    {
+        return isset($this->config->Authentication->privacy)
+            && $this->config->Authentication->privacy;
+    }
+
     /**
      * Updates the user information in the session.
      *
@@ -451,7 +474,11 @@ class Manager implements \ZfcRbac\Identity\IdentityProviderInterface
     public function updateSession($user)
     {
         $this->currentUser = $user;
-        $this->session->userId = $user->id;
+        if ($this->inPrivacyMode()) {
+            $this->session->userDetails = $user->toArray();
+        } else {
+            $this->session->userId = $user->id;
+        }
         $this->cookieManager->clear('loggedOut');
     }
 
diff --git a/module/VuFind/src/VuFind/Auth/Shibboleth.php b/module/VuFind/src/VuFind/Auth/Shibboleth.php
index 6dc42679278179d664874db7303fb9981ebb6bcc..07d7416b475bd7c93fb5e664ff50e669fa1f7faf 100644
--- a/module/VuFind/src/VuFind/Auth/Shibboleth.php
+++ b/module/VuFind/src/VuFind/Auth/Shibboleth.php
@@ -122,7 +122,7 @@ class Shibboleth extends AbstractBase
         }
 
         // Save credentials if applicable:
-        if (!empty($catPassword) && !empty($user->cat_username)) {
+        if (!empty($user->cat_username)) {
             $user->saveCredentials($user->cat_username, $catPassword);
         }
 
diff --git a/module/VuFind/src/VuFind/Bootstrapper.php b/module/VuFind/src/VuFind/Bootstrapper.php
index a6ea0ffae8ee39615ec8de16402798aa58b28920..04447ec5084eb36568488b8f054a24832a9646e6 100644
--- a/module/VuFind/src/VuFind/Bootstrapper.php
+++ b/module/VuFind/src/VuFind/Bootstrapper.php
@@ -203,7 +203,8 @@ class Bootstrapper
         // the config file if this doesn't work -- different systems may vary in
         // their behavior here.
         setlocale(
-            LC_ALL, [
+            LC_ALL,
+            [
                 "{$this->config->Site->locale}.UTF8",
                 "{$this->config->Site->locale}.UTF-8",
                 $this->config->Site->locale
diff --git a/module/VuFind/src/VuFind/Config/AccountCapabilities.php b/module/VuFind/src/VuFind/Config/AccountCapabilities.php
new file mode 100644
index 0000000000000000000000000000000000000000..09b9a4f2dc43ab4738ad56a7d421731679718479
--- /dev/null
+++ b/module/VuFind/src/VuFind/Config/AccountCapabilities.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * Class to determine which account capabilities are available, based on
+ * configuration and other factors.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2015.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Controller
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+namespace VuFind\Config;
+use VuFind\Auth\Manager as AuthManager;
+use Zend\Config\Config;
+
+/**
+ * Class to determine which account capabilities are available, based on
+ * configuration and other factors.
+ *
+ * @category VuFind2
+ * @package  Controller
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+class AccountCapabilities
+{
+    /**
+     * Auth manager
+     *
+     * @var AuthManager
+     */
+    protected $auth;
+
+    /**
+     * VuFind configuration
+     *
+     * @var Config
+     */
+    protected $config;
+
+    /**
+     * Constructor
+     *
+     * @param Config      $config VuFind configuration
+     * @param AuthManager $auth   Auth manager
+     */
+    public function __construct(Config $config, AuthManager $auth)
+    {
+        $this->auth = $auth;
+        $this->config = $config;
+    }
+
+    /**
+     * Get comment setting.
+     *
+     * @return string
+     */
+    public function getCommentSetting()
+    {
+        if (!$this->isAccountAvailable()) {
+            return 'disabled';
+        }
+        return isset($this->config->Social->comments)
+            && $this->config->Social->comments === 'disabled'
+            ? 'disabled' : 'enabled';
+    }
+
+    /**
+     * Get list setting.
+     *
+     * @return string
+     */
+    public function getListSetting()
+    {
+        if (!$this->isAccountAvailable()) {
+            return 'disabled';
+        }
+        $setting = isset($this->config->Social->lists)
+            ? trim(strtolower($this->config->Social->lists)) : 'enabled';
+        if (!$setting) {
+            $setting = 'disabled';
+        }
+        $whitelist = ['enabled', 'disabled', 'public_only', 'private_only'];
+        if (!in_array($setting, $whitelist)) {
+            $setting = 'enabled';
+        }
+        return $setting;
+    }
+
+    /**
+     * Get saved search setting.
+     *
+     * @return string
+     */
+    public function getSavedSearchSetting()
+    {
+        if (!$this->isAccountAvailable()) {
+            return 'disabled';
+        }
+        return isset($this->config->Site->allowSavedSearches)
+            && !$this->config->Site->allowSavedSearches
+            ? 'disabled' : 'enabled';
+    }
+
+    /**
+     * Get tag setting.
+     *
+     * @return string
+     */
+    public function getTagSetting()
+    {
+        if (!$this->isAccountAvailable()) {
+            return 'disabled';
+        }
+        return isset($this->config->Social->tags)
+            && $this->config->Social->tags === 'disabled'
+            ? 'disabled' : 'enabled';
+    }
+
+    /**
+     * Is a user account capable of saving data currently available?
+     *
+     * @return bool
+     */
+    protected function isAccountAvailable()
+    {
+        // We can't use account features if login is broken or privacy is on:
+        return $this->auth->loginEnabled() && !$this->auth->inPrivacyMode();
+    }
+}
diff --git a/module/VuFind/src/VuFind/Content/Covers/Buchhandel.php b/module/VuFind/src/VuFind/Content/Covers/Buchhandel.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe5cf6cf9f209c79fe5bff14e4f3154b1884c124
--- /dev/null
+++ b/module/VuFind/src/VuFind/Content/Covers/Buchhandel.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Buchhandel cover content loader.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Content
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Jochen Lienhard <lienhard@ub.uni-freiburg.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/vufind2:developer_manual Wiki
+ */
+namespace VuFind\Content\Covers;
+
+/**
+ * Buchhandel cover content loader.
+ *
+ * @category VuFind2
+ * @package  Content
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Jochen Lienhard <lienhard@ub.uni-freiburg.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/vufind2:developer_manual Wiki
+ */
+class Buchhandel extends \VuFind\Content\AbstractCover
+{
+    /**
+     * Base URL for Buchhandel
+     *
+     * @var string
+     */
+    protected $url;
+
+    /**
+     * API token for Buchhandel
+     *
+     * @var string
+     */
+    protected $apiToken;
+
+    /**
+     * Constructor
+     *
+     * @param string $url      Base URL for Buchhandel
+     * @param string $apiToken API token for Buchhandel
+     */
+    public function __construct($url, $apiToken)
+    {
+        $this->url = $url;
+        $this->apiToken = $apiToken;
+        $this->supportsIsbn = true;
+        $this->cacheAllowed = false;
+    }
+
+    /**
+     * Get image URL for a particular API token and set of IDs (or false if invalid).
+     *
+     * @param string $key  API key
+     * @param string $size Size of image to load (small/medium/large)
+     * @param array  $ids  Associative array of identifiers (keys may include 'isbn'
+     * pointing to an ISBN object and 'issn' pointing to a string)
+     *
+     * @return string|bool
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function getUrl($key, $size, $ids)
+    {
+        if (!isset($ids['isbn'])) {
+            return false;
+        }
+        $isbn = $ids['isbn']->get13();
+        switch ($size) {
+        case 'small':
+        case 'medium':
+        case 'large':
+            $lsize = substr($size, 0, 1);
+            break;
+        default:
+            $lsize = "s";
+            break;
+        }
+
+        return "{$this->url}{$isbn}/{$lsize}?access_token={$this->apiToken}";
+    }
+}
diff --git a/module/VuFind/src/VuFind/Content/Covers/Factory.php b/module/VuFind/src/VuFind/Content/Covers/Factory.php
index 3f387d3bb11310df875de65008c07204796adb8d..56b5c800e09ce87016e6208335fba4a257063755 100644
--- a/module/VuFind/src/VuFind/Content/Covers/Factory.php
+++ b/module/VuFind/src/VuFind/Content/Covers/Factory.php
@@ -76,6 +76,25 @@ class Factory
         return new Booksite($url, $config->Booksite->key);
     }
 
+    /**
+     * Create Buchhandel.de loader
+     *
+     * @param ServiceManager $sm Service manager
+     *
+     * @return mixed
+     */
+    public static function getBuchhandel(ServiceManager $sm)
+    {
+        $config = $sm->getServiceLocator()->get('VuFind\Config')->get('config');
+        $url = isset($config->Buchhandel->url)
+            ? trim($config->Buchhandel->url, '/') . '/'
+            : 'https://api.vlb.de/api/v1/cover/';
+        if (!isset($config->Buchhandel->token)) {
+            throw new \Exception("Buchhandel.de 'token' not set in VuFind config");
+        }
+        return new Buchhandel($url, $config->Buchhandel->token);
+    }
+
     /**
      * Create a ContentCafe loader
      *
diff --git a/module/VuFind/src/VuFind/Controller/AbstractBase.php b/module/VuFind/src/VuFind/Controller/AbstractBase.php
index f5afe675596423d645a8ff5430b862b2232bced3..932166061762d6ba1494051507dcde843731d394 100644
--- a/module/VuFind/src/VuFind/Controller/AbstractBase.php
+++ b/module/VuFind/src/VuFind/Controller/AbstractBase.php
@@ -624,9 +624,8 @@ class AbstractBase extends AbstractActionController
      */
     protected function listsEnabled()
     {
-        $config = $this->getServiceLocator()->get('VuFind\Config')->get('config');
-        $tagSetting = isset($config->Social->lists) ? $config->Social->lists : true;
-        return $tagSetting && $tagSetting !== 'disabled';
+        $check = $this->getServiceLocator()->get('VuFind\AccountCapabilities');
+        return $check->getListSetting() !== 'disabled';
     }
 
     /**
@@ -636,9 +635,8 @@ class AbstractBase extends AbstractActionController
      */
     protected function tagsEnabled()
     {
-        $config = $this->getServiceLocator()->get('VuFind\Config')->get('config');
-        $tagSetting = isset($config->Social->tags) ? $config->Social->tags : true;
-        return $tagSetting && $tagSetting !== 'disabled';
+        $check = $this->getServiceLocator()->get('VuFind\AccountCapabilities');
+        return $check->getTagSetting() !== 'disabled';
     }
 
     /**
diff --git a/module/VuFind/src/VuFind/Controller/AbstractRecord.php b/module/VuFind/src/VuFind/Controller/AbstractRecord.php
index c4888d4de4210bd3b690c8d9da34437bd9dbcb32..6b9f6f49d63eff0d1db4b0410a0168fca7deef08 100644
--- a/module/VuFind/src/VuFind/Controller/AbstractRecord.php
+++ b/module/VuFind/src/VuFind/Controller/AbstractRecord.php
@@ -666,10 +666,14 @@ class AbstractRecord extends AbstractBase
             return $patron;
         }
 
+        $config = $this->getConfig();
+
         $view = $this->createViewModel();
         $view->tabs = $this->getAllTabs();
         $view->activeTab = strtolower($tab);
         $view->defaultTab = strtolower($this->getDefaultTab());
+        $view->ajaxTabs = isset($config->Site->ajaxTabs)
+            ? $config->Site->ajaxTabs : false;
 
         // Set up next/previous record links (if appropriate)
         if ($this->resultScrollerActive()) {
diff --git a/module/VuFind/src/VuFind/Controller/AbstractSearch.php b/module/VuFind/src/VuFind/Controller/AbstractSearch.php
index 85d166f3b7db70277abb0da1e0169fc3a4bd3dbb..2798a688ae76816c6df1b870fef87a3214701b40 100644
--- a/module/VuFind/src/VuFind/Controller/AbstractSearch.php
+++ b/module/VuFind/src/VuFind/Controller/AbstractSearch.php
@@ -392,7 +392,9 @@ class AbstractSearch extends AbstractBase
         // Fail if user has no permission to view this search:
         $user = $this->getUser();
         $sessId = $this->getServiceLocator()->get('VuFind\SessionManager')->getId();
-        if ($search->session_id != $sessId && $search->user_id != $user->id) {
+        if ($search->session_id != $sessId
+            && ($user === false || $search->user_id != $user->id)
+        ) {
             $this->flashMessenger()->addMessage('advSearchError_noRights', 'error');
             return false;
         }
diff --git a/module/VuFind/src/VuFind/Controller/AjaxController.php b/module/VuFind/src/VuFind/Controller/AjaxController.php
index d8ccc7db0f6ec3831fe673b0d8caf3c13e642630..d48f3c2b1b745914603df5ce33c8d951e60fb72f 100644
--- a/module/VuFind/src/VuFind/Controller/AjaxController.php
+++ b/module/VuFind/src/VuFind/Controller/AjaxController.php
@@ -490,7 +490,7 @@ class AjaxController extends AbstractBase
             );
         }
         foreach ($ids as $i => $id) {
-            $source = isset($sources[$i]) ? $sources[$i] : 'VuFind';
+            $source = isset($sources[$i]) ? $sources[$i] : DEFAULT_SEARCH_BACKEND;
             $data = $user->getSavedData($id, null, $source);
             if ($data) {
                 // if this item was saved, add it to the list of saved items.
@@ -634,7 +634,7 @@ class AjaxController extends AbstractBase
         try {
             $driver = $this->getRecordLoader()->load(
                 $this->params()->fromPost('id'),
-                $this->params()->fromPost('source', 'VuFind')
+                $this->params()->fromPost('source', DEFAULT_SEARCH_BACKEND)
             );
             $tag = $this->params()->fromPost('tag', '');
             $tagParser = $this->getServiceLocator()->get('VuFind\Tags');
@@ -668,7 +668,7 @@ class AjaxController extends AbstractBase
         $tagTable = $this->getTable('Tags');
         $tags = $tagTable->getForResource(
             $this->params()->fromQuery('id'),
-            $this->params()->fromQuery('source', 'VuFind'),
+            $this->params()->fromQuery('source', DEFAULT_SEARCH_BACKEND),
             0, null, null, 'count', $is_me_id
         );
 
@@ -977,7 +977,7 @@ class AjaxController extends AbstractBase
 
         $table = $this->getTable('Resource');
         $resource = $table->findResource(
-            $id, $this->params()->fromPost('source', 'VuFind')
+            $id, $this->params()->fromPost('source', DEFAULT_SEARCH_BACKEND)
         );
         $id = $resource->addComment($comment, $user);
 
@@ -1019,7 +1019,7 @@ class AjaxController extends AbstractBase
     {
         $driver = $this->getRecordLoader()->load(
             $this->params()->fromQuery('id'),
-            $this->params()->fromQuery('source', 'VuFind')
+            $this->params()->fromQuery('source', DEFAULT_SEARCH_BACKEND)
         );
         $html = $this->getViewRenderer()
             ->render('record/comments-list.phtml', ['driver' => $driver]);
diff --git a/module/VuFind/src/VuFind/Controller/BrowseController.php b/module/VuFind/src/VuFind/Controller/BrowseController.php
index 3bc9b8f08a311a82a6f49a8eb9a2014359ac7a01..0acfb2e17819e1354d43de7203f6b8fd6fd0168d 100644
--- a/module/VuFind/src/VuFind/Controller/BrowseController.php
+++ b/module/VuFind/src/VuFind/Controller/BrowseController.php
@@ -538,40 +538,40 @@ class BrowseController extends AbstractBase
             return ['', $this->getAlphabetList()];
         case 'dewey':
             return [
-                'dewey-tens', $this->quoteValues(
-                    $this->getFacetList('dewey-hundreds', $category, 'index')
-                )
-            ];
+                    'dewey-tens', $this->quoteValues(
+                        $this->getFacetList('dewey-hundreds', $category, 'index')
+                    )
+                ];
         case 'lcc':
             return [
-                'callnumber-first', $this->quoteValues(
-                    $this->getFacetList('callnumber-first', $category, 'index')
-                )
-            ];
+                    'callnumber-first', $this->quoteValues(
+                        $this->getFacetList('callnumber-first', $category, 'index')
+                    )
+                ];
         case 'topic':
             return [
-                'topic_facet', $this->quoteValues(
-                    $this->getFacetList('topic_facet', $category)
-                )
-            ];
+                    'topic_facet', $this->quoteValues(
+                        $this->getFacetList('topic_facet', $category)
+                    )
+                ];
         case 'genre':
             return [
-                'genre_facet', $this->quoteValues(
-                    $this->getFacetList('genre_facet', $category)
-                )
-            ];
+                    'genre_facet', $this->quoteValues(
+                        $this->getFacetList('genre_facet', $category)
+                    )
+                ];
         case 'region':
             return [
-                'geographic_facet', $this->quoteValues(
-                    $this->getFacetList('geographic_facet', $category)
-                )
-            ];
+                    'geographic_facet', $this->quoteValues(
+                        $this->getFacetList('geographic_facet', $category)
+                    )
+                ];
         case 'era':
             return [
-                'era_facet', $this->quoteValues(
-                    $this->getFacetList('era_facet', $category)
-                )
-            ];
+                    'era_facet', $this->quoteValues(
+                        $this->getFacetList('era_facet', $category)
+                    )
+                ];
         }
     }
 
diff --git a/module/VuFind/src/VuFind/Controller/CartController.php b/module/VuFind/src/VuFind/Controller/CartController.php
index a4b48af277aed744ec2d6550d5938f90a4765594..555440a412ec8a68f774c84a90d3ebe3e17e50bf 100644
--- a/module/VuFind/src/VuFind/Controller/CartController.php
+++ b/module/VuFind/src/VuFind/Controller/CartController.php
@@ -385,10 +385,17 @@ class CartController extends AbstractBase
         if ($this->formWasSubmitted('submit')) {
             $this->favorites()
                 ->saveBulk($this->getRequest()->getPost()->toArray(), $user);
-            $this->flashMessenger()->addMessage('bulk_save_success', 'success');
             $list = $this->params()->fromPost('list');
+            $listUrl = $this->url()->fromRoute('userList', ['id' => $list]);
+            $message = [
+                'html' => true,
+                'msg' => $this->translate('bulk_save_success') . '. '
+                . '<a href="' . $listUrl . '">'
+                . $this->translate('go_to_list') . '</a>.'
+            ];
+            $this->flashMessenger()->addMessage($message, 'success');
             if (!empty($list)) {
-                return $this->redirect()->toRoute('userList', ['id' => $list]);
+                return $listUrl;
             } else {
                 return $this->redirectToSource();
             }
diff --git a/module/VuFind/src/VuFind/Controller/CombinedController.php b/module/VuFind/src/VuFind/Controller/CombinedController.php
index 7ff244878f783c10dba578013d7c39144449fa52..416ac5344501e547c45295c07810c52162c0b84b 100644
--- a/module/VuFind/src/VuFind/Controller/CombinedController.php
+++ b/module/VuFind/src/VuFind/Controller/CombinedController.php
@@ -265,6 +265,10 @@ class CombinedController extends AbstractSearch
         $query->filter = isset($settings['filter'])
             ? (array)$settings['filter'] : null;
 
+        // Apply shards, if any:
+        $query->shard = isset($settings['shard'])
+            ? (array)$settings['shard'] : null;
+
         // Reset override to avoid bleed-over from one section to the next!
         $query->recommendOverride = false;
 
diff --git a/module/VuFind/src/VuFind/Controller/CoverController.php b/module/VuFind/src/VuFind/Controller/CoverController.php
index 2f4b6c2cacb24eabb9be2fb57c566d397d6ba5e1..ff4c8b2ab387ff946962dd6f2cf5f238653b632f 100644
--- a/module/VuFind/src/VuFind/Controller/CoverController.php
+++ b/module/VuFind/src/VuFind/Controller/CoverController.php
@@ -26,7 +26,7 @@
  * @link     http://www.vufind.org  Main Page
  */
 namespace VuFind\Controller;
-use VuFind\Cover\Loader;
+use VuFind\Cover\CachingProxy, VuFind\Cover\Loader;
 
 /**
  * Generates covers for book entries
@@ -46,6 +46,24 @@ class CoverController extends AbstractBase
      */
     protected $loader = false;
 
+    /**
+     * Caching proxy
+     *
+     * @var CachingProxy
+     */
+    protected $proxy = false;
+
+    /**
+     * Get the cover cache directory
+     *
+     * @return string
+     */
+    protected function getCacheDir()
+    {
+        return $this->getServiceLocator()->get('VuFind\CacheManager')
+            ->getCache('cover')->getOptions()->getCacheDir();
+    }
+
     /**
      * Get the cover loader object
      *
@@ -55,8 +73,7 @@ class CoverController extends AbstractBase
     {
         // Construct object for loading cover images if it does not already exist:
         if (!$this->loader) {
-            $cacheDir = $this->getServiceLocator()->get('VuFind\CacheManager')
-                ->getCache('cover')->getOptions()->getCacheDir();
+            $cacheDir = $this->getCacheDir();
             $this->loader = new Loader(
                 $this->getConfig(),
                 $this->getServiceLocator()->get('VuFind\ContentCoversPluginManager'),
@@ -71,6 +88,46 @@ class CoverController extends AbstractBase
         return $this->loader;
     }
 
+    /**
+     * Get the caching proxy object
+     *
+     * @return CachingProxy
+     */
+    protected function getProxy()
+    {
+        if (!$this->proxy) {
+            $client = $this->getServiceLocator()->get('VuFind\Http')->createClient();
+            $cacheDir = $this->getCacheDir() . '/proxy';
+            $config = $this->getConfig()->toArray();
+            $whitelist = isset($config['Content']['coverproxyCache'])
+                ? (array)$config['Content']['coverproxyCache'] : [];
+            $this->proxy = new CachingProxy($client, $cacheDir, $whitelist);
+        }
+        return $this->proxy;
+    }
+
+    /**
+     * Convert image parameters into an array for use by the image loader.
+     *
+     * @return array
+     */
+    protected function getImageParams()
+    {
+        $params = $this->params();  // shortcut for readability
+        return [
+            // Legacy support for "isn" param which has been superseded by isbn:
+            'isbn' => $params()->fromQuery('isbn') ?: $params()->fromQuery('isn'),
+            'size' => $params()->fromQuery('size'),
+            'type' => $params()->fromQuery('contenttype'),
+            'title' => $params()->fromQuery('title'),
+            'author' => $params()->fromQuery('author'),
+            'callnumber' => $params()->fromQuery('callnumber'),
+            'issn' => $params()->fromQuery('issn'),
+            'oclc' => $params()->fromQuery('oclc'),
+            'upc' => $params()->fromQuery('upc'),
+        ];
+    }
+
     /**
      * Send image data for display in the view
      *
@@ -83,22 +140,20 @@ class CoverController extends AbstractBase
         // Special case: proxy a full URL:
         $proxy = $this->params()->fromQuery('proxy');
         if (!empty($proxy)) {
-            return $this->proxyUrl($proxy);
+            try {
+                $image = $this->getProxy()->fetch($proxy);
+                return $this->displayImage(
+                    $image->getHeaders()->get('contenttype')->getFieldValue(),
+                    $image->getContent()
+                );
+            } catch (\Exception $e) {
+                // If an exception occurs, drop through to the standard case
+                // to display an image unavailable graphic.
+            }
         }
 
         // Default case -- use image loader:
-        $this->getLoader()->loadImage(
-            // Legacy support for "isn" param which has been superseded by isbn:
-            $this->params()->fromQuery('isbn', $this->params()->fromQuery('isn')),
-            $this->params()->fromQuery('size'),
-            $this->params()->fromQuery('contenttype'),
-            $this->params()->fromQuery('title'),
-            $this->params()->fromQuery('author'),
-            $this->params()->fromQuery('callnumber'),
-            $this->params()->fromQuery('issn'),
-            $this->params()->fromQuery('oclc'),
-            $this->params()->fromQuery('upc')
-        );
+        $this->getLoader()->loadImage($this->getImageParams());
         return $this->displayImage();
     }
 
@@ -118,14 +173,17 @@ class CoverController extends AbstractBase
      * Support method -- update the view to display the image currently found in the
      * \VuFind\Cover\Loader.
      *
+     * @param string $type  Content type of image (null to access loader)
+     * @param string $image Image data (null to access loader)
+     *
      * @return \Zend\Http\Response
      */
-    protected function displayImage()
+    protected function displayImage($type = null, $image = null)
     {
         $response = $this->getResponse();
         $headers = $response->getHeaders();
         $headers->addHeaderLine(
-            'Content-type', $this->getLoader()->getContentType()
+            'Content-type', $type ?: $this->getLoader()->getContentType()
         );
 
         // Send proper caching headers so that the user's browser
@@ -143,21 +201,7 @@ class CoverController extends AbstractBase
             'Expires', gmdate('D, d M Y H:i:s', time() + $coverImageTtl) . ' GMT'
         );
 
-        $response->setContent($this->getLoader()->getImage());
+        $response->setContent($image ?: $this->getLoader()->getImage());
         return $response;
     }
-
-    /**
-     * Proxy a URL.
-     *
-     * @param string $url URL to proxy
-     *
-     * @return \Zend\Http\Response
-     */
-    protected function proxyUrl($url)
-    {
-        $client = $this->getServiceLocator()->get('VuFind\Http')->createClient();
-        return $client->setUri($url)->send();
-    }
 }
-
diff --git a/module/VuFind/src/VuFind/Controller/EdsrecordController.php b/module/VuFind/src/VuFind/Controller/EdsrecordController.php
index ec35238dc3902d9f73068d325a0a784dd65fbeb0..3095a5d06ea5a6b719d373ffaa55cc8113bd9c14 100644
--- a/module/VuFind/src/VuFind/Controller/EdsrecordController.php
+++ b/module/VuFind/src/VuFind/Controller/EdsrecordController.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org   Main Site
  */
 namespace VuFind\Controller;
+use VuFind\Exception\Forbidden as ForbiddenException;
 
 /**
  * EDS Record Controller
@@ -60,11 +61,14 @@ class EdsrecordController extends AbstractRecord
     {
         $driver = $this->loadRecord();
         //if the user is a guest, redirect them to the login screen.
-        if (!$this->isAuthenticationIP() && false == $this->getUser()) {
-            return $this->forceLogin();
-        } else {
-            return $this->redirect()->toUrl($driver->getPdfLink());
+        $auth = $this->getAuthorizationService();
+        if (!$auth->isGranted('access.EDSExtendedResults')) {
+            if (!$this->getUser()) {
+                return $this->forceLogin();
+            }
+            throw new ForbiddenException('Access denied.');
         }
+        return $this->redirect()->toUrl($driver->getPdfLink());
     }
 
     /**
@@ -78,16 +82,4 @@ class EdsrecordController extends AbstractRecord
         return (isset($config->Record->next_prev_navigation)
             && $config->Record->next_prev_navigation);
     }
-
-     /**
-     * Is IP Authentication being used?
-     *
-     * @return bool
-     */
-    protected function isAuthenticationIP()
-    {
-        $config = $this->getServiceLocator()->get('VuFind\Config')->get('EDS');
-        return (isset($config->EBSCO_Account->ip_auth)
-            && 'true' ==  $config->EBSCO_Account->ip_auth);
-    }
 }
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Controller/MyResearchController.php b/module/VuFind/src/VuFind/Controller/MyResearchController.php
index d69baad7771154b61d1a883ac8a9a46ca25111b4..a8e76e47bfc622463c89064f9578927352e385d3 100644
--- a/module/VuFind/src/VuFind/Controller/MyResearchController.php
+++ b/module/VuFind/src/VuFind/Controller/MyResearchController.php
@@ -284,6 +284,12 @@ class MyResearchController extends AbstractBase
      */
     public function savesearchAction()
     {
+        // Fail if saved searches are disabled.
+        $check = $this->getServiceLocator()->get('VuFind\AccountCapabilities');
+        if ($check->getSavedSearchSetting() === 'disabled') {
+            throw new \Exception('Saved searches disabled.');
+        }
+
         $user = $this->getUser();
         if ($user == false) {
             return $this->forceLogin();
@@ -529,7 +535,7 @@ class MyResearchController extends AbstractBase
         // Get current record (and, if applicable, selected list ID) for convenience:
         $id = $this->params()->fromPost('id', $this->params()->fromQuery('id'));
         $source = $this->params()->fromPost(
-            'source', $this->params()->fromQuery('source', 'VuFind')
+            'source', $this->params()->fromQuery('source', DEFAULT_SEARCH_BACKEND)
         );
         $driver = $this->getRecordLoader()->load($id, $source, true);
         $listID = $this->params()->fromPost(
@@ -623,7 +629,8 @@ class MyResearchController extends AbstractBase
         );
         if ($deleteId) {
             $deleteSource = $this->params()->fromPost(
-                'source', $this->params()->fromQuery('source', 'VuFind')
+                'source',
+                $this->params()->fromQuery('source', DEFAULT_SEARCH_BACKEND)
             );
             // If the user already confirmed the operation, perform the delete now;
             // otherwise prompt for confirmation:
@@ -693,7 +700,8 @@ class MyResearchController extends AbstractBase
             // to the save screen; otherwise, send them back to the list they
             // just edited.
             $recordId = $this->params()->fromQuery('recordId');
-            $recordSource = $this->params()->fromQuery('recordSource', 'VuFind');
+            $recordSource
+                = $this->params()->fromQuery('recordSource', DEFAULT_SEARCH_BACKEND);
             if (!empty($recordId)) {
                 $details = $this->getRecordRouter()->getActionRouteDetails(
                     $recordSource . '|' . $recordId, 'Save'
@@ -839,7 +847,8 @@ class MyResearchController extends AbstractBase
     protected function getDriverForILSRecord($current)
     {
         $id = isset($current['id']) ? $current['id'] : null;
-        $source = isset($current['source']) ? $current['source'] : 'VuFind';
+        $source = isset($current['source'])
+            ? $current['source'] : DEFAULT_SEARCH_BACKEND;
         $record = $this->getServiceLocator()->get('VuFind\RecordLoader')
             ->load($id, $source, true);
         $record->setExtraDetail('ils_details', $current);
@@ -1129,7 +1138,8 @@ class MyResearchController extends AbstractBase
                 if (!isset($row['id']) || empty($row['id'])) {
                     throw new \Exception();
                 }
-                $source = isset($row['source']) ? $row['source'] : 'VuFind';
+                $source = isset($row['source'])
+                    ? $row['source'] : DEFAULT_SEARCH_BACKEND;
                 $row['driver'] = $this->getServiceLocator()
                     ->get('VuFind\RecordLoader')->load($row['id'], $source);
                 $row['title'] = $row['driver']->getShortTitle();
diff --git a/module/VuFind/src/VuFind/Controller/Plugin/DbUpgrade.php b/module/VuFind/src/VuFind/Controller/Plugin/DbUpgrade.php
index e417ac51e910c0ef2c4508dd32b6b7b8f69c72db..343d8c6ec50c427bdce2db0819721e4fe41ff96b 100644
--- a/module/VuFind/src/VuFind/Controller/Plugin/DbUpgrade.php
+++ b/module/VuFind/src/VuFind/Controller/Plugin/DbUpgrade.php
@@ -386,6 +386,28 @@ class DbUpgrade extends AbstractPlugin
         return $missing;
     }
 
+    /**
+     * Given a current row default, return true if the current default matches the
+     * one found in the SQL provided as the $sql parameter. Return false if there
+     * is a mismatch that will require table structure updates.
+     *
+     * @param string $currentDefault Object to check
+     * @param string $sql            SQL to compare against
+     *
+     * @return bool
+     */
+    protected function defaultMatches($currentDefault, $sql)
+    {
+        preg_match("/.* DEFAULT (.*)$/", $sql, $matches);
+        $expectedDefault = isset($matches[1]) ? $matches[1] : null;
+        if (null !== $expectedDefault) {
+            $expectedDefault = trim(rtrim($expectedDefault, ','), "'");
+            $expectedDefault = (strtoupper($expectedDefault) == 'NULL')
+                ? null : $expectedDefault;
+        }
+        return ($expectedDefault === $currentDefault);
+    }
+
     /**
      * Given a table column object, return true if the object's type matches the
      * specified $type parameter.  Return false if there is a mismatch that will
@@ -457,7 +479,7 @@ class DbUpgrade extends AbstractPlugin
     public function getModifiedColumns($missingTables = [],
         $missingColumns = []
     ) {
-        $missing = [];
+        $modified = [];
         foreach ($this->dbCommands as $table => $sql) {
             // Skip missing tables if we're logging
             if (in_array($table, $missingTables)) {
@@ -494,15 +516,20 @@ class DbUpgrade extends AbstractPlugin
                     continue;
                 }
                 $currentColumn = $actualColumns[$column];
-                if (!$this->typeMatches($currentColumn, $expectedTypes[$i])) {
-                    if (!isset($missing[$table])) {
-                        $missing[$table] = [];
+                if (!$this->typeMatches($currentColumn, $expectedTypes[$i])
+                    || !$this->defaultMatches(
+                        $currentColumn->getColumnDefault(),
+                        $columnDefinitions[$column]
+                    )
+                ) {
+                    if (!isset($modified[$table])) {
+                        $modified[$table] = [];
                     }
-                    $missing[$table][] = $columnDefinitions[$column];
+                    $modified[$table][] = $columnDefinitions[$column];
                 }
             }
         }
-        return $missing;
+        return $modified;
     }
 
     /**
diff --git a/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php b/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php
index d8761edcfe1983b44c4ab4e176a1284dc07d3485..43c30cf2dcd58434571227606e0952187bbc5a13 100644
--- a/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php
+++ b/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php
@@ -86,7 +86,9 @@ class Renewals extends AbstractPlugin
         if (!empty($all)) {
             $ids = $request->get('renewAllIDS');
         } else if (!empty($selected)) {
-            $ids = $request->get('renewSelectedIDS');
+            $ids = $request->get('selectAll')
+                ? $request->get('selectAllIDS')
+                : $request->get('renewSelectedIDS');
         } else {
             $ids = [];
         }
diff --git a/module/VuFind/src/VuFind/Controller/SearchController.php b/module/VuFind/src/VuFind/Controller/SearchController.php
index b06c7e07b9bf5dae1a714711ac52577210dfa9a6..3518500307e128a84ab8bea04f6d0b12df682824 100644
--- a/module/VuFind/src/VuFind/Controller/SearchController.php
+++ b/module/VuFind/src/VuFind/Controller/SearchController.php
@@ -88,7 +88,8 @@ class SearchController extends AbstractSearch
         $view->useRecaptcha = $this->recaptcha()->active('email');
         $view->url = $this->params()->fromPost(
             'url', $this->params()->fromQuery(
-                'url', $this->getRequest()->getServer()->get('HTTP_REFERER')
+                'url',
+                $this->getRequest()->getServer()->get('HTTP_REFERER')
             )
         );
 
diff --git a/module/VuFind/src/VuFind/Cover/CachingProxy.php b/module/VuFind/src/VuFind/Cover/CachingProxy.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9e194709a4d3f5ee576ce92c6ef9e1417bf2b97
--- /dev/null
+++ b/module/VuFind/src/VuFind/Cover/CachingProxy.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * Caching Proxy for Cover Images
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2015.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Cover_Generator
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/use_of_external_content Wiki
+ */
+namespace VuFind\Cover;
+use Zend\Http\Client, Zend\Http\Response;
+
+/**
+ * Caching Proxy for Cover Images
+ *
+ * @category VuFind2
+ * @package  Cover_Generator
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/use_of_external_content Wiki
+ */
+class CachingProxy
+{
+    /**
+     * HTTP client
+     *
+     * @var Client
+     */
+    protected $client;
+
+    /**
+     * Base directory for cache
+     *
+     * @var string
+     */
+    protected $cache;
+
+    /**
+     * Array of regular expressions for hosts to cache
+     *
+     * @var array
+     */
+    protected $cacheWhitelist;
+
+    /**
+     * Constructor
+     *
+     * @param Client $client         HTTP client
+     * @param string $cache          Base directory for cache
+     * @param array  $cacheWhitelist Array of regular expressions for hosts to cache
+     */
+    public function __construct(Client $client, $cache, array $cacheWhitelist = [])
+    {
+        $this->client = $client;
+        $this->cache = $cache;
+        $this->cacheWhitelist = $cacheWhitelist;
+    }
+
+    /**
+     * Fetch an image from either a URL or the cache (as appropriate).
+     *
+     * @param string $url URL to fetch
+     *
+     * @return Response
+     */
+    public function fetch($url)
+    {
+        $file = $this->getCacheFile($url);
+        $cacheAllowed = $this->onWhitelist($url);
+        if (!$cacheAllowed || !($response = $this->fetchCache($file))) {
+            $response = $this->client->setUri($url)->send();
+            if ($cacheAllowed) {
+                $this->setCache($file, $response);
+            }
+        }
+        return $response;
+    }
+
+    /**
+     * Load a response from cache (or return false if cache is missing).
+     *
+     * @param string $file Cache file to load
+     *
+     * @return bool|Response
+     */
+    protected function fetchCache($file)
+    {
+        return file_exists($file)
+            ? unserialize(file_get_contents($file))
+            : false;
+    }
+
+    /**
+     * Save a response to the cache.
+     *
+     * @param string   $file     Filename to update
+     * @param Response $response Response to write
+     *
+     * @return void
+     */
+    protected function setCache($file, Response $response)
+    {
+        if (!file_exists($this->cache)) {
+            mkdir($this->cache);
+        }
+        if (!file_exists(dirname($file))) {
+            mkdir(dirname($file));
+        }
+        file_put_contents($file, serialize($response));
+    }
+
+    /**
+     * Check if the URL is on the whitelist for caching.
+     *
+     * @param string $url URL to check
+     *
+     * @return bool
+     */
+    protected function onWhitelist($url)
+    {
+        $host = parse_url($url, PHP_URL_HOST);
+        foreach ($this->cacheWhitelist as $current) {
+            if (preg_match($current, $host)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Get the cache filename corresponding with the provided URL.
+     *
+     * @param string $url URL
+     *
+     * @return string
+     */
+    protected function getCacheFile($url)
+    {
+        $hash = md5($url);
+        return $this->cache . '/' . substr($hash, 0, 3) . '/' . substr($hash, 3);
+    }
+}
diff --git a/module/VuFind/src/VuFind/Cover/Loader.php b/module/VuFind/src/VuFind/Cover/Loader.php
index 988ce2cc2e3e5f5cf48dd616c62f769389525c5d..15fe1242e1ef20683b236d65f7faf06ce5953284 100644
--- a/module/VuFind/src/VuFind/Cover/Loader.php
+++ b/module/VuFind/src/VuFind/Cover/Loader.php
@@ -162,34 +162,92 @@ class Loader extends \VuFind\ImageLoader
         );
     }
 
+    /**
+     * Get default settings for loadImage().
+     *
+     * @return array
+     */
+    protected function getDefaultSettings()
+    {
+        return [
+            'isbn' => null,
+            'size' => 'small',
+            'type' => null,
+            'title' => null,
+            'author' => null,
+            'callnumber' => null,
+            'issn' => null,
+            'oclc' => null,
+            'upc' => null,
+        ];
+    }
+
+    /**
+     * Translate legacy function arguments into new-style array.
+     *
+     * @param array $args Function arguments
+     *
+     * @return array
+     */
+    protected function getImageSettingsFromLegacyArgs($args)
+    {
+        return [
+            'isbn' => $args[0],
+            'size' => $args[1],
+            'type' => $args[2],
+            'title' => $args[3],
+            'author' => $args[4],
+            'callnumber' => $args[5],
+            'issn' => $args[6],
+            'oclc' => $args[7],
+            'upc' => $args[8],
+        ];
+    }
+
+    /**
+     * Support method for loadImage() -- sanitize and store some key values.
+     *
+     * @param array $settings Settings from loadImage (with missing defaults
+     * already filled in).
+     *
+     * @return void
+     */
+    protected function storeSanitizedSettings($settings)
+    {
+        $this->isbn = new ISBN($settings['isbn']);
+        if (!empty($settings['issn'])) {
+            $rawissn = preg_replace('/[^0-9X]/', '', strtoupper($settings['issn']));
+            $this->issn = substr($rawissn, 0, 8);
+        } else {
+            $this->issn = null;
+        }
+        $this->oclc = $settings['oclc'];
+        $this->upc = $settings['upc'];
+        $this->type = preg_replace('/[^a-zA-Z]/', '', $settings['type']);
+        $this->size = $settings['size'];
+    }
+
     /**
      * Load an image given an ISBN and/or content type.
      *
-     * @param string $isbn       ISBN
-     * @param string $size       Requested size
-     * @param string $type       Content type
-     * @param string $title      Title of book (for dynamic covers)
-     * @param string $author     Author of the book (for dynamic covers)
-     * @param string $callnumber Callnumber (unique id for dynamic covers)
-     * @param string $issn       ISSN
-     * @param string $oclc       OCLC number
-     * @param string $upc        UPC number
+     * @param array $settings Array of settings used to calculate a cover; may
+     * contain any or all of these keys: 'isbn' (ISBN), 'size' (requested size),
+     * 'type' (content type), 'title' (title of book, for dynamic covers), 'author'
+     * (author of book, for dynamic covers), 'callnumber' (unique ID, for dynamic
+     * covers), 'issn' (ISSN), 'oclc' (OCLC number), 'upc' (UPC number).
      *
      * @return void
      */
-    public function loadImage($isbn = null, $size = 'small', $type = null,
-        $title = null, $author = null, $callnumber = null, $issn = null,
-        $oclc = null, $upc = null
-    ) {
-        // Sanitize parameters:
-        $this->isbn = new ISBN($isbn);
-        $this->issn = empty($issn)
-            ? null
-            : substr(preg_replace('/[^0-9X]/', '', strtoupper($issn)), 0, 8);
-        $this->oclc = $oclc;
-        $this->upc = $upc;
-        $this->type = preg_replace("/[^a-zA-Z]/", "", $type);
-        $this->size = $size;
+    public function loadImage($settings = [])
+    {
+        // Load settings from legacy function parameters if they are not passed
+        // in as an array:
+        $settings = is_array($settings)
+            ? array_merge($this->getDefaultSettings(), $settings)
+            : $this->getImageSettingsFromLegacyArgs(func_get_args());
+
+        // Store sanitized versions of some parameters for future reference:
+        $this->storeSanitizedSettings($settings);
 
         // Display a fail image unless our parameters pass inspection and we
         // are able to display an ISBN or content-type-based image.
@@ -201,8 +259,9 @@ class Loader extends \VuFind\ImageLoader
             if (isset($this->config->Content->makeDynamicCovers)
                 && false !== $this->config->Content->makeDynamicCovers
             ) {
-                $this->image = $this->getCoverGenerator()
-                    ->generate($title, $author, $callnumber);
+                $this->image = $this->getCoverGenerator()->generate(
+                    $settings['title'], $settings['author'], $settings['callnumber']
+                );
                 $this->contentType = 'image/png';
             } else {
                 $this->loadUnavailable();
diff --git a/module/VuFind/src/VuFind/Db/Row/PrivateUser.php b/module/VuFind/src/VuFind/Db/Row/PrivateUser.php
new file mode 100644
index 0000000000000000000000000000000000000000..46c9a081c588a36b4b5adfb4015fd24c40b30814
--- /dev/null
+++ b/module/VuFind/src/VuFind/Db/Row/PrivateUser.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Fake database row to represent a user in privacy mode.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2015.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Db_Row
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+namespace VuFind\Db\Row;
+
+/**
+ * Fake database row to represent a user in privacy mode.
+ *
+ * @category VuFind2
+ * @package  Db_Row
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org   Main Site
+ */
+class PrivateUser extends User
+{
+    /**
+     * __get
+     *
+     * @param string $name Field to retrieve.
+     *
+     * @throws Exception\InvalidArgumentException
+     * @return mixed
+     */
+    public function __get($name)
+    {
+        return array_key_exists($name, $this->data) ? parent::__get($name) : null;
+    }
+
+    /**
+     * Whether library cards are enabled
+     *
+     * @return bool
+     */
+    public function libraryCardsEnabled()
+    {
+        return false; // not supported in this context
+    }
+
+    /**
+     * Save
+     *
+     * @return int
+     */
+    public function save()
+    {
+        $this->initialize();
+        $this->id = -1; // fake ID
+        $session = new \Zend\Session\Container('Account');
+        $session->userDetails = $this->toArray();
+        return 1;
+    }
+}
diff --git a/module/VuFind/src/VuFind/Db/Row/User.php b/module/VuFind/src/VuFind/Db/Row/User.php
index 4445602c2e1d39b88d6413aca4aa5d6264c14089..f31441a3e64f8fbea161acfe52c6e357d190f4a7 100644
--- a/module/VuFind/src/VuFind/Db/Row/User.php
+++ b/module/VuFind/src/VuFind/Db/Row/User.php
@@ -223,8 +223,9 @@ class User extends RowGateway implements \VuFind\Db\Table\DbTableAwareInterface,
      *
      * @return \Zend\Db\ResultSet\AbstractResultSet
      */
-    public function getTags($resourceId = null, $listId = null, $source = 'VuFind')
-    {
+    public function getTags($resourceId = null, $listId = null,
+        $source = DEFAULT_SEARCH_BACKEND
+    ) {
         $userId = $this->id;
         $callback = function ($select) use ($userId, $resourceId, $listId, $source) {
             $select->columns(
@@ -285,7 +286,7 @@ class User extends RowGateway implements \VuFind\Db\Table\DbTableAwareInterface,
      * @return string
      */
     public function getTagString($resourceId = null, $listId = null,
-        $source = 'VuFind'
+        $source = DEFAULT_SEARCH_BACKEND
     ) {
         $myTagList = $this->getTags($resourceId, $listId, $source);
         $tagStr = '';
@@ -347,8 +348,9 @@ class User extends RowGateway implements \VuFind\Db\Table\DbTableAwareInterface,
      *
      * @return array
      */
-    public function getSavedData($resourceId, $listId = null, $source = 'VuFind')
-    {
+    public function getSavedData($resourceId, $listId = null,
+        $source = DEFAULT_SEARCH_BACKEND
+    ) {
         $table = $this->getDbTable('UserResource');
         return $table->getSavedData($resourceId, $source, $listId, $this->id);
     }
@@ -395,7 +397,7 @@ class User extends RowGateway implements \VuFind\Db\Table\DbTableAwareInterface,
      *
      * @return void
      */
-    public function removeResourcesById($ids, $source = 'VuFind')
+    public function removeResourcesById($ids, $source = DEFAULT_SEARCH_BACKEND)
     {
         // Retrieve a list of resource IDs:
         $resourceTable = $this->getDbTable('Resource');
@@ -415,7 +417,7 @@ class User extends RowGateway implements \VuFind\Db\Table\DbTableAwareInterface,
     /**
      * Whether library cards are enabled
      *
-     * @return boolean
+     * @return bool
      */
     public function libraryCardsEnabled()
     {
diff --git a/module/VuFind/src/VuFind/Db/Row/UserList.php b/module/VuFind/src/VuFind/Db/Row/UserList.php
index e44be974069fdff40504f6407e4f8ca913a3382f..931740a24a5e4a92923a3ca713f2f31bb507431f 100644
--- a/module/VuFind/src/VuFind/Db/Row/UserList.php
+++ b/module/VuFind/src/VuFind/Db/Row/UserList.php
@@ -162,8 +162,9 @@ class UserList extends RowGateway implements \VuFind\Db\Table\DbTableAwareInterf
      *
      * @return void
      */
-    public function removeResourcesById($user, $ids, $source = 'VuFind')
-    {
+    public function removeResourcesById($user, $ids,
+        $source = DEFAULT_SEARCH_BACKEND
+    ) {
         if (!$this->editAllowed($user)) {
             throw new ListPermissionException('list_access_denied');
         }
diff --git a/module/VuFind/src/VuFind/Db/Table/Comments.php b/module/VuFind/src/VuFind/Db/Table/Comments.php
index 01bafd3ef3ac269a4c5f793609ae5110991e9f59..21ecd16f70a532609ef20a4910afe714a1c8174b 100644
--- a/module/VuFind/src/VuFind/Db/Table/Comments.php
+++ b/module/VuFind/src/VuFind/Db/Table/Comments.php
@@ -55,7 +55,7 @@ class Comments extends Gateway
      *
      * @return array|\Zend\Db\ResultSet\AbstractResultSet
      */
-    public function getForResource($id, $source = 'VuFind')
+    public function getForResource($id, $source = DEFAULT_SEARCH_BACKEND)
     {
         $resourceTable = $this->getDbTable('Resource');
         $resource = $resourceTable->findResource($id, $source, false);
diff --git a/module/VuFind/src/VuFind/Db/Table/Resource.php b/module/VuFind/src/VuFind/Db/Table/Resource.php
index 91ae95ca6617516ab8dd5399de4a991b2d4efd4d..cb8ca06fd0724e3005b533e2ce99d09563ca5f8e 100644
--- a/module/VuFind/src/VuFind/Db/Table/Resource.php
+++ b/module/VuFind/src/VuFind/Db/Table/Resource.php
@@ -72,8 +72,8 @@ class Resource extends Gateway
      * @return \VuFind\Db\Row\Resource|null Matching row if found or created, null
      * otherwise.
      */
-    public function findResource($id, $source = 'VuFind', $create = true,
-        $driver = null
+    public function findResource($id, $source = DEFAULT_SEARCH_BACKEND,
+        $create = true, $driver = null
     ) {
         if (empty($id)) {
             throw new \Exception('Resource ID cannot be empty');
@@ -110,7 +110,7 @@ class Resource extends Gateway
      *
      * @return \Zend\Db\ResultSet\AbstractResultSet
      */
-    public function findResources($ids, $source = 'VuFind')
+    public function findResources($ids, $source = DEFAULT_SEARCH_BACKEND)
     {
         $callback = function ($select) use ($ids, $source) {
             $select->where->in('record_id', $ids);
diff --git a/module/VuFind/src/VuFind/Db/Table/Search.php b/module/VuFind/src/VuFind/Db/Table/Search.php
index db33c561595f80c61a371fea1d910357cd7b12a6..52cbb15b2b63f8a7cb4f32a44400cf1b6b786e19 100644
--- a/module/VuFind/src/VuFind/Db/Table/Search.php
+++ b/module/VuFind/src/VuFind/Db/Table/Search.php
@@ -151,6 +151,7 @@ class Search extends Gateway
         $newSearch, $sessionId, $searchHistory = []
     ) {
         // Duplicate elimination
+        $newUrl = $newSearch->getUrlQuery()->getParams();
         foreach ($searchHistory as $oldSearch) {
             // Deminify the old search (note that if we have a resource, we need
             // to grab the contents -- this is necessary for PostgreSQL compatibility
@@ -159,7 +160,6 @@ class Search extends Gateway
             $dupSearch = $minSO->deminify($manager);
             // See if the classes and urls match
             $oldUrl = $dupSearch->getUrlQuery()->getParams();
-            $newUrl = $newSearch->getUrlQuery()->getParams();
             if (get_class($dupSearch) == get_class($newSearch)
                 && $oldUrl == $newUrl
             ) {
diff --git a/module/VuFind/src/VuFind/Db/Table/Tags.php b/module/VuFind/src/VuFind/Db/Table/Tags.php
index 1884a8b680be803d09c47515ae7a2422c57ccfea..641286c01393344263aa5c3758624199e50e1a46 100644
--- a/module/VuFind/src/VuFind/Db/Table/Tags.php
+++ b/module/VuFind/src/VuFind/Db/Table/Tags.php
@@ -100,7 +100,7 @@ class Tags extends Gateway
      *
      * @return array
      */
-    public function getForResource($id, $source = 'VuFind', $limit = 0,
+    public function getForResource($id, $source = DEFAULT_SEARCH_BACKEND, $limit = 0,
         $list = null, $user = null, $sort = 'count', $userToCheck = null
     ) {
         return $this->select(
diff --git a/module/VuFind/src/VuFind/Db/Table/User.php b/module/VuFind/src/VuFind/Db/Table/User.php
index 9444c836e079978eefc240fd867b2d4df6cde7f6..c8619c20ae3ee30589fb015d461123f9cf2b50a4 100644
--- a/module/VuFind/src/VuFind/Db/Table/User.php
+++ b/module/VuFind/src/VuFind/Db/Table/User.php
@@ -52,7 +52,11 @@ class User extends Gateway
      */
     public function __construct(\Zend\Config\Config $config)
     {
-        parent::__construct('user', 'VuFind\Db\Row\User');
+        // Use a special row class when we're in privacy mode:
+        $privacy = isset($config->Authentication->privacy)
+            && $config->Authentication->privacy;
+        $rowClass = 'VuFind\Db\Row\\' . ($privacy ? 'PrivateUser' : 'User');
+        parent::__construct('user', $rowClass);
         $this->config = $config;
     }
 
diff --git a/module/VuFind/src/VuFind/Db/Table/UserList.php b/module/VuFind/src/VuFind/Db/Table/UserList.php
index 9791950cf7911260c2c7aaa3aefcc05c7d1db90c..0665fa6597afa8f2a0ff73e3c773cf849fb64992 100644
--- a/module/VuFind/src/VuFind/Db/Table/UserList.php
+++ b/module/VuFind/src/VuFind/Db/Table/UserList.php
@@ -97,8 +97,8 @@ class UserList extends Gateway
      *
      * @return array
      */
-    public function getListsContainingResource($resourceId, $source = 'VuFind',
-        $userId = null
+    public function getListsContainingResource($resourceId,
+        $source = DEFAULT_SEARCH_BACKEND, $userId = null
     ) {
         // Set up base query:
         $callback = function ($select) use ($resourceId, $source, $userId) {
diff --git a/module/VuFind/src/VuFind/Db/Table/UserResource.php b/module/VuFind/src/VuFind/Db/Table/UserResource.php
index 182b7cefa6e0f13fca0434346809ff0817bd525a..e19cc194cf38ca138e810c54549f509aa2d87ace 100644
--- a/module/VuFind/src/VuFind/Db/Table/UserResource.php
+++ b/module/VuFind/src/VuFind/Db/Table/UserResource.php
@@ -59,8 +59,8 @@ class UserResource extends Gateway
      *
      * @return \Zend\Db\ResultSet\AbstractResultSet
      */
-    public function getSavedData($resourceId, $source = 'VuFind', $listId = null,
-        $userId = null
+    public function getSavedData($resourceId, $source = DEFAULT_SEARCH_BACKEND,
+        $listId = null, $userId = null
     ) {
         $callback = function ($select) use ($resourceId, $source, $listId, $userId) {
             $select->columns(
diff --git a/module/VuFind/src/VuFind/ILS/Driver/Aleph.php b/module/VuFind/src/VuFind/ILS/Driver/Aleph.php
index ff6c41cb4a941f7ef5a2a03f26ed2368e92d1272..d95d8b52f021e50d1412debd40bc4cc43e1fa229 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/Aleph.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/Aleph.php
@@ -443,7 +443,8 @@ class Aleph extends AbstractBase implements \Zend\Log\LoggerAwareInterface,
         $url = $this->appendQueryString($url, $params);
         if ($auth) {
             $url = $this->appendQueryString(
-                $url, [
+                $url,
+                [
                     'user_name' => $this->wwwuser,
                     'user_password' => $this->wwwpasswd
                 ]
@@ -1138,11 +1139,7 @@ class Aleph extends AbstractBase implements \Zend\Log\LoggerAwareInterface,
             $barcode = (string) $z30->{'z30-barcode'};
             $checkout = (string) $z31->{'z31-date'};
             $id = $this->barcodeToID($barcode);
-            if ($transactiontype == "Debit") {
-                $mult = -100;
-            } elseif ($transactiontype == "Credit") {
-                $mult = 100;
-            }
+            $mult = ($transactiontype == "Credit") ? 100 : -100;
             $amount
                 = (float)(preg_replace("/[\(\)]/", "", (string) $z31->{'z31-sum'}))
                 * $mult;
diff --git a/module/VuFind/src/VuFind/ILS/Driver/Demo.php b/module/VuFind/src/VuFind/ILS/Driver/Demo.php
index c6219f89752042364a1be9a589a1d30c7502a4c3..9bb415628367be020b5b9c56bb67b5dc6cd5c4f9 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/Demo.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/Demo.php
@@ -213,7 +213,7 @@ class Demo extends AbstractBase
     protected function getRecordSource()
     {
         return isset($this->config['Records']['source'])
-            ? $this->config['Records']['source'] : 'VuFind';
+            ? $this->config['Records']['source'] : DEFAULT_SEARCH_BACKEND;
     }
 
     /**
diff --git a/module/VuFind/src/VuFind/ILS/Driver/Horizon.php b/module/VuFind/src/VuFind/ILS/Driver/Horizon.php
index d7a0ac78c40d6302a7894b955e8c17f78ba84f15..f034e5e0b83a9d0f1b3f739d1580ae4599db8f5f 100644
--- a/module/VuFind/src/VuFind/ILS/Driver/Horizon.php
+++ b/module/VuFind/src/VuFind/ILS/Driver/Horizon.php
@@ -277,7 +277,6 @@ class Horizon extends AbstractBase
         $duedate     = $row['DUEDATE'];
         $item_status = $row['STATUS_CODE']; //get the item status code
 
-
         $statusValues = $this->parseStatus($item_status);
 
         if (isset($statusValues['duedate'])) {
diff --git a/module/VuFind/src/VuFind/ILS/Logic/Holds.php b/module/VuFind/src/VuFind/ILS/Logic/Holds.php
index 6673cd550c13cf921df9597360447e32d0596b44..7c6c02d8ebab19f68b4341e78a1a1b81dc3aed93 100644
--- a/module/VuFind/src/VuFind/ILS/Logic/Holds.php
+++ b/module/VuFind/src/VuFind/ILS/Logic/Holds.php
@@ -490,7 +490,8 @@ class Holds
         // Build Params
         return [
             'action' => $action, 'record' => $details['id'],
-            'source' => isset($details['source']) ? $details['source'] : 'VuFind',
+            'source' => isset($details['source'])
+                ? $details['source'] : DEFAULT_SEARCH_BACKEND,
             'query' => $queryString, 'anchor' => "#tabnav"
         ];
     }
diff --git a/module/VuFind/src/VuFind/Recommend/Factory.php b/module/VuFind/src/VuFind/Recommend/Factory.php
index 85a8c2580321de0377a78a4344f714917f8a7715..6f3d9bb934e2070e248af09da0cf5333c140b709 100644
--- a/module/VuFind/src/VuFind/Recommend/Factory.php
+++ b/module/VuFind/src/VuFind/Recommend/Factory.php
@@ -174,8 +174,11 @@ class Factory
      */
     public static function getFavoriteFacets(ServiceManager $sm)
     {
+        $parentSm = $sm->getServiceLocator();
         return new FavoriteFacets(
-            $sm->getServiceLocator()->get('VuFind\Config')
+            $parentSm->get('VuFind\Config'),
+            null,
+            $parentSm->get('VuFind\AccountCapabilities')->getTagSetting()
         );
     }
 
diff --git a/module/VuFind/src/VuFind/Recommend/FavoriteFacets.php b/module/VuFind/src/VuFind/Recommend/FavoriteFacets.php
index 23b414e279edd3bf621b57df07e1a83f447bed01..29f0daf4e4aada6f5c0ca73e12d7611ae2aa06aa 100644
--- a/module/VuFind/src/VuFind/Recommend/FavoriteFacets.php
+++ b/module/VuFind/src/VuFind/Recommend/FavoriteFacets.php
@@ -26,6 +26,7 @@
  * @link     http://vufind.org/wiki/vufind2:recommendation_modules Wiki
  */
 namespace VuFind\Recommend;
+use VuFind\Search\Solr\HierarchicalFacetHelper;
 
 /**
  * FavoriteFacets Recommendations Module
@@ -40,6 +41,30 @@ namespace VuFind\Recommend;
  */
 class FavoriteFacets extends SideFacets
 {
+    /**
+     * Tag capability setting
+     *
+     * @var string
+     */
+    protected $tagSetting;
+
+    /**
+     * Constructor
+     *
+     * @param \VuFind\Config\PluginManager $configLoader Configuration loader
+     * @param HierarchicalFacetHelper      $facetHelper  Helper for handling
+     * hierarchical facets
+     * @param string                       $tagSetting   Tag capability setting
+     */
+    public function __construct(
+        \VuFind\Config\PluginManager $configLoader,
+        HierarchicalFacetHelper $facetHelper = null,
+        $tagSetting = 'enabled'
+    ) {
+        parent::__construct($configLoader, $facetHelper);
+        $this->tagSetting = $tagSetting;
+    }
+
     /**
      * Store the configuration of the recommendation module.
      *
@@ -49,12 +74,8 @@ class FavoriteFacets extends SideFacets
      */
     public function setConfig($settings)
     {
-        $config = $this->configLoader->get('config');
-        $tagSetting = isset($config->Social->tags)
-            ? $config->Social->tags : true;
-
         // Only display tags when enabled:
-        $this->mainFacets = ($tagSetting && $tagSetting !== 'disabled')
+        $this->mainFacets = ($this->tagSetting !== 'disabled')
             ? ['tags' => 'Your Tags'] : [];
     }
 }
diff --git a/module/VuFind/src/VuFind/Record/Loader.php b/module/VuFind/src/VuFind/Record/Loader.php
index 6ca7e4653ee3310158f0339435d01e9bc08b3e31..ad1059ac4a47b72c7847ade9327ee11f719f2f4a 100644
--- a/module/VuFind/src/VuFind/Record/Loader.php
+++ b/module/VuFind/src/VuFind/Record/Loader.php
@@ -79,8 +79,9 @@ class Loader
      * @throws \Exception
      * @return \VuFind\RecordDriver\AbstractBase
      */
-    public function load($id, $source = 'VuFind', $tolerateMissing = false)
-    {
+    public function load($id, $source = DEFAULT_SEARCH_BACKEND,
+        $tolerateMissing = false
+    ) {
         $results = $this->searchService->retrieve($source, $id)->getRecords();
         if (count($results) > 0) {
             return $results[0];
@@ -106,7 +107,7 @@ class Loader
      * @throws \Exception
      * @return array
      */
-    public function loadBatchForSource($ids, $source = 'VuFind')
+    public function loadBatchForSource($ids, $source = DEFAULT_SEARCH_BACKEND)
     {
         return $this->searchService->retrieveBatch($source, $ids)->getRecords();
     }
diff --git a/module/VuFind/src/VuFind/Record/Router.php b/module/VuFind/src/VuFind/Record/Router.php
index 8867121db96008f266845d517007575878605f7b..1a382ba66b69d83a2c8385b505ea6fcbe9af4ce8 100644
--- a/module/VuFind/src/VuFind/Record/Router.php
+++ b/module/VuFind/src/VuFind/Record/Router.php
@@ -142,7 +142,7 @@ class Router
 
         // Determine route based on naming convention (default VuFind route is
         // the exception to the rule):
-        $routeBase = ($source == 'VuFind')
+        $routeBase = ($source == DEFAULT_SEARCH_BACKEND)
             ? 'record' : strtolower($source . 'record');
 
         return [
@@ -162,7 +162,7 @@ class Router
     {
         $parts = explode('|', $driver, 2);
         if (count($parts) < 2) {
-            $source = 'VuFind';
+            $source = DEFAULT_SEARCH_BACKEND;
             $id = $parts[0];
         } else {
             $source = $parts[0];
diff --git a/module/VuFind/src/VuFind/RecordDriver/EDS.php b/module/VuFind/src/VuFind/RecordDriver/EDS.php
index a6789a980650fb162d7a6ee5a6c7bcf1dbabf924..33ef25bbd805fe9d5bc35e7281da11f9b13224d6 100644
--- a/module/VuFind/src/VuFind/RecordDriver/EDS.php
+++ b/module/VuFind/src/VuFind/RecordDriver/EDS.php
@@ -442,7 +442,6 @@ class EDS extends SolrDefault
         // Map xml tags to the HTML tags
         // This is just a small list, the total number of xml tags is far greater
 
-
         // Any group can be added here, but we only use Au (Author)
         // Other groups, not present here, won't be transformed to HTML links
         $allowed_searchlink_groups = ['au','su'];
diff --git a/module/VuFind/src/VuFind/RecordDriver/SolrMarc.php b/module/VuFind/src/VuFind/RecordDriver/SolrMarc.php
index 123fa2aa35439c5614c57b66b846b2588d0237ce..90a2415b211ab74c164a39c770b2a0842e3bd5fc 100644
--- a/module/VuFind/src/VuFind/RecordDriver/SolrMarc.php
+++ b/module/VuFind/src/VuFind/RecordDriver/SolrMarc.php
@@ -613,9 +613,12 @@ class SolrMarc extends SolrDefault
         foreach ($fields as $field) {
             $subfields = $field->getSubfields();
             foreach ($subfields as $subfield) {
-                // Break the string into appropriate chunks,  and merge them into
-                // return array:
-                $toc = array_merge($toc, explode('--', $subfield->getData()));
+                // Break the string into appropriate chunks, filtering empty strings,
+                // and merge them into return array:
+                $toc = array_merge(
+                    $toc,
+                    array_filter(explode('--', $subfield->getData()), 'trim')
+                );
             }
         }
         return $toc;
diff --git a/module/VuFind/src/VuFind/RecordTab/Factory.php b/module/VuFind/src/VuFind/RecordTab/Factory.php
index f4cd5b27c38537d61a9d5170ca93938b99773e3b..793c4bff1ffa972f3b4155a9b5bcb17cf3e295ee 100644
--- a/module/VuFind/src/VuFind/RecordTab/Factory.php
+++ b/module/VuFind/src/VuFind/RecordTab/Factory.php
@@ -256,9 +256,7 @@ class Factory
      */
     public static function getUserComments(ServiceManager $sm)
     {
-        $cfg = $sm->getServiceLocator()->get('VuFind\Config')->get('config');
-        $enabled = !isset($cfg->Social->comments)
-            || ($cfg->Social->comments && $cfg->Social->comments !== 'disabled');
-        return new UserComments($enabled);
+        $capabilities = $sm->getServiceLocator()->get('VuFind\AccountCapabilities');
+        return new UserComments('enabled' === $capabilities->getCommentSetting());
     }
 }
diff --git a/module/VuFind/src/VuFind/Search/Base/Results.php b/module/VuFind/src/VuFind/Search/Base/Results.php
index 8f32ddd4da769059cb67da05865223b49ae16cd4..acbd9cae00c2b597f2d8961b06a3a3b0fb27a0ad 100644
--- a/module/VuFind/src/VuFind/Search/Base/Results.php
+++ b/module/VuFind/src/VuFind/Search/Base/Results.php
@@ -148,7 +148,6 @@ abstract class Results implements ServiceLocatorAwareInterface
      */
     public function __construct(Params $params)
     {
-        // Save the parameters, then perform the search:
         $this->setParams($params);
     }
 
@@ -162,6 +161,7 @@ abstract class Results implements ServiceLocatorAwareInterface
         if (is_object($this->params)) {
             $this->params = clone($this->params);
         }
+        $this->helpers = [];
     }
 
     /**
diff --git a/module/VuFind/src/VuFind/Search/Factory/EdsBackendFactory.php b/module/VuFind/src/VuFind/Search/Factory/EdsBackendFactory.php
index 955cd455494ecf3af0446f677b734a201e97ab6d..995e493ab620b9316dcf23ea17b31bd26d50714e 100644
--- a/module/VuFind/src/VuFind/Search/Factory/EdsBackendFactory.php
+++ b/module/VuFind/src/VuFind/Search/Factory/EdsBackendFactory.php
@@ -103,10 +103,12 @@ class EdsBackendFactory implements FactoryInterface
      */
     protected function createBackend(Connector $connector)
     {
+        $auth = $this->serviceLocator->get('ZfcRbac\Service\AuthorizationService');
+        $isGuest = !$auth->isGranted('access.EDSExtendedResults');
         $backend = new Backend(
             $connector, $this->createRecordCollectionFactory(),
             $this->serviceLocator->get('VuFind\CacheManager')->getCache('object'),
-            new \Zend\Session\Container('EBSCO'), $this->edsConfig
+            new \Zend\Session\Container('EBSCO'), $this->edsConfig, $isGuest
         );
         $backend->setAuthManager($this->serviceLocator->get('VuFind\AuthManager'));
         $backend->setLogger($this->logger);
diff --git a/module/VuFind/src/VuFind/Search/Solr/DeduplicationListener.php b/module/VuFind/src/VuFind/Search/Solr/DeduplicationListener.php
index 886c04e5b3cf3d25522f2ca08af8256852d04a10..33bf88a354b1c58aadf28e9cd4995ee7b002947d 100644
--- a/module/VuFind/src/VuFind/Search/Solr/DeduplicationListener.php
+++ b/module/VuFind/src/VuFind/Search/Solr/DeduplicationListener.php
@@ -339,17 +339,19 @@ class DeduplicationListener
     {
         $result = [];
         foreach ($params->get('fq') as $fq) {
-            if (preg_match(
-                '/\bbuilding:"([^"]+)"/', //'/\bbuilding:"?\d+\/([^\/]+?)\//',
+            if (preg_match_all(
+                '/\bbuilding:"([^"]+)"/',
                 $fq,
                 $matches
             )) {
-                $value = $matches[1];
-                if (preg_match('/^\d+\/([^\/]+?)\//', $value, $matches)) {
-                    // Hierarchical facets; take only first level:
-                    $result[] = $matches[1];
-                } else {
-                    $result[] = $value;
+                $values = $matches[1];
+                foreach ($values as $value) {
+                    if (preg_match('/^\d+\/([^\/]+?)\//', $value, $matches)) {
+                        // Hierarchical facets; take only first level:
+                        $result[] = $matches[1];
+                    } else {
+                        $result[] = $value;
+                    }
                 }
             }
         }
diff --git a/module/VuFind/src/VuFind/Service/Factory.php b/module/VuFind/src/VuFind/Service/Factory.php
index 4f20f5105a8bc8595d927d9b0c94042998e6ccf6..fec6f253c317a4956493f96ed3bce8f234542a81 100644
--- a/module/VuFind/src/VuFind/Service/Factory.php
+++ b/module/VuFind/src/VuFind/Service/Factory.php
@@ -41,6 +41,21 @@ use Zend\ServiceManager\ServiceManager;
  */
 class Factory
 {
+    /**
+     * Construct the Account Capabilities helper.
+     *
+     * @param ServiceManager $sm Service manager.
+     *
+     * @return \VuFind\Config\AccountCapabilities
+     */
+    public static function getAccountCapabilities(ServiceManager $sm)
+    {
+        return new \VuFind\Config\AccountCapabilities(
+            $sm->get('VuFind\Config')->get('config'),
+            $sm->get('VuFind\AuthManager')
+        );
+    }
+
     /**
      * Construct the Auth Plugin Manager.
      *
diff --git a/module/VuFind/src/VuFind/View/Helper/Root/AccountCapabilities.php b/module/VuFind/src/VuFind/View/Helper/Root/AccountCapabilities.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c8452170e07fcbbcffd0428e2f74d6eee27b425
--- /dev/null
+++ b/module/VuFind/src/VuFind/View/Helper/Root/AccountCapabilities.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * AccountCapabilities view helper
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2015.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  View_Helpers
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/vufind2:developer_manual Wiki
+ */
+namespace VuFind\View\Helper\Root;
+use VuFind\Config\AccountCapabilities as Helper;
+
+/**
+ * AccountCapabilities view helper
+ *
+ * @category VuFind2
+ * @package  View_Helpers
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org/wiki/vufind2:developer_manual Wiki
+ */
+class AccountCapabilities extends \Zend\View\Helper\AbstractHelper
+{
+    /**
+     * Capabilities helper
+     *
+     * @var Helper
+     */
+    protected $helper;
+
+    /**
+     * Constructor
+     *
+     * @param Helper $helper Capabilities helper
+     */
+    public function __construct(Helper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    /**
+     * Get the capabilities helper.
+     *
+     * @return Helper
+     */
+    public function __invoke()
+    {
+        return $this->helper;
+    }
+}
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/View/Helper/Root/Factory.php b/module/VuFind/src/VuFind/View/Helper/Root/Factory.php
index c6d56cc5feaadbc09d935230588a24003ceb4a35..12769c3fe1259eaf1c3c9147222b92f8bee7308a 100644
--- a/module/VuFind/src/VuFind/View/Helper/Root/Factory.php
+++ b/module/VuFind/src/VuFind/View/Helper/Root/Factory.php
@@ -56,6 +56,20 @@ class Factory
         );
     }
 
+    /**
+     * Construct the AccountCapabilities helper.
+     *
+     * @param ServiceManager $sm Service manager.
+     *
+     * @return AccountCapabilities
+     */
+    public static function getAccountCapabilities(ServiceManager $sm)
+    {
+        return new AccountCapabilities(
+            $sm->getServiceLocator()->get('VuFind\AccountCapabilities')
+        );
+    }
+
     /**
      * Construct the AlphaBrowse helper.
      *
@@ -514,17 +528,8 @@ class Factory
      */
     public static function getUserList(ServiceManager $sm)
     {
-        $cfg = $sm->getServiceLocator()->get('VuFind\Config')->get('config');
-        $setting = isset($cfg->Social->lists)
-            ? trim(strtolower($cfg->Social->lists)) : 'enabled';
-        if (!$setting) {
-            $setting = 'disabled';
-        }
-        $whitelist = ['enabled', 'disabled', 'public_only', 'private_only'];
-        if (!in_array($setting, $whitelist)) {
-            $setting = 'enabled';
-        }
-        return new UserList($setting);
+        $capabilities = $sm->getServiceLocator()->get('VuFind\AccountCapabilities');
+        return new UserList($capabilities->getListSetting());
     }
 
     /**
@@ -536,10 +541,7 @@ class Factory
      */
     public static function getUserTags(ServiceManager $sm)
     {
-        $cfg = $sm->getServiceLocator()->get('VuFind\Config')->get('config');
-        $mode = !isset($cfg->Social->tags)
-            || ($cfg->Social->tags && $cfg->Social->tags !== 'disabled')
-            ? 'enabled' : 'disabled';
-        return new UserTags($mode);
+        $capabilities = $sm->getServiceLocator()->get('VuFind\AccountCapabilities');
+        return new UserTags($capabilities->getTagSetting());
     }
 }
diff --git a/module/VuFind/src/VuFind/View/Helper/Root/JsTranslations.php b/module/VuFind/src/VuFind/View/Helper/Root/JsTranslations.php
index f06481a776efc4bdfa0c38e99a73252d8be047fb..9bf89399fa0794c45e2b72d06bbcf3a7104e8857 100644
--- a/module/VuFind/src/VuFind/View/Helper/Root/JsTranslations.php
+++ b/module/VuFind/src/VuFind/View/Helper/Root/JsTranslations.php
@@ -87,11 +87,11 @@ class JsTranslations extends AbstractHelper
     }
 
     /**
-     * Generate Javascript from the internal strings.
+     * Generate JSON from the internal strings.
      *
      * @return string
      */
-    public function getScript()
+    public function getJSON()
     {
         $parts = [];
         foreach ($this->strings as $k => $v) {
@@ -100,6 +100,16 @@ class JsTranslations extends AbstractHelper
                 : $this->transEsc->__invoke($v);
             $parts[] = $k . ': "' . addslashes($translation) . '"';
         }
-        return $this->varName . ' = {' . implode(',', $parts) . '};';
+        return '{' . implode(',', $parts) . '}';
+    }
+
+    /**
+     * Assign JSON to a variable.
+     *
+     * @return string
+     */
+    public function getScript()
+    {
+        return $this->varName . ' = ' . $this->getJSON() . ';';
     }
 }
diff --git a/module/VuFind/src/VuFind/View/Helper/Root/Record.php b/module/VuFind/src/VuFind/View/Helper/Root/Record.php
index e8b1ec03b344fc315f3bf197f8e33932881805bf..e3a7dedb23fe4b4eb332d17a82a878d30d95ca7f 100644
--- a/module/VuFind/src/VuFind/View/Helper/Root/Record.php
+++ b/module/VuFind/src/VuFind/View/Helper/Root/Record.php
@@ -338,12 +338,12 @@ class Record extends AbstractHelper
         // Figure out controller using naming convention based on resource
         // source:
         $source = $this->driver->getResourceSource();
-        if ($source == 'VuFind') {
-            // "VuFind" is special case -- it refers to Solr, which uses
-            // the basic record controller.
+        if ($source == DEFAULT_SEARCH_BACKEND) {
+            // Default source is special case -- it uses the basic record
+            // controller.
             return 'Record';
         }
-        // All non-Solr controllers will correspond with the record source:
+        // All other controllers will correspond with the record source:
         return ucwords(strtolower($source)) . 'record';
     }
 
diff --git a/module/VuFind/src/VuFind/View/Helper/Root/RecordLink.php b/module/VuFind/src/VuFind/View/Helper/Root/RecordLink.php
index 33b387834d226a832258823395ffae1522630795..8e70e9ee58d0c41166b9739b6ea1343080ebea96 100644
--- a/module/VuFind/src/VuFind/View/Helper/Root/RecordLink.php
+++ b/module/VuFind/src/VuFind/View/Helper/Root/RecordLink.php
@@ -148,7 +148,8 @@ class RecordLink extends \Zend\View\Helper\AbstractHelper
     {
         if (is_array($url)) {
             // Assemble URL string from array parts:
-            $source = isset($url['source']) ? $url['source'] : 'VuFind';
+            $source = isset($url['source'])
+                ? $url['source'] : DEFAULT_SEARCH_BACKEND;
             $finalUrl
                 = $this->getActionUrl("{$source}|" . $url['record'], $url['action']);
             if (isset($url['query'])) {
diff --git a/module/VuFind/src/VuFindTest/Unit/MinkTestCase.php b/module/VuFind/src/VuFindTest/Unit/MinkTestCase.php
index 455e1af1842381f759b779e433788696d3ec8b87..c740ec51f5e7028ae03c4cf51f5e80c3b4a363d2 100644
--- a/module/VuFind/src/VuFindTest/Unit/MinkTestCase.php
+++ b/module/VuFind/src/VuFindTest/Unit/MinkTestCase.php
@@ -140,7 +140,11 @@ abstract class MinkTestCase extends DbTestCase
     {
         // Sleep is not necessary for Zombie.js.
         if (!$this->isZombieDriver()) {
-            sleep($secs);
+            $snoozeMultiplier = intval(getenv('VUFIND_SNOOZE_MULTIPLIER'));
+            if ($snoozeMultiplier < 1) {
+                $snoozeMultiplier = 1;
+            }
+            sleep($secs * $snoozeMultiplier);
         }
     }
 
diff --git a/module/VuFind/src/VuFindTest/Unit/UserCreationTrait.php b/module/VuFind/src/VuFindTest/Unit/UserCreationTrait.php
index b4b72079b2f3fde76a63ec201ce92057e0129158..797736b271d136bc36a5089168dda8cb33032783 100644
--- a/module/VuFind/src/VuFindTest/Unit/UserCreationTrait.php
+++ b/module/VuFind/src/VuFindTest/Unit/UserCreationTrait.php
@@ -138,6 +138,7 @@ trait UserCreationTrait
     {
         $button = $this->findCss($page, '.modal-body .btn.btn-primary');
         $button->click();
+        $this->snooze();
     }
 
     /**
diff --git a/module/VuFind/tests/bootstrap.php b/module/VuFind/tests/bootstrap.php
index 7b32da1a8507841b71ec1f563d885572695d6d7c..b6cbebe2e442c34a6b66402a2a381e9fa8ba6295 100644
--- a/module/VuFind/tests/bootstrap.php
+++ b/module/VuFind/tests/bootstrap.php
@@ -7,15 +7,38 @@ define('VUFIND_PHPUNIT_RUNNING', 1);
 define('VUFIND_PHPUNIT_MODULE_PATH', __DIR__);
 
 // Define path to application directory
-defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__DIR__) . '/../..'));
+defined('APPLICATION_PATH')
+    || define(
+        'APPLICATION_PATH',
+        (getenv('VUFIND_APPLICATION_PATH') ? getenv('VUFIND_APPLICATION_PATH')
+            : dirname(__DIR__) . '/../..')
+    );
 
 // Define application environment
 defined('APPLICATION_ENV')
-    || define('APPLICATION_ENV', (getenv('VUFIND_ENV') ? getenv('VUFIND_ENV') : 'testing'));
+    || define(
+        'APPLICATION_ENV',
+        (getenv('VUFIND_ENV') ? getenv('VUFIND_ENV') : 'testing')
+    );
+
+// Define default search backend identifier
+defined('DEFAULT_SEARCH_BACKEND') || define('DEFAULT_SEARCH_BACKEND', 'VuFind');
 
 // Define path to local override directory
 defined('LOCAL_OVERRIDE_DIR')
-    || define('LOCAL_OVERRIDE_DIR', (getenv('VUFIND_LOCAL_DIR') ? getenv('VUFIND_LOCAL_DIR') : ''));
+    || define(
+        'LOCAL_OVERRIDE_DIR',
+        (getenv('VUFIND_LOCAL_DIR') ? getenv('VUFIND_LOCAL_DIR') : '')
+    );
+
+// Define path to cache directory
+defined('LOCAL_CACHE_DIR')
+    || define(
+        'LOCAL_CACHE_DIR',
+        (getenv('VUFIND_CACHE_DIR')
+            ? getenv('VUFIND_CACHE_DIR')
+            : (strlen(LOCAL_OVERRIDE_DIR) > 0 ? LOCAL_OVERRIDE_DIR . '/cache' : ''))
+    );
 
 chdir(APPLICATION_PATH);
 
diff --git a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/CartTest.php b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/CartTest.php
index b445a2c3cd216b05e76f31daa30c5b83126720b8..9b7616551f618f04c4655e79ca64cc7c311985c5 100644
--- a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/CartTest.php
+++ b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/CartTest.php
@@ -328,11 +328,10 @@ class CartTest extends \VuFindTest\Unit\MinkTestCase
         $this->submitLoginForm($page);
 
         // Save the favorites.
-        $submit = $this->findCss($page, '.modal-body input[name=submit]');
-        $submit->click();
-        $result = $this->findCss($page, '.modal-body .alert-info');
+        $this->findCss($page, '.modal-body input[name=submit]')->click();
+        $result = $this->findCss($page, '.modal-body .alert-success');
         $this->assertEquals(
-            'Your item(s) were saved successfully', $result->getText()
+            'Your item(s) were saved successfully. Go to List.', $result->getText()
         );
 
         // Click the close button.
diff --git a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/FavoritesTest.php b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/FavoritesTest.php
index dbbf422f15a5abfa78b52052732050f1fe2a8558..5552adb6e8d72848514a84501c70e404eb40dbec 100644
--- a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/FavoritesTest.php
+++ b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/FavoritesTest.php
@@ -95,7 +95,7 @@ class FavoritesTest extends \VuFindTest\Unit\MinkTestCase
 
         $page = $this->gotoRecord();
 
-        $this->findCss($page, '#save-record')->click();
+        $this->findCss($page, '.save-record')->click();
         $this->findCss($page, '.modal-body .createAccountLink')->click();
         // Empty
         $this->findCss($page, '.modal-body .btn.btn-primary.disabled');
@@ -108,12 +108,14 @@ class FavoritesTest extends \VuFindTest\Unit\MinkTestCase
         // Correct
         $this->findCss($page, '#account_email')->setValue('username1@ignore.com');
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
+        $this->snooze();
         $this->findCss($page, '#save_list');
         // Make list
         $this->findCss($page, '#make-list')->click();
+        $this->snooze();
         // Empty
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
-        $this->findCss($page, '#list_title');
+        $this->snooze();
         $this->findCss($page, '#list_title')->setValue('Test List');
         $this->findCss($page, '#list_desc')->setValue('Just. THE BEST.');
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
@@ -127,7 +129,7 @@ class FavoritesTest extends \VuFindTest\Unit\MinkTestCase
         $session = $this->getMinkSession();
         $recordURL = $this->stripHash($session->getCurrentUrl());
         $this->snooze();
-        $this->findCss($page, '#savedLists a')->click();
+        $this->findCss($page, '.savedLists a')->click();
         $this->snooze();
         $this->findCss($page, '.resultItemLine1 a')->click();
         $this->assertEquals($recordURL, $this->stripHash($session->getCurrentUrl()));
@@ -143,7 +145,7 @@ class FavoritesTest extends \VuFindTest\Unit\MinkTestCase
 
         $page = $this->gotoRecord();
 
-        $this->findCss($page, '#save-record')->click();
+        $this->findCss($page, '.save-record')->click();
         // Login
         // - empty
         $this->submitLoginForm($page);
@@ -191,10 +193,8 @@ class FavoritesTest extends \VuFindTest\Unit\MinkTestCase
         $this->findCss($page, '#loginOptions a')->click();
         $this->fillInLoginForm($page, 'username1', 'test');
         $this->submitLoginForm($page);
-        //$this->getMinkSession()->reload();
         // Save Record
-        $this->snooze();
-        $this->findCss($page, '#save-record')->click();
+        $this->findCss($page, '.save-record')->click();
         $this->snooze();
         $this->findCss($page, '#save_list');
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
@@ -231,9 +231,10 @@ class FavoritesTest extends \VuFindTest\Unit\MinkTestCase
         $this->findCss($page, '#save_list');
         // Make list
         $this->findCss($page, '#make-list')->click();
+        $this->snooze();
         // Empty
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
-        $this->findCss($page, '#list_title');
+        $this->snooze();
         $this->findCss($page, '#list_title')->setValue('Test List');
         $this->findCss($page, '#list_desc')->setValue('Just. THE BEST.');
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
@@ -296,7 +297,6 @@ class FavoritesTest extends \VuFindTest\Unit\MinkTestCase
             'Login Test List'
         );
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
-        $this->snooze();
         $this->findCss($page, '.alert.alert-info'); // .success?
     }
 
@@ -312,7 +312,6 @@ class FavoritesTest extends \VuFindTest\Unit\MinkTestCase
         $this->findCss($page, '#loginOptions a')->click();
         $this->fillInLoginForm($page, 'username2', 'test');
         $this->submitLoginForm($page);
-        $this->snooze();    // wait for login
         // Save Record
         $this->findCss($page, '.save-record')->click();
         $this->snooze();
diff --git a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/RecordActionsTest.php b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/RecordActionsTest.php
index 729ea2fb0eecdd1d364fbb065d02916024605c4c..82359d6a79eb0a25729db65bfb1004704940981b 100644
--- a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/RecordActionsTest.php
+++ b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/RecordActionsTest.php
@@ -93,33 +93,34 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
         $page = $this->gotoRecord();
         // Click add comment without logging in
         // TODO Rewrite for comment and login coming
-        $this->findCss($page, '#usercomments')->click();
-        $this->findCss($page, '#comment');
-        $this->assertEquals(
+        $this->findCss($page, '.record-tabs .usercomments')->click();
+        $this->findCss($page, '.comment-form');
+        $this->assertEquals(// Can Comment?
             'You must be logged in first',
-            $this->findCss($page, 'form.comment .btn.btn-primary')->getValue()
-        ); // Can Comment?
-        $this->findCss($page, 'form.comment .btn-primary')->click();
+            $this->findCss($page, 'form.comment-form .btn.btn-primary')->getValue()
+        );
+        $this->findCss($page, 'form.comment-form .btn-primary')->click();
         $this->findCss($page, '.modal.in'); // Lightbox open
         $this->findCss($page, '.modal [name="username"]');
         // Create new account
         $this->findCss($page, '.modal-body .createAccountLink')->click();
+        $this->snooze();
         $this->fillInAccountForm($page);
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
+        $this->snooze();
         // Make sure page updated for login
         $page = $this->gotoRecord();
-        $this->findCss($page, '#usercomments')->click();
-        $this->assertEquals(
+        $this->findCss($page, '.record-tabs .usercomments')->click();
+        $this->assertEquals(// Can Comment?
             'Add your comment',
-            $this->findCss($page, 'form.comment .btn.btn-primary')->getValue()
-        ); // Can Comment?
+            $this->findCss($page, 'form.comment-form .btn.btn-primary')->getValue()
+        );
+        // "Add" empty comment
+        $this->findCss($page, 'form.comment-form .btn-primary')->click();
         $this->assertNull($page->find('css', '.comment.row'));
         // Add comment
-        $this->findCss($page, '#comment')->setValue('one');
-        $this->findCss($page, 'form.comment .btn-primary')->click();
-        $this->findCss($page, '.comment.row');
-        // "Add" empty comment
-        $this->findCss($page, 'form.comment .btn-primary')->click();
+        $this->findCss($page, 'form.comment-form [name="comment"]')->setValue('one');
+        $this->findCss($page, 'form.comment-form .btn-primary')->click();
         $this->findCss($page, '.comment.row');
         // Remove comment
         $this->findCss($page, '.comment.row .delete')->click();
@@ -144,7 +145,9 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
         // Go to a record view
         $page = $this->gotoRecord();
         // Click to add tag
-        $this->findCss($page, '#tagRecord')->click();
+        $this->snooze();
+        $this->findCss($page, '.tag-record')->click();
+        $this->snooze();
         // Lightbox login open?
         $this->findCss($page, '.modal.in [name="username"]');
         // Make account
@@ -153,27 +156,28 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
             $page, ['username' => 'username2', 'email' => 'test2@com.com']
         );
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
+        $this->snooze();
         $this->findCss($page, '.modal #addtag_tag');
         $this->findCss($page, '.modal .close')->click();
         $this->snooze(); // wait for display to update
         $this->findCss($page, '.logoutOptions a[title="Log Out"]')->click();
+        $this->snooze();
         // Login
         $page = $this->gotoRecord(); // redirects to search home???
-        $this->findCss($page, '#tagRecord')->click();
+        $this->findCss($page, '.tag-record')->click();
+        $this->snooze();
         $this->fillInLoginForm($page, 'username2', 'test');
         $this->submitLoginForm($page);
-        //$this->findCss($page, '.modal #addtag_tag');
         // Add tags
         $this->findCss($page, '.modal #addtag_tag')->setValue('one 2 "three 4" five');
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
         $this->snooze();
         $success = $this->findCss($page, '.modal-body .alert-info');
-        $this->assertTrue(is_object($success));
         $this->assertEquals('Tags Saved', $success->getText());
         $this->findCss($page, '.modal .close')->click();
         // Count tags
         $this->snooze(); // wait for UI update
-        $tags = $page->findAll('css', '#tagList .tag');
+        $tags = $page->findAll('css', '.tagList .tag');
         $this->assertEquals(4, count($tags));
         $tvals = [];
         foreach ($tags as $i => $t) {
@@ -185,7 +189,7 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
         // Remove a tag
         $tags[0]->find('css', 'button')->click();
         $this->snooze(); // wait for UI update
-        $tags = $page->findAll('css', '#tagList .tag');
+        $tags = $page->findAll('css', '.tagList .tag');
         // Count tags with missing
         $sum = 0;
         foreach ($tags as $t) {
@@ -200,8 +204,8 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
         $this->snooze(); // wait for UI update
 
         // Flat tags
-        $this->assertNull($page->find('css', '#tagList .tag.selected'));
-        $this->assertNull($page->find('css', '#tagList .tag .fa'));
+        $this->assertNull($page->find('css', '.tagList .tag.selected'));
+        $this->assertNull($page->find('css', '.tagList .tag .fa'));
         // Login with second account
         $this->findCss($page, '#loginOptions a')->click();
         $this->snooze();
@@ -211,19 +215,19 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
         $this->snooze();
         $page = $this->gotoRecord();
         // Check selected == 0
-        $this->assertNull($page->find('css', '#tagList .tag.selected'));
-        $this->findCss($page, '#tagList .tag');
-        $this->findCss($page, '#tagList .tag .fa-plus');
+        $this->assertNull($page->find('css', '.tagList .tag.selected'));
+        $this->findCss($page, '.tagList .tag');
+        $this->findCss($page, '.tagList .tag .fa-plus');
         // Click one
-        $this->findCss($page, '#tagList .tag button')->click();
+        $this->findCss($page, '.tagList .tag button')->click();
         $this->snooze();
         // Check selected == 1
-        $this->findCss($page, '#tagList .tag.selected');
+        $this->findCss($page, '.tagList .tag.selected');
         // Click again
-        $this->findCss($page, '#tagList .tag button')->click();
+        $this->findCss($page, '.tagList .tag button')->click();
         $this->snooze();
         // Check selected == 0
-        $this->assertNull($page->find('css', '#tagList .tag.selected'));
+        $this->assertNull($page->find('css', '.tagList .tag.selected'));
         $this->findCss($page, '.logoutOptions a[title="Log Out"]')->click();
     }
 
@@ -242,19 +246,20 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
         // Go to a record view
         $page = $this->gotoRecord();
         // Click email record without logging in
-        $this->findCss($page, '#mail-record')->click();
+        $this->findCss($page, '.mail-record')->click();
+        $this->snooze();
         $this->findCss($page, '.modal.in [name="username"]');
         // Login in Lightbox
         $this->fillInLoginForm($page, 'username1', 'test');
         $this->submitLoginForm($page);
-        $this->snooze();
         // Make sure Lightbox redirects to email view
         $this->findCss($page, '.modal #email_to');
         // Close lightbox
         $this->findCss($page, '.modal .close')->click();
+        $this->snooze();
         // Click email
-        $page = $this->gotoRecord();
-        $this->findCss($page, '#mail-record')->click();
+        $this->findCss($page, '.mail-record')->click();
+        $this->snooze();
         $this->findCss($page, '.modal #email_to');
         // Type invalid email
         $this->findCss($page, '.modal #email_to')->setValue('blargarsaurus');
@@ -272,6 +277,7 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
         // Send text to false email
         $this->findCss($page, '.modal #email_to')->setValue('asdf@vufind.org');
         $this->findCss($page, '.modal-body .btn.btn-primary')->click();
+        $this->snooze();
         // Check for confirmation message
         $this->findCss($page, '.modal .alert-info');
         // Logout
@@ -293,7 +299,7 @@ class RecordActionsTest extends \VuFindTest\Unit\MinkTestCase
         // Go to a record view
         $page = $this->gotoRecord();
         // Click SMS
-        $this->findCss($page, '#sms-record')->click();
+        $this->findCss($page, '.sms-record')->click();
         // Type invalid phone numbers
         // - too empty
         $this->findCss($page, '.modal #sms_to')->setValue('');
diff --git a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/RecordTest.php b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/RecordTest.php
index af0169e3e900f766f253959f0d71dc05cb445a71..0a78661d2953e7fef8539726dc2467115253b359 100644
--- a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/RecordTest.php
+++ b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/RecordTest.php
@@ -55,12 +55,12 @@ class RecordTest extends \VuFindTest\Unit\MinkTestCase
         $session->visit($url);
         $this->assertHttpStatus(200);
         $page = $session->getPage();
-        $staffViewTab = $this->findCss($page, '#details');
+        $staffViewTab = $this->findCss($page, '.record-tabs .details');
         $this->assertEquals('Staff View', $staffViewTab->getText());
         $staffViewTab->click();
         $this->snooze();
         $this->assertEquals($url . '#details', $session->getCurrentUrl());
-        $staffViewTable = $this->findCss($page, '#details-tab table.citation');
+        $staffViewTable = $this->findCss($page, '.record-tabs .details-tab table.citation');
         $this->assertEquals('LEADER', substr($staffViewTable->getText(), 0, 6));
     }
 
diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/Content/Covers/BuchhandelTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/Content/Covers/BuchhandelTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..abed471da53bdaba36f617d818d9901f625b1c30
--- /dev/null
+++ b/module/VuFind/tests/unit-tests/src/VuFindTest/Content/Covers/BuchhandelTest.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Unit tests for Buchhandel cover loader.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2010.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Jochen Lienhard <lienhard@ub.uni-freiburg.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+namespace VuFindTest\Content\Covers;
+use VuFindCode\ISBN, VuFind\Content\Covers\Buchhandel;
+
+/**
+ * Unit tests for Booksite cover loader.
+ *
+ * @category VuFind2
+ * @package  Search
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Jochen Lienhard <lienhard@ub.uni-freiburg.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     http://vufind.org
+ */
+class BuchhandelTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Test cover loading
+     *
+     * @return void
+     */
+    public function testValidCoverLoading()
+    {
+        $loader = new Buchhandel('http://base/', 'mytoken');
+        $this->assertEquals(
+            'http://base/9780739313121/s?access_token=mytoken',
+            $loader->getUrl(
+                'mytoken', 'small', ['isbn' => new ISBN('0739313126')]
+            )
+        );
+    }
+
+    /**
+     * Test missing ISBN
+     *
+     * @return void
+     */
+    public function testMissingIsbn()
+    {
+        $loader = new Buchhandel('http://base', 'mytoken');
+        $this->assertEquals(false, $loader->getUrl('mytoken', 'small', []));
+    }
+}
diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/DAIATest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/DAIATest.php
index 326f97fa7cf9a5d655c64532657462c2c271c4cd..0b2d4c6c3f316c6b5d5cc801e87cd3e524482965 100644
--- a/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/DAIATest.php
+++ b/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/DAIATest.php
@@ -127,7 +127,6 @@ class DAIATest extends \VuFindTest\Unit\ILSDriverTestCase
 
         // exact result for using the DAIA.php with testfile daia.json
 
-
         $this->assertEquals($result, $this->testResult);
     }
 
diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/Recommend/FavoriteFacetsTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/Recommend/FavoriteFacetsTest.php
index 7f677aeb85394197ea251e72c184c8e677a8963a..1643a714ba9f3f1fc2ee1fdf1962ff734aa6d542 100644
--- a/module/VuFind/tests/unit-tests/src/VuFindTest/Recommend/FavoriteFacetsTest.php
+++ b/module/VuFind/tests/unit-tests/src/VuFindTest/Recommend/FavoriteFacetsTest.php
@@ -46,13 +46,10 @@ class FavoriteFacetsTest extends \VuFindTest\Unit\TestCase
      */
     public function testFacetInitWithDisabledTags()
     {
-        $configLoader = $this->getMockConfigLoader(
-            ['Social' => ['tags' => false]]
-        );
         $results = $this->getMockResults();
         $params = $results->getParams();
         $params->expects($this->exactly(0))->method('addFacet'); // no facets are expected in this case
-        $this->getFavoriteFacets($configLoader, $results);
+        $this->getFavoriteFacets($results, 'disabled');
     }
     /**
      * Test facet initialization with enabled tags.
@@ -64,21 +61,22 @@ class FavoriteFacetsTest extends \VuFindTest\Unit\TestCase
         $results = $this->getMockResults();
         $params = $results->getParams();
         $params->expects($this->once())->method('addFacet')->with($this->equalTo('tags'), $this->equalTo('Your Tags'), $this->equalTo(false));
-        $this->getFavoriteFacets(null, $results);
+        $this->getFavoriteFacets($results);
     }
 
     /**
      * Get a fully configured module
      *
-     * @param \VuFind\Config\PluginManager                $configLoader config loader
      * @param \VuFind\Search\Solr\Results                 $results      results object
+     * @param string                                      $tagSetting   Are tags enabled?
      * @param string                                      $settings     settings
      * @param \Zend\StdLib\Parameters                     $request      request
      * @param \VuFind\Search\Solr\HierarchicalFacetHelper $facetHelper  hierarchical facet helper (true to build default, null to omit)
+     * @param \VuFind\Config\PluginManager                $configLoader config loader
      *
      * @return FavoriteFacets
      */
-    protected function getFavoriteFacets($configLoader = null, $results = null, $settings = '', $request = null, $facetHelper = null)
+    protected function getFavoriteFacets($results = null, $tagSetting = 'enabled', $settings = '', $request = null, $facetHelper = null, $configLoader = null)
     {
         if (null === $configLoader) {
             $configLoader = $this->getMockConfigLoader();
@@ -92,7 +90,7 @@ class FavoriteFacetsTest extends \VuFindTest\Unit\TestCase
         if (null === $request) {
             $request = new \Zend\StdLib\Parameters([]);
         }
-        $sf = new FavoriteFacets($configLoader, $facetHelper);
+        $sf = new FavoriteFacets($configLoader, $facetHelper, $tagSetting);
         $sf->setConfig($settings);
         $sf->init($results->getParams(), $request);
         $sf->process($results);
@@ -111,7 +109,7 @@ class FavoriteFacetsTest extends \VuFindTest\Unit\TestCase
     {
         $loader = $this->getMockBuilder('VuFind\Config\PluginManager')
             ->disableOriginalConstructor()->getMock();
-        $loader->expects($this->once())->method('get')->with($this->equalTo($key))
+        $loader->expects($this->any())->method('get')->with($this->equalTo($key))
             ->will($this->returnValue(new \Zend\Config\Config($config)));
         return $loader;
     }
diff --git a/module/VuFindConsole/Module.php b/module/VuFindConsole/Module.php
index 0bbe894155c6caf45357b7c1757191c182a93ce2..282ccd747779fd6ded2d800944cc5d962f6621f3 100644
--- a/module/VuFindConsole/Module.php
+++ b/module/VuFindConsole/Module.php
@@ -89,6 +89,7 @@ class Module implements \Zend\ModuleManager\Feature\ConsoleUsageProviderInterfac
             'language copystring' => 'Copy one language string to another',
             'language delete' => 'Remove a language string from all files',
             'language normalize' => 'Normalize a directory of language files',
+            'util commit' => 'Solr commit tool',
             'util createHierarchyTrees' => 'Cache populator for hierarchies',
             'util cssBuilder' => 'LESS compiler',
             'util deletes' => 'Tool for deleting Solr records',
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/EDS/Backend.php b/module/VuFindSearch/src/VuFindSearch/Backend/EDS/Backend.php
index 845a9e43133a1a4cb53835a76065d4560a2be448..85711249409e3e9897bde463f7fc94150986bf56 100644
--- a/module/VuFindSearch/src/VuFindSearch/Backend/EDS/Backend.php
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/EDS/Backend.php
@@ -27,6 +27,8 @@
  */
 namespace VuFindSearch\Backend\EDS;
 
+use Exception;
+
 use VuFindSearch\Backend\EDS\Zend2 as ApiClient;
 
 use VuFindSearch\Query\AbstractQuery;
@@ -132,6 +134,13 @@ class Backend extends AbstractBackend
      */
     protected $session;
 
+    /**
+     * Is the current user a guest?
+     *
+     * @var bool
+     */
+    protected $isGuest;
+
     /**
      * Constructor.
      *
@@ -140,16 +149,18 @@ class Backend extends AbstractBackend
      * @param CacheAdapter                     $cache   Object cache
      * @param SessionContainer                 $session Session container
      * @param Config                           $config  Object representing EDS.ini
+     * @param bool                             $isGuest Is the current user a guest?
      */
     public function __construct(ApiClient $client,
         RecordCollectionFactoryInterface $factory, CacheAdapter $cache,
-        SessionContainer $session, Config $config = null
+        SessionContainer $session, Config $config = null, $isGuest = true
     ) {
-        // Save dependencies:
+        // Save dependencies/incoming parameters:
         $this->client = $client;
         $this->setRecordCollectionFactory($factory);
         $this->cache = $cache;
         $this->session = $session;
+        $this->isGuest = $isGuest;
 
         // Extract key values from configuration:
         if (isset($config->EBSCO_Account->user_name)) {
@@ -297,7 +308,7 @@ class Backend extends AbstractBackend
                         $sessionToken = $this->getSessionToken(true);
                     }
                     $response = $this->client->retrieve(
-                        $an, $dbId,  $authenticationToken, $sessionToken, $hlTerms
+                        $an, $dbId, $authenticationToken, $sessionToken, $hlTerms
                     );
                 } catch(Exception $e) {
                     throw new BackendException($e->getMessage(), $e->getCode(), $e);
@@ -498,23 +509,13 @@ class Backend extends AbstractBackend
     }
 
     /**
-     * Determines whether or not the current user session is identifed as a guest
-     * session
+     * Is the current user a guest? If so, return 'y' else 'n'.
      *
-     * @return string 'y'|'n'
+     * @return string
      */
     protected function isGuest()
     {
-        // If the user is not logged in, then treat them as a guest. Unless they are
-        // using IP Authentication.
-        // If IP Authentication is used, then don't treat them as a guest.
-        if ($this->ipAuth) {
-            return 'n';
-        }
-        if (isset($this->authManager)) {
-            return $this->authManager->isLoggedIn() ? 'n' : 'y';
-        }
-        return 'y';
+        return $this->isGuest ? 'y' : 'n';
     }
 
     /**
@@ -531,7 +532,7 @@ class Backend extends AbstractBackend
     {
         try {
             $authToken = $this->getAuthenticationToken();
-            $results = $this->client->createSession($profile,  $isGuest, $authToken);
+            $results = $this->client->createSession($profile, $isGuest, $authToken);
         } catch(\EbscoEdsApiException $e) {
             $errorCode = $e->getApiErrorCode();
             $desc = $e->getApiErrorDescription();
@@ -543,7 +544,7 @@ class Backend extends AbstractBackend
                 try {
                     $authToken = $this->getAuthenticationToken(true);
                     $results = $this->client
-                        ->createSession($this->profile,  $isGuest, $authToken);
+                        ->createSession($this->profile, $isGuest, $authToken);
                 } catch(Exception $e) {
                     throw new BackendException(
                         $e->getMessage(),
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php
index 42f0464bd3841d7f57efe506c0689eb81cb1edc5..1984f10ba3ebbf9333ce269dbfebf556db26edb2 100644
--- a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php
@@ -133,9 +133,13 @@ class Backend extends AbstractBackend implements RetrieveBatchInterface
      */
     public function retrieve($id, ParamBag $params = null)
     {
+        $onCampus = (null !== $params) ? $params->get('onCampus') : [false];
+        $onCampus = $onCampus ? $onCampus[0] : false;
         try {
             $response   = $this->connector
-                ->getRecord($id, $this->connector->getInstitutionCode());
+                ->getRecord(
+                    $id, $this->connector->getInstitutionCode(), $onCampus
+                );
         } catch (\Exception $e) {
             throw new BackendException(
                 $e->getMessage(),
@@ -158,6 +162,9 @@ class Backend extends AbstractBackend implements RetrieveBatchInterface
      */
     public function retrieveBatch($ids, ParamBag $params = null)
     {
+        $onCampus = (null !== $params) ? $params->get('onCampus') : [false];
+        $onCampus = $onCampus ? $onCampus[0] : false;
+
         // Load 100 records at a time; this is a good number to avoid memory
         // problems while still covering a lot of ground.
         $pageSize = 100;
@@ -169,7 +176,7 @@ class Backend extends AbstractBackend implements RetrieveBatchInterface
 
             try {
                 $response = $this->connector->getRecords(
-                    $currentPage, $this->connector->getInstitutionCode()
+                    $currentPage, $this->connector->getInstitutionCode(), $onCampus
                 );
             } catch (\Exception $e) {
                 throw new BackendException(
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php
index 71a51d7a089b14e9133baa0ee720c0f63803c166..ed2069ff94e24b1a89e3299012bcae346832e3bd 100644
--- a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php
@@ -595,11 +595,12 @@ class Connector implements \Zend\Log\LoggerAwareInterface
      *
      * @param string $recordId  The document to retrieve from the Primo API
      * @param string $inst_code Institution code (optional)
+     * @param bool   $onCampus  Whether the user is on campus
      *
      * @throws \Exception
      * @return string    The requested resource
      */
-    public function getRecord($recordId, $inst_code = null)
+    public function getRecord($recordId, $inst_code = null, $onCampus = false)
     {
         // Query String Parameters
         if (isset($recordId)) {
@@ -607,7 +608,7 @@ class Connector implements \Zend\Log\LoggerAwareInterface
             $qs[] = 'query=rid,exact,"' . urlencode(addcslashes($recordId, '"'))
                 . '"';
             $qs[] = "institution=$inst_code";
-            $qs[] = "onCampus=true";
+            $qs[] = 'onCampus=' . ($onCampus ? 'true' : 'false');
             $qs[] = "indx=1";
             $qs[] = "bulkSize=1";
             $qs[] = "loc=adaptor,primo_central_multiple_fe";
@@ -626,11 +627,12 @@ class Connector implements \Zend\Log\LoggerAwareInterface
      *
      * @param array  $recordIds The documents to retrieve from the Primo API
      * @param string $inst_code Institution code (optional)
+     * @param bool   $onCampus  Whether the user is on campus
      *
      * @throws \Exception
      * @return string    The requested resource
      */
-    public function getRecords($recordIds, $inst_code = null)
+    public function getRecords($recordIds, $inst_code = null, $onCampus = false)
     {
         // Callback function for formatting IDs:
         $formatIds = function ($i) {
@@ -643,7 +645,7 @@ class Connector implements \Zend\Log\LoggerAwareInterface
             $recordIds = array_map($formatIds, $recordIds);
             $qs[] = 'query=rid,contains,' . urlencode(implode(' OR ', $recordIds));
             $qs[] = "institution=$inst_code";
-            $qs[] = "onCampus=true";
+            $qs[] = 'onCampus=' . ($onCampus ? 'true' : 'false');
             $qs[] = "indx=1";
             $qs[] = "bulkSize=" . count($recordIds);
             $qs[] = "loc=adaptor,primo_central_multiple_fe";
diff --git a/public/index.php b/public/index.php
index de75a183832caa2c56a43843ec5c2a770c524a2c..67cf9646514666a589f01051c02dbc4ff9304d6b 100644
--- a/public/index.php
+++ b/public/index.php
@@ -26,6 +26,9 @@ defined('APPLICATION_ENV')
         (getenv('VUFIND_ENV') ? getenv('VUFIND_ENV') : 'production')
     );
 
+// Define default search backend identifier
+defined('DEFAULT_SEARCH_BACKEND') || define('DEFAULT_SEARCH_BACKEND', 'VuFind');
+
 // Define path to local override directory
 defined('LOCAL_OVERRIDE_DIR')
     || define(
@@ -38,7 +41,8 @@ defined('LOCAL_CACHE_DIR')
     || define(
         'LOCAL_CACHE_DIR',
         (getenv('VUFIND_CACHE_DIR')
-            ? getenv('VUFIND_CACHE_DIR') : LOCAL_OVERRIDE_DIR . '/cache')
+            ? getenv('VUFIND_CACHE_DIR')
+            : (strlen(LOCAL_OVERRIDE_DIR) > 0 ? LOCAL_OVERRIDE_DIR . '/cache' : ''))
     );
 
 // Save original working directory in case we need to remember our context, then
diff --git a/solr/.gitignore b/solr/.gitignore
index fb0bfbfe63692def072504d27d99a1dbb4898958..691ca7f18b9dec2a4d5e613909ca94b677a86ac6 100644
--- a/solr/.gitignore
+++ b/solr/.gitignore
@@ -1,4 +1,6 @@
 alphabetical_browse
+logs
+*/conf/_rest_managed.json
 */index
 */spellchecker
 */spellShingle
diff --git a/themes/bootprint3/css/compiled.css b/themes/bootprint3/css/compiled.css
index 5d1ec484a9d03731aebc302d211f3dc45594219f..aabed73391ca7aac817d4d8a77e2bf34365f142e 100644
--- a/themes/bootprint3/css/compiled.css
+++ b/themes/bootprint3/css/compiled.css
@@ -1 +1 @@
-/*! normalize.css v3.0.2 | MIT License | git.io/normalize */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: .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{-moz-box-sizing: content-box;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;-moz-box-sizing: content-box;-webkit-box-sizing: content-box;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: .35em .625em .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}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 th,.table-bordered td{border: 1px solid #ddd !important}}@font-face{font-family: 'Glyphicons Halflings';src: url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.eot');src: url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../../themes/bootstrap3/css/less/fonts/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: "\2a"}.glyphicon-plus:before{content: "\2b"}.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"}*{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}*:before,*:after{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}html{font-size: 10px;-webkit-tap-highlight-color: rgba(0,0,0,0)}body{font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 13px;line-height: 1.42857143;color: #333;background-color: #fff}input,button,select,textarea{font-family: inherit;font-size: inherit;line-height: inherit}a{color: #12538b;text-decoration: none}a:hover,a:focus{color: #092b47;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,.thumbnail > img,.thumbnail a > img,.carousel-inner > .item > img,.carousel-inner > .item > a > img{display: block;max-width: 100%;height: auto}.img-rounded{border-radius: 5px}.img-thumbnail{padding: 4px;line-height: 1.42857143;background-color: #fff;border: 1px solid #ddd;border-radius: 3px;-webkit-transition: all .2s ease-in-out;-o-transition: all .2s ease-in-out;transition: all .2s ease-in-out;display: inline-block;max-width: 100%;height: auto}.img-circle{border-radius: 50%}hr{margin-top: 18px;margin-bottom: 18px;border: 0;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}[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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight: normal;line-height: 1;color: #777}h1,.h1,h2,.h2,h3,.h3{margin-top: 18px;margin-bottom: 9px}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,.h4,h5,.h5,h6,.h6{margin-top: 9px;margin-bottom: 9px}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: 33px}h2,.h2{font-size: 27px}h3,.h3{font-size: 23px}h4,.h4{font-size: 17px}h5,.h5{font-size: 13px}h6,.h6{font-size: 12px}p{margin: 0 0 9px}.lead{margin-bottom: 18px;font-size: 14px;font-weight: 300;line-height: 1.4}@media (min-width: 768px){.lead{font-size: 19.5px}}small,.small{font-size: 92%}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{text-transform: uppercase}.text-capitalize{text-transform: capitalize}.text-muted{color: #777}.text-primary{color: #619144}a.text-primary:hover{color: #4a6e34}.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: #619144}a.bg-primary:hover{background-color: #4a6e34}.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}.page-header{padding-bottom: 8px;margin: 36px 0 18px;border-bottom: 1px solid #eee}ul,ol{margin-top: 0;margin-bottom: 9px}ul ul,ol ul,ul ol,ol ol{margin-bottom: 0}.list-unstyled{padding-left: 0;list-style: none}.list-inline{padding-left: 0;list-style: none;margin: 0;margin-left: -5px}.list-inline > li{display: inline-block;padding-left: 5px;padding-right: 5px}dl{margin-top: 0;margin-bottom: 18px}dt,dd{line-height: 1.42857143}dt{font-weight: bold}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}}abbr[title],abbr[data-original-title]{cursor: help;border-bottom: 1px dotted #777}.initialism{font-size: 90%;text-transform: uppercase}blockquote{padding: 9px 18px;margin: 0 0 18px;font-size: 16.25px;border-left: 5px solid #eee}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.42857143;color: #777}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 #eee;border-left: 0;text-align: right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content: ''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content: '\00A0 \2014'}address{margin-bottom: 18px;font-style: normal;line-height: 1.42857143}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: 3px}kbd{padding: 2px 4px;font-size: 90%;color: #fff;background-color: #333;border-radius: 2px;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: 8.5px;margin: 0 0 9px;font-size: 12px;line-height: 1.42857143;word-break: break-all;word-wrap: break-word;color: #333;background-color: #f5f5f5;border: 1px solid #ccc;border-radius: 3px}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: 7px;padding-right: 7px}@media (min-width: 768px){.container{width: 734px}}@media (min-width: 992px){.container{width: 952px}}@media (min-width: 1200px){.container{width: 952px}}.container-fluid{margin-right: auto;margin-left: auto;padding-left: 7px;padding-right: 7px}.row{margin-left: -7px;margin-right: -7px}.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: 7px;padding-right: 7px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float: left}.col-xs-12{width: 100%}.col-xs-11{width: 91.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-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float: left}.col-sm-12{width: 100%}.col-sm-11{width: 91.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-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float: left}.col-md-12{width: 100%}.col-md-11{width: 91.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-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float: left}.col-lg-12{width: 100%}.col-lg-11{width: 91.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%}}table{background-color: transparent}caption{padding-top: 8px;padding-bottom: 8px;color: #777;text-align: left}th{text-align: left}.table{width: 100%;max-width: 100%;margin-bottom: 18px}.table > thead > tr > th,.table > tbody > tr > th,.table > tfoot > tr > th,.table > thead > tr > td,.table > tbody > tr > td,.table > tfoot > tr > td{padding: 8px;line-height: 1.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 > th,.table > colgroup + thead > tr:first-child > th,.table > thead:first-child > tr:first-child > th,.table > caption + thead > tr:first-child > td,.table > colgroup + thead > tr:first-child > td,.table > thead:first-child > tr:first-child > td{border-top: 0}.table > tbody + tbody{border-top: 2px solid #ddd}.table .table{background-color: #fff}.table-condensed > thead > tr > th,.table-condensed > tbody > tr > th,.table-condensed > tfoot > tr > th,.table-condensed > thead > tr > td,.table-condensed > tbody > tr > td,.table-condensed > tfoot > tr > td{padding: 5px}.table-bordered{border: 1px solid #ddd}.table-bordered > thead > tr > th,.table-bordered > tbody > tr > th,.table-bordered > tfoot > tr > th,.table-bordered > thead > tr > td,.table-bordered > tbody > tr > td,.table-bordered > tfoot > tr > td{border: 1px solid #ddd}.table-bordered > thead > tr > th,.table-bordered > thead > tr > td{border-bottom-width: 2px}.table-striped > tbody > tr:nth-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 > tbody > tr > td.active,.table > tfoot > tr > td.active,.table > thead > tr > th.active,.table > tbody > tr > th.active,.table > tfoot > tr > th.active,.table > thead > tr.active > td,.table > tbody > tr.active > td,.table > tfoot > tr.active > td,.table > thead > tr.active > th,.table > tbody > tr.active > th,.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 > tbody > tr > td.success,.table > tfoot > tr > td.success,.table > thead > tr > th.success,.table > tbody > tr > th.success,.table > tfoot > tr > th.success,.table > thead > tr.success > td,.table > tbody > tr.success > td,.table > tfoot > tr.success > td,.table > thead > tr.success > th,.table > tbody > tr.success > th,.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 > tbody > tr > td.info,.table > tfoot > tr > td.info,.table > thead > tr > th.info,.table > tbody > tr > th.info,.table > tfoot > tr > th.info,.table > thead > tr.info > td,.table > tbody > tr.info > td,.table > tfoot > tr.info > td,.table > thead > tr.info > th,.table > tbody > tr.info > th,.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 > tbody > tr > td.warning,.table > tfoot > tr > td.warning,.table > thead > tr > th.warning,.table > tbody > tr > th.warning,.table > tfoot > tr > th.warning,.table > thead > tr.warning > td,.table > tbody > tr.warning > td,.table > tfoot > tr.warning > td,.table > thead > tr.warning > th,.table > tbody > tr.warning > th,.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 > tbody > tr > td.danger,.table > tfoot > tr > td.danger,.table > thead > tr > th.danger,.table > tbody > tr > th.danger,.table > tfoot > tr > th.danger,.table > thead > tr.danger > td,.table > tbody > tr.danger > td,.table > tfoot > tr.danger > td,.table > thead > tr.danger > th,.table > tbody > tr.danger > th,.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: 13.5px;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 > tbody > tr > th,.table-responsive > .table > tfoot > tr > th,.table-responsive > .table > thead > tr > td,.table-responsive > .table > tbody > tr > td,.table-responsive > .table > tfoot > tr > td{white-space: nowrap}.table-responsive > .table-bordered{border: 0}.table-responsive > .table-bordered > thead > tr > th:first-child,.table-responsive > .table-bordered > tbody > tr > th:first-child,.table-responsive > .table-bordered > tfoot > tr > th:first-child,.table-responsive > .table-bordered > thead > tr > td:first-child,.table-responsive > .table-bordered > tbody > tr > td:first-child,.table-responsive > .table-bordered > tfoot > tr > td:first-child{border-left: 0}.table-responsive > .table-bordered > thead > tr > th:last-child,.table-responsive > .table-bordered > tbody > tr > th:last-child,.table-responsive > .table-bordered > tfoot > tr > th:last-child,.table-responsive > .table-bordered > thead > tr > td:last-child,.table-responsive > .table-bordered > tbody > tr > td:last-child,.table-responsive > .table-bordered > tfoot > tr > td:last-child{border-right: 0}.table-responsive > .table-bordered > tbody > tr:last-child > th,.table-responsive > .table-bordered > tfoot > tr:last-child > th,.table-responsive > .table-bordered > tbody > tr:last-child > td,.table-responsive > .table-bordered > tfoot > tr:last-child > td{border-bottom: 0}}fieldset{padding: 0;margin: 0;border: 0;min-width: 0}legend{display: block;width: 100%;padding: 0;margin-bottom: 18px;font-size: 19.5px;line-height: inherit;color: #333;border: 0;border-bottom: 1px solid #777}label{display: inline-block;max-width: 100%;margin-bottom: 5px;font-weight: bold}input[type="search"]{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}input[type="radio"],input[type="checkbox"]{margin: 4px 0 0;margin-top: 1px \9;line-height: normal}input[type="file"]{display: block}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: 4px;font-size: 13px;line-height: 1.42857143;color: #555}.form-control{display: block;width: 100%;height: 26px;padding: 3px 5px;font-size: 13px;line-height: 1.42857143;color: #555;background-color: #fff;background-image: none;border: 1px solid #ccc;border-radius: 3px;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color: #619144;outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(97,145,68,0.6);box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(97,145,68,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[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color: #eee;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"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height: 26px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.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"]{line-height: 22px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.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"]{line-height: 41px}}.form-group{margin-bottom: 15px}.radio,.checkbox{position: relative;display: block;margin-top: 10px;margin-bottom: 10px}.radio label,.checkbox label{min-height: 18px;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="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor: not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor: not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor: not-allowed}.form-control-static{padding-top: 4px;padding-bottom: 4px;margin-bottom: 0;min-height: 31px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left: 0;padding-right: 0}.input-sm{height: 22px;padding: 1px 2px;font-size: 12px;line-height: 1.5;border-radius: 2px}select.input-sm{height: 22px;line-height: 22px}textarea.input-sm,select[multiple].input-sm{height: auto}.form-group-sm .form-control{height: 22px;padding: 1px 2px;font-size: 12px;line-height: 1.5;border-radius: 2px}select.form-group-sm .form-control{height: 22px;line-height: 22px}textarea.form-group-sm .form-control,select[multiple].form-group-sm .form-control{height: auto}.form-group-sm .form-control-static{height: 22px;padding: 1px 2px;font-size: 12px;line-height: 1.5;min-height: 30px}.input-lg{height: 41px;padding: 8px 5px;font-size: 17px;line-height: 1.3333333;border-radius: 5px}select.input-lg{height: 41px;line-height: 41px}textarea.input-lg,select[multiple].input-lg{height: auto}.form-group-lg .form-control{height: 41px;padding: 8px 5px;font-size: 17px;line-height: 1.3333333;border-radius: 5px}select.form-group-lg .form-control{height: 41px;line-height: 41px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height: auto}.form-group-lg .form-control-static{height: 41px;padding: 8px 5px;font-size: 17px;line-height: 1.3333333;min-height: 35px}.has-feedback{position: relative}.has-feedback .form-control{padding-right: 32.5px}.form-control-feedback{position: absolute;top: 0;right: 0;z-index: 2;display: block;width: 26px;height: 26px;line-height: 26px;text-align: center;pointer-events: none}.input-lg + .form-control-feedback{width: 41px;height: 41px;line-height: 41px}.input-sm + .form-control-feedback{width: 22px;height: 22px;line-height: 22px}.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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color: #2b542c;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #67b168;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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color: #66512c;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #c0a16b;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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color: #843534;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483;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: 23px}.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: 4px}.form-horizontal .radio,.form-horizontal .checkbox{min-height: 22px}.form-horizontal .form-group{margin-left: -7px;margin-right: -7px}@media (min-width: 768px){.form-horizontal .control-label{text-align: right;margin-bottom: 0;padding-top: 4px}}.form-horizontal .has-feedback .form-control-feedback{right: 7px}@media (min-width: 768px){.form-horizontal .form-group-lg .control-label{padding-top: 11.6666664px}}@media (min-width: 768px){.form-horizontal .form-group-sm .control-label{padding-top: 2px}}.btn{display: inline-block;margin-bottom: 0;font-weight: normal;text-align: center;vertical-align: middle;touch-action: manipulation;cursor: pointer;background-image: none;border: 1px solid transparent;white-space: nowrap;padding: 3px 5px;font-size: 13px;line-height: 1.42857143;border-radius: 3px;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.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;-webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);box-shadow: inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor: not-allowed;pointer-events: none;opacity: .65;filter: alpha(opacity=65);-webkit-box-shadow: none;box-shadow: none}.btn-default{color: #333;background-color: #fff;border-color: #ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open > .dropdown-toggle.btn-default{color: #333;background-color: #e6e6e6;border-color: #adadad}.btn-default:active,.btn-default.active,.open > .dropdown-toggle.btn-default{background-image: none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color: #fff;border-color: #ccc}.btn-default .badge{color: #fff;background-color: #333}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color: #fff;background-color: #333;border-color: #adadad}.btn-primary{color: #fff;background-color: #619144;border-color: #fff}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary{color: #fff;background-color: #4a6e34;border-color: #e0e0e0}.btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary{background-image: none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color: #619144;border-color: #fff}.btn-primary .badge{color: #619144;background-color: #fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color: #619144;background-color: #fff;border-color: #e0e0e0}.btn-success{color: #fff;background-color: #028302;border-color: #fff}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open > .dropdown-toggle.btn-success{color: #fff;background-color: #015101;border-color: #e0e0e0}.btn-success:active,.btn-success.active,.open > .dropdown-toggle.btn-success{background-image: none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color: #028302;border-color: #fff}.btn-success .badge{color: #028302;background-color: #fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color: #028302;background-color: #fff;border-color: #e0e0e0}.btn-info{color: #fff;background-color: #1c5f74;border-color: #fff}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open > .dropdown-toggle.btn-info{color: #fff;background-color: #123d4b;border-color: #e0e0e0}.btn-info:active,.btn-info.active,.open > .dropdown-toggle.btn-info{background-image: none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color: #1c5f74;border-color: #fff}.btn-info .badge{color: #1c5f74;background-color: #fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color: #1c5f74;background-color: #fff;border-color: #e0e0e0}.btn-warning{color: #fff;background-color: #a56100;border-color: #fff}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open > .dropdown-toggle.btn-warning{color: #fff;background-color: #724300;border-color: #e0e0e0}.btn-warning:active,.btn-warning.active,.open > .dropdown-toggle.btn-warning{background-image: none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color: #a56100;border-color: #fff}.btn-warning .badge{color: #a56100;background-color: #fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color: #a56100;background-color: #fff;border-color: #e0e0e0}.btn-danger{color: #fff;background-color: #a41915;border-color: #fff}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger{color: #fff;background-color: #77120f;border-color: #e0e0e0}.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger{background-image: none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color: #a41915;border-color: #fff}.btn-danger .badge{color: #a41915;background-color: #fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color: #a41915;background-color: #fff;border-color: #e0e0e0}.btn-link{color: #12538b;font-weight: normal;border-radius: 0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color: transparent;-webkit-box-shadow: none;box-shadow: none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color: transparent}.btn-link:hover,.btn-link:focus{color: #092b47;text-decoration: underline;background-color: transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color: #777;text-decoration: none}.btn-lg,.btn-group-lg > .btn{padding: 8px 5px;font-size: 17px;line-height: 1.3333333;border-radius: 5px}.btn-sm,.btn-group-sm > .btn{padding: 1px 2px;font-size: 12px;line-height: 1.5;border-radius: 2px}.btn-xs,.btn-group-xs > .btn{padding: 1px 1px;font-size: 12px;line-height: 1.5;border-radius: 2px}.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;-webkit-transition: opacity .15s linear;-o-transition: opacity .15s linear;transition: opacity .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;-webkit-transition-property: height, visibility;transition-property: height, visibility;-webkit-transition-duration: .35s;transition-duration: .35s;-webkit-transition-timing-function: ease;transition-timing-function: ease}.caret{display: inline-block;width: 0;height: 0;margin-left: 2px;vertical-align: middle;border-top: 4px dashed;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: 13px;text-align: left;background-color: #fff;border: 1px solid #ccc;border: 1px solid rgba(0,0,0,0.15);border-radius: 3px;-webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175);box-shadow: 0 6px 12px rgba(0,0,0,0.175);background-clip: padding-box}.dropdown-menu.pull-right{right: 0;left: auto}.dropdown-menu .divider{height: 1px;margin: 8px 0;overflow: hidden;background-color: #e5e5e5}.dropdown-menu > li > a{display: block;padding: 3px 20px;clear: both;font-weight: normal;line-height: 1.42857143;color: #333;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: #619144}.dropdown-menu > .disabled > a,.dropdown-menu > .disabled > a:hover,.dropdown-menu > .disabled > a:focus{color: #777}.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.42857143;color: #777;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 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 > .btn,.btn-group-vertical > .btn{position: relative;float: left}.btn-group > .btn:hover,.btn-group-vertical > .btn:hover,.btn-group > .btn:focus,.btn-group-vertical > .btn:focus,.btn-group > .btn:active,.btn-group-vertical > .btn:active,.btn-group > .btn.active,.btn-group-vertical > .btn.active{z-index: 2}.btn-group .btn + .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-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{padding-left: 12px;padding-right: 12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);box-shadow: inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow: none;box-shadow: none}.btn .caret{margin-left: 0}.btn-lg .caret{border-width: 5px 5px 0;border-bottom-width: 0}.dropup .btn-lg .caret{border-width: 0 5px 5px}.btn-group-vertical > .btn,.btn-group-vertical > .btn-group,.btn-group-vertical > .btn-group > .btn{display: block;float: none;width: 100%;max-width: 100%}.btn-group-vertical > .btn-group > .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: 3px;border-bottom-right-radius: 0;border-bottom-left-radius: 0}.btn-group-vertical > .btn:last-child:not(:first-child){border-bottom-left-radius: 3px;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="radio"],[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],[data-toggle="buttons"] > .btn input[type="checkbox"],[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-lg > .form-control,.input-group-lg > .input-group-addon,.input-group-lg > .input-group-btn > .btn{height: 41px;padding: 8px 5px;font-size: 17px;line-height: 1.3333333;border-radius: 5px}select.input-group-lg > .form-control,select.input-group-lg > .input-group-addon,select.input-group-lg > .input-group-btn > .btn{height: 41px;line-height: 41px}textarea.input-group-lg > .form-control,textarea.input-group-lg > .input-group-addon,textarea.input-group-lg > .input-group-btn > .btn,select[multiple].input-group-lg > .form-control,select[multiple].input-group-lg > .input-group-addon,select[multiple].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: 22px;padding: 1px 2px;font-size: 12px;line-height: 1.5;border-radius: 2px}select.input-group-sm > .form-control,select.input-group-sm > .input-group-addon,select.input-group-sm > .input-group-btn > .btn{height: 22px;line-height: 22px}textarea.input-group-sm > .form-control,textarea.input-group-sm > .input-group-addon,textarea.input-group-sm > .input-group-btn > .btn,select[multiple].input-group-sm > .form-control,select[multiple].input-group-sm > .input-group-addon,select[multiple].input-group-sm > .input-group-btn > .btn{height: auto}.input-group-addon,.input-group-btn,.input-group .form-control{display: table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius: 0}.input-group-addon,.input-group-btn{width: 1%;white-space: nowrap;vertical-align: middle}.input-group-addon{padding: 3px 5px;font-size: 13px;font-weight: normal;line-height: 1;color: #555;text-align: center;background-color: #eee;border: 1px solid #ccc;border-radius: 3px}.input-group-addon.input-sm{padding: 1px 2px;font-size: 12px;border-radius: 2px}.input-group-addon.input-lg{padding: 8px 5px;font-size: 17px;border-radius: 5px}.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{margin-left: -1px}.nav{margin-bottom: 0;padding-left: 0;list-style: none}.nav > li{position: relative;display: block}.nav > li > a{position: relative;display: block;padding: 5px}.nav > li > a:hover,.nav > li > a:focus{text-decoration: none;background-color: #eee}.nav > li.disabled > a{color: #777}.nav > li.disabled > a:hover,.nav > li.disabled > a:focus{color: #777;text-decoration: none;background-color: transparent;cursor: not-allowed}.nav .open > a,.nav .open > a:hover,.nav .open > a:focus{background-color: #eee;border-color: #12538b}.nav .nav-divider{height: 1px;margin: 8px 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: 3px 3px 0 0}.nav-tabs > li > a:hover{border-color: #eee #eee #ddd}.nav-tabs > li.active > a,.nav-tabs > li.active > a:hover,.nav-tabs > li.active > a:focus{color: #555;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}.nav-tabs.nav-justified > .dropdown .dropdown-menu{top: auto;left: auto}@media (min-width: 768px){.nav-tabs.nav-justified > li{display: table-cell;width: 1%}.nav-tabs.nav-justified > li > a{margin-bottom: 0}}.nav-tabs.nav-justified > li > a{margin-right: 0;border-radius: 3px}.nav-tabs.nav-justified > .active > a,.nav-tabs.nav-justified > .active > a:hover,.nav-tabs.nav-justified > .active > a:focus{border: 1px solid #ddd}@media (min-width: 768px){.nav-tabs.nav-justified > li > a{border-bottom: 1px solid #ddd;border-radius: 3px 3px 0 0}.nav-tabs.nav-justified > .active > a,.nav-tabs.nav-justified > .active > a:hover,.nav-tabs.nav-justified > .active > a:focus{border-bottom-color: #fff}}.nav-pills > li{float: left}.nav-pills > li > a{border-radius: 3px}.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: #619144}.nav-stacked > li{float: none}.nav-stacked > li + li{margin-top: 2px;margin-left: 0}.nav-justified{width: 100%}.nav-justified > li{float: none}.nav-justified > li > a{text-align: center;margin-bottom: 5px}.nav-justified > .dropdown .dropdown-menu{top: auto;left: auto}@media (min-width: 768px){.nav-justified > li{display: table-cell;width: 1%}.nav-justified > li > a{margin-bottom: 0}}.nav-tabs-justified{border-bottom: 0}.nav-tabs-justified > li > a{margin-right: 0;border-radius: 3px}.nav-tabs-justified > .active > a,.nav-tabs-justified > .active > a:hover,.nav-tabs-justified > .active > a:focus{border: 1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified > li > a{border-bottom: 1px solid #ddd;border-radius: 3px 3px 0 0}.nav-tabs-justified > .active > a,.nav-tabs-justified > .active > a:hover,.nav-tabs-justified > .active > a:focus{border-bottom-color: #fff}}.tab-content > .tab-pane{display: none}.tab-content > .active{display: block}.nav-tabs .dropdown-menu{margin-top: -1px;border-top-right-radius: 0;border-top-left-radius: 0}.navbar{position: relative;min-height: 65px;margin-bottom: 0px;border: 1px solid transparent}@media (min-width: 768px){.navbar{border-radius: 3px}}@media (min-width: 768px){.navbar-header{float: left}}.navbar-collapse{overflow-x: visible;padding-right: 7px;padding-left: 7px;border-top: 1px solid transparent;box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling: touch}.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-fluid > .navbar-header,.container > .navbar-collapse,.container-fluid > .navbar-collapse{margin-right: -7px;margin-left: -7px}@media (min-width: 768px){.container > .navbar-header,.container-fluid > .navbar-header,.container > .navbar-collapse,.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: 23.5px 7px;font-size: 17px;line-height: 18px;height: 65px}.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: -7px}}.navbar-toggle{position: relative;float: right;margin-right: 7px;padding: 9px 10px;margin-top: 15.5px;margin-bottom: 15.5px;background-color: transparent;background-image: none;border: 1px solid transparent;border-radius: 3px}.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: 11.75px -7px}.navbar-nav > li > a{padding-top: 10px;padding-bottom: 10px;line-height: 18px}@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: 18px}.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: 23.5px;padding-bottom: 23.5px}}.navbar-form{margin-left: -7px;margin-right: -7px;padding: 10px 7px;border-top: 1px solid transparent;border-bottom: 1px solid transparent;-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.1);box-shadow: inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.1);margin-top: 19.5px;margin-bottom: 19.5px}@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;-webkit-box-shadow: none;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: 3px;border-top-left-radius: 3px;border-bottom-right-radius: 0;border-bottom-left-radius: 0}.navbar-btn{margin-top: 19.5px;margin-bottom: 19.5px}.navbar-btn.btn-sm{margin-top: 21.5px;margin-bottom: 21.5px}.navbar-btn.btn-xs{margin-top: 21.5px;margin-bottom: 21.5px}.navbar-text{margin-top: 23.5px;margin-bottom: 23.5px}@media (min-width: 768px){.navbar-text{float: left;margin-left: 7px;margin-right: 7px}}@media (min-width: 768px){.navbar-left{float: left !important}.navbar-right{float: right !important;margin-right: -7px}.navbar-right ~ .navbar-right{margin-right: 0}}.navbar-default{background-color: #132531;border-color: #0a1319}.navbar-default .navbar-brand{color: #fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color: #068139;background-color: transparent}.navbar-default .navbar-text{color: #fff}.navbar-default .navbar-nav > li > a{color: #fff}.navbar-default .navbar-nav > li > a:hover,.navbar-default .navbar-nav > li > a:focus{color: #132531;background-color: #fff}.navbar-default .navbar-nav > .active > a,.navbar-default .navbar-nav > .active > a:hover,.navbar-default .navbar-nav > .active > a:focus{color: #132531;background-color: #fff}.navbar-default .navbar-nav > .disabled > a,.navbar-default .navbar-nav > .disabled > a:hover,.navbar-default .navbar-nav > .disabled > a:focus{color: #fff;background-color: #068139}.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: #0a1319}.navbar-default .navbar-nav > .open > a,.navbar-default .navbar-nav > .open > a:hover,.navbar-default .navbar-nav > .open > a:focus{background-color: #fff;color: #132531}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu > li > a{color: #fff}.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus{color: #132531;background-color: #fff}.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: #132531;background-color: #fff}.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: #fff;background-color: #068139}}.navbar-default .navbar-link{color: #fff}.navbar-default .navbar-link:hover{color: #132531}.navbar-default .btn-link{color: #fff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color: #132531}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color: #fff}.navbar-inverse{background-color: #222;border-color: #080808}.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: #080808}.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: #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: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: #080808}.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,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color: #444}.breadcrumb{padding: 6px 20px;margin-bottom: 18px;list-style: none;background-color: #fff;border-radius: 3px}.breadcrumb > li{display: inline-block}.breadcrumb > li + li:before{content: "/\00a0";padding: 0 5px;color: #777}.breadcrumb > .active{color: #333}.pagination{display: inline-block;padding-left: 0;margin: 18px 0;border-radius: 3px}.pagination > li{display: inline}.pagination > li > a,.pagination > li > span{position: relative;float: left;padding: 3px 5px;line-height: 1.42857143;text-decoration: none;color: #12538b;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: 3px;border-top-left-radius: 3px}.pagination > li:last-child > a,.pagination > li:last-child > span{border-bottom-right-radius: 3px;border-top-right-radius: 3px}.pagination > li > a:hover,.pagination > li > span:hover,.pagination > li > a:focus,.pagination > li > span:focus{color: #092b47;background-color: #eee;border-color: #ddd}.pagination > .active > a,.pagination > .active > span,.pagination > .active > a:hover,.pagination > .active > span:hover,.pagination > .active > a:focus,.pagination > .active > span:focus{z-index: 2;color: #fff;background-color: #1c5f74;border-color: #1c5f74;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: #777;background-color: #fff;border-color: #ddd;cursor: not-allowed}.pagination-lg > li > a,.pagination-lg > li > span{padding: 8px 5px;font-size: 17px}.pagination-lg > li:first-child > a,.pagination-lg > li:first-child > span{border-bottom-left-radius: 5px;border-top-left-radius: 5px}.pagination-lg > li:last-child > a,.pagination-lg > li:last-child > span{border-bottom-right-radius: 5px;border-top-right-radius: 5px}.pagination-sm > li > a,.pagination-sm > li > span{padding: 1px 2px;font-size: 12px}.pagination-sm > li:first-child > a,.pagination-sm > li:first-child > span{border-bottom-left-radius: 2px;border-top-left-radius: 2px}.pagination-sm > li:last-child > a,.pagination-sm > li:last-child > span{border-bottom-right-radius: 2px;border-top-right-radius: 2px}.pager{padding-left: 0;margin: 18px 0;list-style: none;text-align: center}.pager li{display: inline}.pager li > a,.pager li > span{display: inline-block;padding: 5px 14px;background-color: #fff;border: 1px solid #ddd;border-radius: 15px}.pager li > a:hover,.pager li > a:focus{text-decoration: none;background-color: #eee}.pager .next > a,.pager .next > span{float: right}.pager .previous > a,.pager .previous > span{float: left}.pager .disabled > a,.pager .disabled > a:hover,.pager .disabled > a:focus,.pager .disabled > span{color: #777;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}a.label:hover,a.label:focus{color: #fff;text-decoration: none;cursor: pointer}.label:empty{display: none}.btn .label{position: relative;top: -1px}.label-default{background-color: #777}.label-default[href]:hover,.label-default[href]:focus{background-color: #5e5e5e}.label-primary{background-color: #619144}.label-primary[href]:hover,.label-primary[href]:focus{background-color: #4a6e34}.label-success{background-color: #028302}.label-success[href]:hover,.label-success[href]:focus{background-color: #015101}.label-info{background-color: #1c5f74}.label-info[href]:hover,.label-info[href]:focus{background-color: #123d4b}.label-warning{background-color: #a56100}.label-warning[href]:hover,.label-warning[href]:focus{background-color: #724300}.label-danger{background-color: #a41915}.label-danger[href]:hover,.label-danger[href]:focus{background-color: #77120f}.badge{display: inline-block;min-width: 10px;padding: 3px 7px;font-size: 12px;font-weight: bold;color: #fff;line-height: 1;vertical-align: baseline;white-space: nowrap;text-align: center;background-color: #777;border-radius: 10px}.badge:empty{display: none}.btn .badge{position: relative;top: -1px}.btn-xs .badge,.btn-group-xs > .btn .badge{top: 0;padding: 1px 5px}a.badge:hover,a.badge:focus{color: #fff;text-decoration: none;cursor: pointer}.list-group-item.active > .badge,.nav-pills > .active > a > .badge{color: #12538b;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}.jumbotron{padding: 30px 15px;margin-bottom: 30px;color: inherit;background-color: #eee}.jumbotron h1,.jumbotron .h1{color: inherit}.jumbotron p{margin-bottom: 15px;font-size: 20px;font-weight: 200}.jumbotron > hr{border-top-color: #d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius: 5px}.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: 58.5px}}.thumbnail{display: block;padding: 4px;margin-bottom: 18px;line-height: 1.42857143;background-color: #fff;border: 1px solid #ddd;border-radius: 3px;-webkit-transition: border .2s ease-in-out;-o-transition: border .2s ease-in-out;transition: border .2s ease-in-out}.thumbnail > img,.thumbnail a > img{margin-left: auto;margin-right: auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color: #12538b}.thumbnail .caption{padding: 9px;color: #333}.alert{padding: 15px;margin-bottom: 18px;border: 1px solid transparent;border-radius: 3px}.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: 18px;margin-bottom: 18px;background-color: #f5f5f5;border-radius: 3px;-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);box-shadow: inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float: left;width: 0%;height: 100%;font-size: 12px;line-height: 18px;color: #fff;text-align: center;background-color: #619144;-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition: width .6s ease;-o-transition: width .6s ease;transition: width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{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);background-size: 40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation: progress-bar-stripes 2s linear infinite;-o-animation: progress-bar-stripes 2s linear infinite;animation: progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color: #028302}.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-info{background-color: #1c5f74}.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-warning{background-color: #a56100}.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-danger{background-color: #a41915}.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)}.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-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,.tt-dropdown-menu{margin-bottom: 20px;padding-left: 0}.list-group-item,.tt-suggestion{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: 3px;border-top-left-radius: 3px}.list-group-item:last-child{margin-bottom: 0;border-bottom-right-radius: 3px;border-bottom-left-radius: 3px}a.list-group-item{color: #555}a.list-group-item .list-group-item-heading{color: #333}a.list-group-item:hover,a.list-group-item:focus{text-decoration: none;color: #555;background-color: #f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color: #eee;color: #777;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: #777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index: 2;color: #fff;background-color: #619144;border-color: #619144}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading > small,.list-group-item.active:hover .list-group-item-heading > small,.list-group-item.active:focus .list-group-item-heading > small,.list-group-item.active .list-group-item-heading > .small,.list-group-item.active:hover .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: #cce1c0}.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:hover,a.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{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:hover,a.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{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:hover,a.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{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:hover,a.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{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: 18px;background-color: #fff;border: 1px solid transparent;border-radius: 3px;-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05);box-shadow: 0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding: 5px}.panel-heading{padding: 10px 15px;border-bottom: 1px solid transparent;border-top-right-radius: 2px;border-top-left-radius: 2px}.panel-heading > .dropdown .dropdown-toggle{color: inherit}.panel-title{margin-top: 0;margin-bottom: 0;font-size: 15px;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: 2px;border-bottom-left-radius: 2px}.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: 2px;border-top-left-radius: 2px}.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: 2px;border-bottom-left-radius: 2px}.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: 5px;padding-right: 5px}.panel > .table:first-child,.panel > .table-responsive:first-child > .table:first-child{border-top-right-radius: 2px;border-top-left-radius: 2px}.panel > .table:first-child > thead:first-child > tr:first-child,.panel > .table-responsive:first-child > .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 > tbody:first-child > tr:first-child{border-top-left-radius: 2px;border-top-right-radius: 2px}.panel > .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 td:first-child,.panel > .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 td:first-child,.panel > .table:first-child > thead:first-child > tr:first-child th: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 th:first-child,.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child{border-top-left-radius: 2px}.panel > .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 td:last-child,.panel > .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 td:last-child,.panel > .table:first-child > thead:first-child > tr:first-child th: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 th:last-child,.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child{border-top-right-radius: 2px}.panel > .table:last-child,.panel > .table-responsive:last-child > .table:last-child{border-bottom-right-radius: 2px;border-bottom-left-radius: 2px}.panel > .table:last-child > tbody:last-child > tr:last-child,.panel > .table-responsive:last-child > .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 > tfoot:last-child > tr:last-child{border-bottom-left-radius: 2px;border-bottom-right-radius: 2px}.panel > .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 td:first-child,.panel > .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 td:first-child,.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child{border-bottom-left-radius: 2px}.panel > .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 td:last-child,.panel > .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 td:last-child,.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child{border-bottom-right-radius: 2px}.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-responsive > .table-bordered > thead > tr > th:first-child,.panel > .table-bordered > tbody > tr > th:first-child,.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,.panel > .table-bordered > tfoot > tr > th:first-child,.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,.panel > .table-bordered > thead > tr > td:first-child,.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,.panel > .table-bordered > tbody > tr > td:first-child,.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,.panel > .table-bordered > tfoot > tr > td:first-child,.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child{border-left: 0}.panel > .table-bordered > thead > tr > th:last-child,.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,.panel > .table-bordered > tbody > tr > th:last-child,.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,.panel > .table-bordered > tfoot > tr > th:last-child,.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,.panel > .table-bordered > thead > tr > td:last-child,.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,.panel > .table-bordered > tbody > tr > td:last-child,.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,.panel > .table-bordered > tfoot > tr > td:last-child,.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child{border-right: 0}.panel > .table-bordered > thead > tr:first-child > td,.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,.panel > .table-bordered > tbody > tr:first-child > td,.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,.panel > .table-bordered > thead > tr:first-child > th,.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,.panel > .table-bordered > tbody > tr:first-child > th,.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th{border-bottom: 0}.panel > .table-bordered > tbody > tr:last-child > td,.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,.panel > .table-bordered > tfoot > tr:last-child > td,.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,.panel > .table-bordered > tbody > tr:last-child > th,.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,.panel > .table-bordered > tfoot > tr:last-child > th,.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th{border-bottom: 0}.panel > .table-responsive{border: 0;margin-bottom: 0}.panel-group{margin-bottom: 18px}.panel-group .panel{margin-bottom: 0;border-radius: 3px}.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: #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: #619144}.panel-primary > .panel-heading{color: #fff;background-color: #619144;border-color: #619144}.panel-primary > .panel-heading + .panel-collapse > .panel-body{border-top-color: #619144}.panel-primary > .panel-heading .badge{color: #619144;background-color: #fff}.panel-primary > .panel-footer + .panel-collapse > .panel-body{border-bottom-color: #619144}.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: 3px;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);box-shadow: inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color: #ddd;border-color: rgba(0,0,0,0.15)}.well-lg{padding: 24px;border-radius: 5px}.well-sm{padding: 9px;border-radius: 2px}.close,.group .group-close{float: right;font-size: 19.5px;font-weight: bold;line-height: 1;color: #000;text-shadow: 0 1px 0 #fff;opacity: .2;filter: alpha(opacity=20)}.close:hover,.close:focus{color: #000;text-decoration: none;cursor: pointer;opacity: .5;filter: alpha(opacity=50)}button.close{padding: 0;cursor: pointer;background: transparent;border: 0;-webkit-appearance: none}.modal-open{overflow: hidden}.modal{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%);-ms-transform: translate(0, -25%);-o-transform: translate(0, -25%);transform: translate(0, -25%);-webkit-transition: -webkit-transform 0.3s ease-out;-moz-transition: -moz-transform 0.3s ease-out;-o-transition: -o-transform 0.3s ease-out;transition: transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform: translate(0, 0);-ms-transform: translate(0, 0);-o-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: 5px;-webkit-box-shadow: 0 3px 9px rgba(0,0,0,0.5);box-shadow: 0 3px 9px rgba(0,0,0,0.5);background-clip: padding-box;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: .5;filter: alpha(opacity=50)}.modal-header{padding: 15px;border-bottom: 1px solid #e5e5e5;min-height: 16.42857143px}.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{-webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.5);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: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 12px;font-weight: normal;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: 3px}.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: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 13px;font-weight: normal;line-height: 1.42857143;text-align: left;background-color: #fff;background-clip: padding-box;border: 1px solid #ccc;border: 1px solid rgba(0,0,0,0.2);border-radius: 5px;-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);box-shadow: 0 5px 10px rgba(0,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: 13px;background-color: #f7f7f7;border-bottom: 1px solid #ebebeb;border-radius: 4px 4px 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: #999;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: #999;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: #999;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: #999;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;-webkit-transition: .6s ease-in-out left;-o-transition: .6s ease-in-out left;transition: .6s ease-in-out left}.carousel-inner > .item > img,.carousel-inner > .item > a > img{line-height: 1}@media all and (transform-3d), (-webkit-transform-3d){.carousel-inner > .item{-webkit-transition: -webkit-transform 0.6s ease-in-out;-moz-transition: -moz-transform 0.6s ease-in-out;-o-transition: -o-transform 0.6s ease-in-out;transition: transform 0.6s ease-in-out;-webkit-backface-visibility: hidden;-moz-backface-visibility: hidden;backface-visibility: hidden;-webkit-perspective: 1000;-moz-perspective: 1000;perspective: 1000}.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: .5;filter: alpha(opacity=50);font-size: 20px;color: #fff;text-align: center;text-shadow: 0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image: -o-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image: linear-gradient(to right, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left: auto;right: 0;background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image: -o-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image: linear-gradient(to right, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline: 0;color: #fff;text-decoration: none;opacity: .9;filter: alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position: absolute;top: 50%;z-index: 5;display: inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left: 50%;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;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;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: -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}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical > .btn-group:before,.btn-group-vertical > .btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content: " ";display: table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical > .btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer: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,.visible-sm,.visible-md,.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}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}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}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}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}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}}.sr-only{clip: rect(1px, 1px, 1px, 1px);position: absolute;width: auto;height: auto;margin: 0;padding: 0;overflow: hidden;border: 0}.sr-only:focus{background-color: #fff;border-radius: 3px;clip: auto;color: #132531;display: block;font-size: 13px;height: 65px;line-height: 18px;padding: 23.5px 7px;position: absolute;left: 5px;top: 5px;text-decoration: none;text-transform: none;width: auto;z-index: 100000}.navbar-brand{font-size: 20px}.alert.alert-info a{text-decoration: underline}.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover{color: #000}[data-toggle~="dropdown"]{cursor: pointer}.fa{cursor: default}@media (min-width: 768px){.form-control{max-width: 400px}}.has-error{margin-bottom: 0}.sms-error{margin-bottom: 0}.sms-error .help-block,.sms-error .control-label,.sms-error .radio,.sms-error .checkbox,.sms-error .radio-inline,.sms-error .checkbox-inline,.sms-error.radio label,.sms-error.checkbox label,.sms-error.radio-inline label,.sms-error.checkbox-inline label{color: #a94442}.sms-error .form-control{border-color: #a94442;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.sms-error .form-control:focus{border-color: #843534;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483;box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483}.sms-error .input-group-addon{color: #a94442;border-color: #a94442;background-color: #f2dede}.sms-error .form-control-feedback{color: #a94442}.help-block.with-errors{padding-top: 3px;padding-bottom: 3px}.help-block.with-errors:empty{padding: 0}.help-block.with-errors,.list-unstyled{margin: 0}.highlight,mark{background: #ff6;padding: .1em .2em}.icon-bar{background-color: #888}img{max-width: 100%}label.list-group-item{margin-top: 0;padding-left: 35px;font-weight: normal;border-radius: 0}.list-group-item.title{font-weight: bold}#modal{background-color: rgba(0,0,0,0.2)}#modal .modal-body > h2:first-child{display: none}.popover{width: 250px}@media (min-width: 768px){h2{font-size: 23px;font-weight: normal}}@media (max-width: 767px){h2{font-size: 20px}}@media (min-width: 768px){h3{font-size: 20px;font-weight: normal}}@media (max-width: 767px){h3{font-size: 16px}}.recordcover{max-height: 300px}.sub-breadcrumb{padding: 5px 10px;white-space: nowrap}.sub-breadcrumb li{display: inline-block}.sub-breadcrumb li + li:before{padding-left: 5px;padding-right: 5px;color: #777;content: "/\00a0"}.tab-content{padding: 4px}@media (max-width: 991px){header .container.navbar{margin-bottom: 0}.searchForm{margin-top: 0}}@media (max-width: 767px){.searchForm{padding-top: 0}}.group{position: relative;background: #eee;border-radius: 3px;border: 1px solid #c8c8c8;margin-top: 0;margin-bottom: .5em !important}.group .add_search_link{display: inline-block;margin-top: 4px}.group .group-close{position: absolute;top: .3em;right: .5em;opacity: .4;z-index: 2}.group .search{margin-bottom: 2px}.group .search .close{opacity: .8}@media (min-width: 768px){.group{padding: 10px 10px 10px 25px}.group [class^=col-]{padding-left: 0}}@media (max-width: 767px){.group .search .middle{float: left;width: 90%}.group .group-close{top: .5em;right: 1em;opacity: .6}}@media (max-width: 991px){.group .form-control{max-width: none}}#groupPlaceHolder{display: block;padding: 6px}.template-dir-eds.template-name-advanced legend{margin-bottom: 0}.template-dir-eds.template-name-advanced .no-js .group:nth-child(n+3){display: none}.template-dir-eds.template-name-advanced .search .close a{margin-left: -2em}.alphabrowse{border-collapse: separate}.alphabrowse .lcc{width: 20%}.alphabrowse .titles{width: 10%;text-align: center}.alphabrowse tr.browse-match td{border-top: .2em solid #619144;border-bottom: .2em solid #619144}.alphabrowse tr.browse-match td:first-child{border-left: .2em solid #619144}.alphabrowse tr.browse-match td:last-child{border-right: .2em solid #619144}.twitter-typeahead{vertical-align: top;background-color: #fff;border-radius: 3px}@media (max-width: 767px){.twitter-typeahead{width: 100%}}.twitter-typeahead .tt-hint{display: none}.tt-suggestion{cursor: pointer;text-overflow: ellipsis;white-space: nowrap}.tt-suggestion.active{white-space: inherit}.tt-suggestion.tt-cursor{background-color: #619144;color: #fff}.tt-suggestion p{margin: 0}.badge a{color: #fff}.browse.list-group .list-group-item{word-wrap: break-word}.browse.list-group .list-group-item.view-record{padding: 2px 4px;font-size: 85%;text-align: right;border-top: 0}.cart-controls .checkbox{line-height: 2.5em;padding-right: 1em}#modal .cart-controls .btn{margin-bottom: 4px}#modal .cart-controls .checkbox{padding-bottom: 1em}#modal .cart-controls ~ hr{margin-top: 0}.fa-grid:before{content: "\f00a"}.fa-visual:before{content: "\f008"}.fa-x:before{content: "\f0f6"}.fa-atlas:before{content: "\f14e"}.fa-book:before{content: "\f02d"}.fa-braille:before{content: "\f0a6"}.fa-cdrom:before{content: "\f109"}.fa-chart:before{content: "\f012"}.fa-chipcartridge:before{content: "\f109"}.fa-collage:before{content: "\f03e"}.fa-disccartridge:before{content: "\f109"}.fa-drawing:before{content: "\f03e"}.fa-ebook:before{content: "\f0f6"}.fa-electronic:before{content: "\f1c6"}.fa-filmstrip:before{content: "\f008"}.fa-flashcard:before{content: "\f0e7"}.fa-floppydisk:before{content: "\f0c7"}.fa-globe:before{content: "\f0ac"}.fa-journal:before{content: "\f0f6"}.fa-kit:before{content: "\f0b1"}.fa-manuscript:before{content: "\f0f6"}.fa-map:before{content: "\f14e"}.fa-microfilm:before{content: "\f008"}.fa-motionpicture:before{content: "\f03d"}.fa-musicalscore:before{content: "\f001"}.fa-musicrecording:before{content: "\f001"}.fa-newspaper:before{content: "\f0f6"}.fa-online:before{content: "\f109"}.fa-painting:before{content: "\f03e"}.fa-photo:before{content: "\f03e"}.fa-photonegative:before{content: "\f03e"}.fa-physicalobject:before{content: "\f187"}.fa-print:before{content: "\f03e"}.fa-sensorimage:before{content: "\f03e"}.fa-serial:before{content: "\f0f6"}.fa-slide:before{content: "\f008"}.fa-software:before{content: "\f109"}.fa-soundcassette:before{content: "\f025"}.fa-sounddisc:before{content: "\f109"}.fa-soundrecording:before{content: "\f025"}.fa-tapecartridge:before{content: "\f109"}.fa-tapecassette:before{content: "\f025"}.fa-tapereel:before{content: "\f008"}.fa-transparency:before{content: "\f008"}.fa-unknown:before{content: "\f128"}.fa-video:before{content: "\f03d"}.fa-videocartridge:before{content: "\f03d"}.fa-videocassette:before{content: "\f03d"}.fa-videodisc:before{content: "\f109"}.fa-videoreel:before{content: "\f03d"}#dateVisColorSettings{background-color: #fff;fill: #eaeaea;outline-color: #e8cfac;stroke: #619144}.citation .pace-car th,.citation .pace-car td{border: 0;padding: 0}.citation th{text-align: right}#hierarchyTreeHolder{overflow-x: hidden;border-right: 1px solid #eee}#hierarchyTree .currentHierarchy > a,#hierarchyTree .currentRecord a{font-weight: bold;color: #000}#tagList .tag{display: inline-block;margin: 0 1px 1px;border-radius: 4px;padding: 3px 3px;font-size: 13px;line-height: 1.42857143;border-radius: 3px}#tagList .tag.selected{background-color: #619144}#tagList .tag.selected a{color: #fff}#tagList .tag.selected .badge{color: #222;background-color: #fff}#tagList .tag.selected .badge:hover{color: #a94442}#tagList .tag .badge .fa{width: 12px}#tagList .tag-form{display: inline}#tagList .tag-form button{border: 0}#tagList.loggedin .tag:not(.selected) .badge:hover{background-color: #028302}.bulkActionButtons label{display: inline-block}.bulkActionButtons label input{margin-top: 2px}@media (max-width: 767px){.grid{min-height: 250px}}.result a.title{font-weight: bold}.result .left{text-align: center}.result .left img{max-width: 100%}@media (max-width: 767px){.result a{text-decoration: underline}.result .middle,.result .right{padding: 0}}@media (max-width: 530px){.result .checkbox{display: none !important}.result .left{width: 40%}.result .middle{width: 60%}.result .right{display: none}}.search-controls .alert{margin-bottom: 0}.searchtools a{padding: 0 .5em}.title-in-heading{font-size: inherit;font-style: italic}.narrow-toggle{text-align: center}.sidebar label:not(.list-group-item){margin-left: 20px}.sidebar .list-group:not(.filters) .title{cursor: pointer}.sidebar .list-group:not(.filters) .title.collapsed{border-radius: 3px}.sidebar .list-group:not(.filters) .title.collapsed:after{content: '\25BC'}.sidebar .list-group:not(.filters) .title:after{content: '\25B2';float: right}.sidebar .collapse .list-group-item,.sidebar .collapsing .list-group-item{border-top-left-radius: 0px;border-top-right-radius: 0px}.sidebar .collapse .list-group-item[id^=more],.sidebar .collapsing .list-group-item[id^=more]{border-bottom-left-radius: 3px;border-bottom-right-radius: 3px}.sidebar #side-collapse-publishDate .list-group-item{border-bottom-left-radius: 3px;border-bottom-right-radius: 3px}.list-group-item i.fa,.badge i.fa{cursor: inherit}.sidebar .facet a{text-decoration: none}.top-row .applied{font-weight: bold}.top-row .applied:hover{color: #a94442}.top-row .applied:hover .fa.fa-check:before{content: "\f00d"}.slider-container{padding: 4px 10px;text-align: center}.slider-container .slider.slider-horizontal{width: 100%}.slider-container .slider-track{background: #777;box-shadow: inset 0 1px 0 rgba(0,0,0,0.4)}.slider-container .slider-handle{background: #619144;background-image: none;border: 1px solid #619144;box-shadow: none;opacity: .9}.slider-container .slider-handle:hover,.slider-container .slider-handle:active,.slider-container .slider-handle:focus{opacity: 1;background: #FFF;border-color: #777}.slider-container .slider-handle:active,.slider-container .slider-handle:focus{border-color: #619144}.slider-container .slider-selection{background: #CCC;box-shadow: inset 0 -1px 0 rgba(0,0,0,0.3)}.slider-container input{display: none}.table{table-layout: fixed;word-wrap: break-word}.node{position: absolute;box-sizing: content-box;margin: -1px;overflow: hidden;font: 10px sans-serif;line-height: 12px;border: 1px solid #fff}.node div{margin-top: 0px}.toplevel{border: 2px solid #000}.node .label{position: absolute;bottom: 0;left: 0;min-height: 1px;padding: 2px 4px;font-size: 85%;background-color: rgba(0,0,0,0.5);border-radius: 0;text-shadow: none}.notalabel{color: #000}#viz-instructions{padding-top: 600px}#similar-items-carousel .carousel-indicators{bottom: 0px}#similar-items-carousel .carousel-indicators li{width: 8px;height: 8px;margin: 2px;background-color: rgba(255,255,255,0.3);border-color: #222}#similar-items-carousel .hover-overlay{position: relative;display: block;min-width: 150px;min-height: 200px;margin: auto;text-align: center}#similar-items-carousel .hover-overlay img{max-width: 100%;margin: 10px 0}#similar-items-carousel .hover-overlay .content{position: absolute;top: 0;left: 0;display: none;width: 100%;height: 100%;padding: .5em .5em 0;color: #fff;background-color: rgba(0,0,0,0.5)}#similar-items-carousel .hover-overlay:hover .content{display: block}#similar-items-carousel .item{padding: 0 4em}.facet .jstree-ocl:before{float: left;width: 10px;padding: 0;margin-left: -10px;font-family: 'FontAwesome';font-weight: normal;font-style: normal;text-decoration: inherit;cursor: pointer;speak: none}.facet .jstree-default .jstree-open > .jstree-ocl:before{content: "\f0d7"}.facet .jstree-default .jstree-closed > .jstree-ocl:before{content: "\f0da"}.facet .jstree-default .jstree-leaf > .jstree-ocl:before{content: " "}.jstree-facet li span.main{display: block;padding-left: 1px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.jstree-facet .jstree-container-ul{padding: 0}.jstree-facet .jstree-container-ul > li.active,.jstree-facet .jstree-container-ul > li.active a.jstree-anchor{background-color: #265680;color: #fff}li.jstree-facet,li.jstree-node{list-style: none}li.jstree-facet .badge{cursor: text}li.jstree-facet ul{padding-left: 20px}.hierarchy-tree .jstree-ocl:before{float: left;width: 10px;padding: 0;margin-left: -10px;font-family: 'FontAwesome';font-style: normal;font-weight: normal;cursor: pointer;text-decoration: inherit;speak: none}.hierarchy-tree .jstree-open > .jstree-ocl:before{content: "\f0d7"}.hierarchy-tree .jstree-closed > .jstree-ocl:before{content: "\f0da"}.hierarchy-tree .jstree-leaf > .jstree-ocl:before{content: " "}.hierarchy-tree .jstree-icon{width: 16px;color: #000}.hierarchy-tree .jstree-anchor{padding: 2px 5px;white-space: nowrap}.hierarchy-tree .jstree-container-ul,.hierarchy-tree .jstree-children{padding-left: 16px}.hierarchy-tree .jstree-initial-node{display: none}.hierarchy-tree .jstree-clicked{color: #fff;background-color: #619144}.hierarchy-tree .jstree-clicked .jstree-icon{color: #fff}.offcanvas-overlay,.offcanvas-toggle{display: none}@media screen and (max-width: 767px){body.offcanvas{overflow-x: hidden}body.offcanvas .sidebar{position: fixed;height: 100%;top: 0;width: 75%;padding-left: 0;padding-right: 0;overflow-y: auto}body.offcanvas .sidebar h4{padding-left: 5px}body.offcanvas .sidebar .checkbox{margin-left: 25px}body.offcanvas .sidebar .list-group,body.offcanvas .sidebar .list-group-item{border-left: 0;border-right: 0;border-radius: 0 !important}body.offcanvas.active{overflow-y: hidden}body.offcanvas.offcanvas-left{padding-left: 23px}body.offcanvas.offcanvas-left .main{background: #FFF}body.offcanvas.offcanvas-left.active{margin-left: 75%;margin-right: -75%}body.offcanvas.offcanvas-left.active .sidebar{left: 0}body.offcanvas.offcanvas-left.active .offcanvas-overlay{right: -75%}body.offcanvas.offcanvas-left.active .offcanvas-toggle{left: 75%}body.offcanvas.offcanvas-left .sidebar{left: -75%}body.offcanvas.offcanvas-left .offcanvas-overlay{right: -100%}body.offcanvas.offcanvas-left .offcanvas-toggle{border-radius: 0 2px 2px 0;left: 0}body.offcanvas.offcanvas-right{padding-right: 23px}body.offcanvas.offcanvas-right .main > .container{background: #FFF}body.offcanvas.offcanvas-right.active{margin-left: -75%;margin-right: 75%}body.offcanvas.offcanvas-right.active .sidebar{right: 0}body.offcanvas.offcanvas-right.active .offcanvas-overlay{left: -75%}body.offcanvas.offcanvas-right.active .offcanvas-toggle{right: 75%}body.offcanvas.offcanvas-right .sidebar{right: -75%}body.offcanvas.offcanvas-right .offcanvas-overlay{left: -100%}body.offcanvas.offcanvas-right .offcanvas-toggle{border-radius: 2px 0 0 2px;right: 0}body.offcanvas .offcanvas-overlay{display: block;position: fixed;top: 0;width: 100%;height: 100%;background-color: rgba(0,0,0,0.3);z-index: 3}body.offcanvas .offcanvas-toggle{display: block;position: fixed;top: 50%;width: calc(25px);padding: 20px 0;background: #619144;color: #EEE;text-align: center;z-index: 5}body.offcanvas .offcanvas-overlay,body.offcanvas .offcanvas-toggle,body.offcanvas .offcanvas-toggle *{cursor: pointer}body.offcanvas,body.offcanvas .sidebar,body.offcanvas .offcanvas-overlay,body.offcanvas .offcanvas-toggle{-webkit-transition: all .25s ease-out;-o-transition: all .25s ease-out;transition: all .25s ease-out}}.bp-icon,.fa-x,i.fa-archive,i.fa-asterisk,i.fa-atlas,i.fa-bell,i.fa-book,i.fa-bookbag-add,i.fa-bookbag-delete,i.fa-bookbag-empty,i.fa-bookmark,i.fa-braille,i.fa-cancel-all-holds,i.fa-cancel-all-storage-retrieval-requests,i.fa-cancel-holds,i.fa-cancel-storage-retrieval-requests,i.fa-cdrom,i.fa-chart,i.fa-chipcartridge,i.fa-collage,i.fa-close,i.fa-disccartridge,i.fa-drawing,i.fa-ebook,i.fa-edit,i.fa-electronic,i.fa-email,i.fa-envelope,i.fa-envelope-o,i.fa-exchange,i.fa-external-link,i.fa-filmstrip,i.fa-flag,i.fa-flashcard,i.fa-floppydisk,i.fa-globe,i.fa-grid,i.fa-heart,i.fa-home,i.fa-inbox,i.fa-journal,i.fa-kit,i.fa-leaf,.fa-sitemap,i.fa-list,i.fa-list-alt,i.fa-export,i.fa-lock,i.fa-manuscript,i.fa-map,i.fa-microfilm,i.fa-minus-circle,i.fa-minus-sign,i.fa-mobile,i.fa-motionpicture,i.fa-musicalscore,i.fa-musicrecording,i.fa-newspaper,i.fa-ok,i.fa-online,i.fa-painting,i.fa-photo,i.fa-photonegative,i.fa-physicalobject,i.fa-plus,i.fa-plus-circle,i.fa-print,i.fa-qrcode,i.fa-remove,i.fa-renew,i.fa-renew-all,i.fa-report,i.fa-rss,i.fa-save,i.fa-search,i.fa-sensorimage,i.fa-serial,i.fa-shopping-cart,i.fa-sign-in,i.fa-sign-out,i.fa-slide,i.fa-software,i.fa-soundcassette,i.fa-sounddisc,i.fa-soundrecording,i.fa-spinner,i.fa-star,i.fa-suitcase,i.fa-tapecartridge,i.fa-tapecassette,i.fa-tapereel,i.fa-transparency,i.fa-trash,i.fa-trash-o,i.fa-tree,i.fa-tree-muted,i.fa-unknown,i.fa-usd,i.fa-user,i.fa-video,i.fa-videocartridge,i.fa-videocassette,i.fa-videodisc,i.fa-videoreel,i.fa-visual,#cart-empty-label i.fa-close{background-position: center center;background-repeat: no-repeat;color: transparent;content: '';display: inline-block;height: 16px;margin: 0;padding: 0;text-shadow: none;vertical-align: text-bottom;width: 16px}.fa-x{background-image: url('../../../themes/bootprint3/images/icons/page_white.png')}i.fa-archive{background-image: url('../../../themes/bootprint3/images/icons/package.png')}i.fa-asterisk{background-image: url('../../../themes/bootprint3/images/icons/list.png')}i.fa-atlas{background-image: url('../../../themes/bootprint3/images/icons/map.png')}i.fa-bell{background-image: url('../../../themes/bootprint3/images/icons/bell.png')}i.fa-book{background-image: url('../../../themes/bootprint3/images/icons/book.png')}i.fa-bookbag-add{background-image: url('../../../themes/bootprint3/images/icons/bookbag_add.png')}i.fa-bookbag-delete{background-image: url('../../../themes/bootprint3/images/icons/bookbag_delete.png')}i.fa-bookbag-empty{background-image: url('../../../themes/bootprint3/images/icons/bookbag_empty.png')}i.fa-bookmark{background-image: url('../../../themes/bootprint3/images/icons/bookmark_add.png')}i.fa-braille{background-image: url('../../../themes/bootprint3/images/icons/page_red.png')}i.fa-cancel-all-holds{background-image: url('../../../themes/bootprint3/images/icons/holdCancelAll.png')}i.fa-cancel-all-storage-retrieval-requests{background-image: url('../../../themes/bootprint3/images/icons/holdCancelAll.png')}i.fa-cancel-holds{background-image: url('../../../themes/bootprint3/images/icons/holdCancel.png')}i.fa-cancel-storage-retrieval-requests{background-image: url('../../../themes/bootprint3/images/icons/holdCancel.png')}i.fa-cdrom{background-image: url('../../../themes/bootprint3/images/icons/cd.png')}i.fa-chart{background-image: url('../../../themes/bootprint3/images/icons/chart_bar.png')}i.fa-chipcartridge{background-image: url('../../../themes/bootprint3/images/icons/server.png')}i.fa-collage{background-image: url('../../../themes/bootprint3/images/icons/pictures.png')}i.fa-close{background-image: url('../../../themes/bootprint3/images/icons/cross.png')}i.fa-disccartridge{background-image: url('../../../themes/bootprint3/images/icons/cd.png')}i.fa-drawing{background-image: url('../../../themes/bootprint3/images/icons/photo.png')}i.fa-ebook{background-image: url('../../../themes/bootprint3/images/icons/book_addresses.png')}i.fa-edit{background-image: url('../../../themes/bootprint3/images/icons/edit.png')}i.fa-electronic{background-image: url('../../../themes/bootprint3/images/icons/mouse.png')}i.fa-email,i.fa-envelope,i.fa-envelope-o{background-image: url('../../../themes/bootprint3/images/icons/email.png')}i.fa-exchange{background-image: url('../../../themes/bootprint3/images/icons/arrow_refresh.png')}i.fa-external-link{background-image: url('../../../themes/bootprint3/images/icons/link_go.png')}i.fa-filmstrip{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-flag{background-image: url('../../../themes/bootprint3/images/icons/flag_red.png')}i.fa-flashcard{background-image: url('../../../themes/bootprint3/images/icons/table_lightening.png')}i.fa-floppydisk{background-image: url('../../../themes/bootprint3/images/icons/disk.png')}i.fa-globe{background-image: url('../../../themes/bootprint3/images/icons/world.png')}i.fa-grid{background-image: url('../../../themes/bootprint3/images/icons/view_grid.png')}i.fa-heart{background-image: url('../../../themes/bootprint3/images/icons/heart.png')}i.fa-home{background-image: url('../../../themes/bootprint3/images/icons/house.png')}i.fa-inbox{background-image: url('../../../themes/bootprint3/images/icons/box.png')}i.fa-journal{background-image: url('../../../themes/bootprint3/images/icons/book.png')}i.fa-kit{background-image: url('../../../themes/bootprint3/images/icons/briefcase.png')}i.fa-leaf,.fa-sitemap{background-image: url('../../../themes/bootprint3/images/icons/treeCurrent.png')}i.fa-list{background-image: url('../../../themes/bootprint3/images/icons/view_list.png')}i.fa-list-alt,i.fa-export{background-image: url('../../../themes/bootprint3/images/icons/application_add.png')}i.fa-lock{background-image: url('../../../themes/bootprint3/images/icons/lock.png')}i.fa-manuscript{background-image: url('../../../themes/bootprint3/images/icons/script.png')}i.fa-map{background-image: url('../../../themes/bootprint3/images/icons/map.png')}i.fa-microfilm{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-minus-circle,i.fa-minus-sign{background-image: url('../../../themes/bootprint3/images/icons/delete.png')}i.fa-mobile{background-image: url('../../../themes/bootprint3/images/icons/phone.png')}i.fa-motionpicture{background-image: url('../../../themes/bootprint3/images/icons/television.png')}i.fa-musicalscore{background-image: url('../../../themes/bootprint3/images/icons/music.png')}i.fa-musicrecording{background-image: url('../../../themes/bootprint3/images/icons/music.png')}i.fa-newspaper{background-image: url('../../../themes/bootprint3/images/icons/newspaper.png')}i.fa-ok{background-image: url('../../../themes/bootprint3/images/icons/tick.png')}i.fa-online{background-image: url('../../../themes/bootprint3/images/icons/computer.png')}i.fa-painting{background-image: url('../../../themes/bootprint3/images/icons/paintbrush.png')}i.fa-photo{background-image: url('../../../themes/bootprint3/images/icons/photo.png')}i.fa-photonegative{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-physicalobject{background-image: url('../../../themes/bootprint3/images/icons/box.png')}i.fa-plus{background-image: url('../../../themes/bootprint3/images/icons/add.png')}i.fa-plus-circle{background-image: url('../../../themes/bootprint3/images/icons/add.png')}i.fa-print{background-image: url('../../../themes/bootprint3/images/icons/printer.png')}i.fa-qrcode{background-image: url('../../../themes/bootprint3/images/icons/qrcode.png')}i.fa-remove{background-image: url('../../../themes/bootprint3/images/icons/delete.png')}i.fa-renew{background-image: url('../../../themes/bootprint3/images/icons/renew.png')}i.fa-renew-all{background-image: url('../../../themes/bootprint3/images/icons/renewAll.png')}i.fa-report{background-image: url('../../../themes/bootprint3/images/icons/report.png')}i.fa-rss{background-image: url('../../../themes/bootprint3/images/icons/feed.png')}i.fa-save{background-image: url('../../../themes/bootprint3/images/icons/disk.png')}i.fa-search{background-image: url('../../../themes/bootprint3/images/icons/magnifier.png')}i.fa-sensorimage{background-image: url('../../../themes/bootprint3/images/icons/photo.png')}i.fa-serial{background-image: url('../../../themes/bootprint3/images/icons/page_white_stack.png')}i.fa-shopping-cart{background-image: url('../../../themes/bootprint3/images/icons/cart.png')}i.fa-sign-in{background-image: url('../../../themes/bootprint3/images/icons/door_in.png')}i.fa-sign-out{background-image: url('../../../themes/bootprint3/images/icons/door_out.png')}i.fa-slide{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-software{background-image: url('../../../themes/bootprint3/images/icons/drive_cd.png')}i.fa-soundcassette{background-image: url('../../../themes/bootprint3/images/icons/sound.png')}i.fa-sounddisc{background-image: url('../../../themes/bootprint3/images/icons/cd.png')}i.fa-soundrecording{background-image: url('../../../themes/bootprint3/images/icons/sound.png')}i.fa-spinner{background-image: url('../../../themes/bootprint3/images/icons/ajax_loading.gif')}i.fa-star{background-image: url('../../../themes/bootprint3/images/icons/star.png')}i.fa-suitcase{background-image: url('../../../themes/bootprint3/images/icons/bookbag.png')}i.fa-tapecartridge{background-image: url('../../../themes/bootprint3/images/icons/drive.png')}i.fa-tapecassette{background-image: url('../../../themes/bootprint3/images/icons/drive.png')}i.fa-tapereel{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-transparency{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-trash,i.fa-trash-o{background-image: url('../../../themes/bootprint3/images/icons/bin.png')}i.fa-tree{background-image: url('../../../themes/bootprint3/images/icons/treeCurrent.png')}i.fa-tree-muted{background-image: url('../../../themes/bootprint3/images/icons/treeMuted.png')}i.fa-unknown{background-image: url('../../../themes/bootprint3/images/icons/page_white.png')}i.fa-usd{background-image: url('../../../themes/bootprint3/images/icons/money_dollar.png')}i.fa-user{background-image: url('../../../themes/bootprint3/images/icons/user.png')}i.fa-video{background-image: url('../../../themes/bootprint3/images/icons/television.png')}i.fa-videocartridge{background-image: url('../../../themes/bootprint3/images/icons/television.png')}i.fa-videocassette{background-image: url('../../../themes/bootprint3/images/icons/television.png')}i.fa-videodisc{background-image: url('../../../themes/bootprint3/images/icons/cd.png')}i.fa-videoreel{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-visual{background-image: url('../../../themes/bootprint3/images/icons/view_visual.png')}body.rtl i.fa-external-link{background-image: url('../../../themes/bootprint3/images/icons/link_go_rtl.png')}body.rtl i.fa-flag{background-image: url('../../../themes/bootprint3/images/icons/flag_red_rtl.png')}#cart-empty-label i.fa-close{background-image: url('../../../themes/bootprint3/images/icons/briefcase.png')}body{background: #619144;font-size: 13px}body a,body .btn-link{color: #06C}body a:hover,body .btn-link:hover{color: #09F}@media (max-width: 767px){body{padding: 6px}body header{margin-top: 0}body .label{font-size: 85%}}@media (min-width: 768px){.badge{font-size: 85%;margin-top: 1px}.label{padding-top: .3em}.modal-dialog{width: 650px}}.btn{padding: 3px 5px 2px}.btn.btn-default{background: #eee;background-image: linear-gradient(#fff, #ddd);border: 1px solid #777;color: #222;text-shadow: 0 1px 0 #fff}.btn.btn-default:hover{border: 1px solid #333;color: #222;text-shadow: none}.btn-danger,.btn-danger:hover{border-color: #6e110e;font-weight: bold}.btn-info,.btn-info:hover{border-color: #103743;font-weight: bold}.btn-primary,.btn-primary:hover{border-color: #456730;font-weight: bold}.btn-success,.btn-success:hover{border-color: #014701;font-weight: bold}.btn-warning,.btn-warning:hover{border-color: #683d00;font-weight: bold}h2{margin: 0 8px 8px}input[type="radio"],input[type="checkbox"]{margin: 0 auto;margin-top: 2px;padding: 0 2px}.nav > li > a{padding: 5px 10px}.nav-pills{display: table;margin: 0 auto}.navbar{min-height: 1px}.navbar-form{margin-top: 5px;margin-bottom: 5px}.pagination{display: table;margin: 18px auto}.pagination > li > a,.pagination > li > span{padding: 4px 12px 3px 12px}.pagination > .active > a,.pagination > .active > span,.pagination > .active > a:hover,.pagination > .active > span:hover,.pagination > .active > a:focus,.pagination > .active > span:focus{background: #619144;border-color: #619144}.panel-heading{padding: 0}.panel-heading a{cursor: pointer;display: inline-block;padding: 6px;width: 100%}.row:not(.top-row){padding: 6px 4px;margin: 0 -4px}.row.result:nth-child(even){background: #eee}.row.result:last-child{margin-bottom: 1em}.row > p{padding: 0 1em}.search .row{padding: 2px 0}.sub-breadcrumb{padding: 0 5px}.tab-content{padding: 6px 8px;border: 1px solid #ddd;border-top: 0}.container{background: #FFF;padding: 0}header{margin-top: 18px}header .fa.fa-bars{font-size: 21px}header .navbar{border-radius: 5px 5px 0 0;padding: 0 10px}header .navbar .searchForm{display: none !important}header .navbar .navbar-brand{background-image: url('../../../themes/bootprint3/images/vufind_logo.png');background-position: center center;background-repeat: no-repeat;background-size: contain;color: transparent;height: 65px;margin-top: 5px;width: 170px}header .navbar .navbar-brand:hover,header .navbar .navbar-brand:active,header .navbar .navbar-brand:focus{color: transparent}header .navbar .navbar-brand.lang-ar{background-image: url('../../../themes/bootprint3/images/vufind_logo_ar.png')}header .navbar .navbar-nav > li > a{padding: 12px 6px}@media (max-width: 767px){header .navbar .navbar-nav > li > a{padding: 8px 24px}}header .navbar .navbar-right{margin-top: 12px}@media (max-width: 767px){header .navbar .navbar-right{margin: 0}}header .searchbox{background: linear-gradient(to bottom, #fff, #eee);display: block !important}header .searchbox .tab-content{border: 0}header .searchbox .tab-content .navbar-text{margin: 5px 10px 5px 0}@media (max-width: 767px){header #header-collapse .navbar-right li{text-align: right}header .searchForm_type{margin-top: 2px;margin-bottom: 2px}}header .breadcrumb{border: 1px solid #ccc;border-radius: 0;border-width: 1px 0;font-size: 12px;margin-bottom: 2px;padding: 7px 20px 5px}.searchForm_lookfor,.searchForm_type{border-color: #619144}[name=searchForm]{margin: 6px 8px 8px;padding: 0}[name=searchForm] .btn-primary,[name=searchForm] .form-control,.template-dir-eds.template-name-advanced [name=searchForm] .clear-btn,.template-dir-search.template-name-advanced [name=searchForm] .clear-btn{font-size: 14px;height: 32px;padding: 5px 8px}[name=searchForm] .btn-primary[multiple],[name=searchForm] .form-control[multiple],.template-dir-eds.template-name-advanced [name=searchForm] .clear-btn[multiple],.template-dir-search.template-name-advanced [name=searchForm] .clear-btn[multiple]{height: auto}@media (min-width: 768px){[name=searchForm] .search-query{width: 400px}}[name=searchForm] .nav-tabs{border-bottom: 0;padding: 0 6px}[name=searchForm] .nav-tabs li a{margin-bottom: -1px;border-bottom: 0;padding-bottom: 6px}[name=searchForm] .nav-tabs li a:hover{background: none;border-color: transparent;text-decoration: underline}[name=searchForm] .nav-tabs li.active a,[name=searchForm] .nav-tabs li.active a:hover{background: #FFF;border-color: #619144;border-bottom: 0;text-decoration: none;z-index: 5}.main .container{padding: 0 4px 18px}footer{margin-bottom: 36px}footer .container{border-radius: 0 0 5px 5px;border-top: 1px solid #ddd;padding-top: 18px}footer hr{display: none}footer p{margin: 0}footer ul{padding-left: 30px}body.offcanvas .sidebar .list-group{color: #000}body.offcanvas .sidebar .list-group{color: #000}body.offcanvas .offcanvas-toggle{padding-bottom: 18px;font-size: 16px;background: #fff;box-shadow: 0 0 2px #000;color: #619144}body.offcanvas.active .sidebar{color: #FFF}body.offcanvas.active .offcanvas-toggle{box-shadow: none}#dateVisColorSettings{background-color: #fff;fill: #eaeaea;outline-color: #e8cfac;stroke: #619144}#commentList .comment:nth-child(even){background: #eee}#hierarchyRecord{background: #FFF}.alert{padding: 8px}.bulkActionButtons{margin-bottom: 6px}.result > .col-xs-1.checkbox{width: auto}.result .label{display: inline-block;margin-bottom: 4px}.result .left{text-align: center}.result .savedLists{margin: 0 0 4px 0;padding: 4px 0 4px 6px}.result .savedLists ul{padding-left: 18px}@media (max-width: 767px){.result .search-controls .form-inline{text-align: left}}@media (min-width: 768px){.result > .col-xs-1.checkbox{padding: 0}.result > .col-xs-11{width: 95%;padding: 0}}.search-controls label{text-align: left}@media (max-width: 767px){.search-controls{margin: 4px -4px;padding: 4px 0}}.searchHomeContent{float: none;margin: 1em auto;width: 90%}#advSearchForm .search{margin: 0}.group .match{margin-top: .5em}.template-dir-eds.template-name-advanced .clear-btn,.template-dir-search.template-name-advanced .clear-btn{background-image: linear-gradient(#fff, #eee)}.sidebar .list-group{margin-bottom: 5px}.sidebar .list-group label.list-group-item{padding-left: 26px}.sidebar .list-group label.list-group-item input[type=checkbox]{margin-top: 2px}.sidebar .list-group-item{padding: 7px 10px 6px}.sidebar .list-group-item.active{background: #e70;border-color: #e70;color: #FFF}.sidebar .list-group-item.active:hover{background: #e70;border-color: #e70}.sidebar .list-group-item.active .badge{color: #e70}.sidebar .slider-container{margin: 4px auto 10px;width: 95%}.sidebar .slider-container .slider-handle{background: #619144;opacity: 1}.sidebar .list-group-item .badge a,.top-row .badge a{color: #FFF}.sidebar .list-group-item .badge a:hover,.top-row .badge a:hover{color: #a41915}#custom_recaptcha_widget{display: table}#custom_recaptcha_widget embed{display: none}#custom_recaptcha_widget #recaptcha_image{border: 1px solid #000;padding: 6px;margin: 1em 0}#custom_recaptcha_widget #recaptcha_response_field{margin: 0 .5em}#custom_recaptcha_widget > div > a{display: inline-block;float: left;margin: 5px 10px 5px 0}ul.random{list-style: none;padding: 0;margin: 0px;text-align: justified}ul.random li{padding-bottom: 10px}ul.random li img{margin: 0 auto 1em auto}ul.random.image,ul.random.mixed{text-align: center}ul.random.image li img{margin: 0 auto}.tt-dropdown-menu{margin: 2px}[id^=list].list-group .col-sm-9{margin: 0}.container > .row > .col-xs-12{padding: 0}.vudl.row{padding: 4px 0}
\ No newline at end of file
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */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: .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{-moz-box-sizing: content-box;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;-moz-box-sizing: content-box;-webkit-box-sizing: content-box;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: .35em .625em .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}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 th,.table-bordered td{border: 1px solid #ddd !important}}@font-face{font-family: 'Glyphicons Halflings';src: url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.eot');src: url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../../themes/bootstrap3/css/less/fonts/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: "\2a"}.glyphicon-plus:before{content: "\2b"}.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"}*{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}*:before,*:after{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}html{font-size: 10px;-webkit-tap-highlight-color: rgba(0,0,0,0)}body{font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 13px;line-height: 1.42857143;color: #333;background-color: #fff}input,button,select,textarea{font-family: inherit;font-size: inherit;line-height: inherit}a{color: #12538b;text-decoration: none}a:hover,a:focus{color: #092b47;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,.thumbnail > img,.thumbnail a > img,.carousel-inner > .item > img,.carousel-inner > .item > a > img{display: block;max-width: 100%;height: auto}.img-rounded{border-radius: 5px}.img-thumbnail{padding: 4px;line-height: 1.42857143;background-color: #fff;border: 1px solid #ddd;border-radius: 3px;-webkit-transition: all .2s ease-in-out;-o-transition: all .2s ease-in-out;transition: all .2s ease-in-out;display: inline-block;max-width: 100%;height: auto}.img-circle{border-radius: 50%}hr{margin-top: 18px;margin-bottom: 18px;border: 0;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}[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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight: normal;line-height: 1;color: #777}h1,.h1,h2,.h2,h3,.h3{margin-top: 18px;margin-bottom: 9px}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,.h4,h5,.h5,h6,.h6{margin-top: 9px;margin-bottom: 9px}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: 33px}h2,.h2{font-size: 27px}h3,.h3{font-size: 23px}h4,.h4{font-size: 17px}h5,.h5{font-size: 13px}h6,.h6{font-size: 12px}p{margin: 0 0 9px}.lead{margin-bottom: 18px;font-size: 14px;font-weight: 300;line-height: 1.4}@media (min-width: 768px){.lead{font-size: 19.5px}}small,.small{font-size: 92%}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{text-transform: uppercase}.text-capitalize{text-transform: capitalize}.text-muted{color: #777}.text-primary{color: #619144}a.text-primary:hover{color: #4a6e34}.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: #619144}a.bg-primary:hover{background-color: #4a6e34}.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}.page-header{padding-bottom: 8px;margin: 36px 0 18px;border-bottom: 1px solid #eee}ul,ol{margin-top: 0;margin-bottom: 9px}ul ul,ol ul,ul ol,ol ol{margin-bottom: 0}.list-unstyled{padding-left: 0;list-style: none}.list-inline{padding-left: 0;list-style: none;margin: 0;margin-left: -5px}.list-inline > li{display: inline-block;padding-left: 5px;padding-right: 5px}dl{margin-top: 0;margin-bottom: 18px}dt,dd{line-height: 1.42857143}dt{font-weight: bold}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}}abbr[title],abbr[data-original-title]{cursor: help;border-bottom: 1px dotted #777}.initialism{font-size: 90%;text-transform: uppercase}blockquote{padding: 9px 18px;margin: 0 0 18px;font-size: 16.25px;border-left: 5px solid #eee}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.42857143;color: #777}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 #eee;border-left: 0;text-align: right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content: ''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content: '\00A0 \2014'}address{margin-bottom: 18px;font-style: normal;line-height: 1.42857143}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: 3px}kbd{padding: 2px 4px;font-size: 90%;color: #fff;background-color: #333;border-radius: 2px;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: 8.5px;margin: 0 0 9px;font-size: 12px;line-height: 1.42857143;word-break: break-all;word-wrap: break-word;color: #333;background-color: #f5f5f5;border: 1px solid #ccc;border-radius: 3px}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: 7px;padding-right: 7px}@media (min-width: 768px){.container{width: 734px}}@media (min-width: 992px){.container{width: 952px}}@media (min-width: 1200px){.container{width: 952px}}.container-fluid{margin-right: auto;margin-left: auto;padding-left: 7px;padding-right: 7px}.row{margin-left: -7px;margin-right: -7px}.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: 7px;padding-right: 7px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float: left}.col-xs-12{width: 100%}.col-xs-11{width: 91.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-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float: left}.col-sm-12{width: 100%}.col-sm-11{width: 91.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-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float: left}.col-md-12{width: 100%}.col-md-11{width: 91.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-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float: left}.col-lg-12{width: 100%}.col-lg-11{width: 91.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%}}table{background-color: transparent}caption{padding-top: 8px;padding-bottom: 8px;color: #777;text-align: left}th{text-align: left}.table{width: 100%;max-width: 100%;margin-bottom: 18px}.table > thead > tr > th,.table > tbody > tr > th,.table > tfoot > tr > th,.table > thead > tr > td,.table > tbody > tr > td,.table > tfoot > tr > td{padding: 8px;line-height: 1.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 > th,.table > colgroup + thead > tr:first-child > th,.table > thead:first-child > tr:first-child > th,.table > caption + thead > tr:first-child > td,.table > colgroup + thead > tr:first-child > td,.table > thead:first-child > tr:first-child > td{border-top: 0}.table > tbody + tbody{border-top: 2px solid #ddd}.table .table{background-color: #fff}.table-condensed > thead > tr > th,.table-condensed > tbody > tr > th,.table-condensed > tfoot > tr > th,.table-condensed > thead > tr > td,.table-condensed > tbody > tr > td,.table-condensed > tfoot > tr > td{padding: 5px}.table-bordered{border: 1px solid #ddd}.table-bordered > thead > tr > th,.table-bordered > tbody > tr > th,.table-bordered > tfoot > tr > th,.table-bordered > thead > tr > td,.table-bordered > tbody > tr > td,.table-bordered > tfoot > tr > td{border: 1px solid #ddd}.table-bordered > thead > tr > th,.table-bordered > thead > tr > td{border-bottom-width: 2px}.table-striped > tbody > tr:nth-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 > tbody > tr > td.active,.table > tfoot > tr > td.active,.table > thead > tr > th.active,.table > tbody > tr > th.active,.table > tfoot > tr > th.active,.table > thead > tr.active > td,.table > tbody > tr.active > td,.table > tfoot > tr.active > td,.table > thead > tr.active > th,.table > tbody > tr.active > th,.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 > tbody > tr > td.success,.table > tfoot > tr > td.success,.table > thead > tr > th.success,.table > tbody > tr > th.success,.table > tfoot > tr > th.success,.table > thead > tr.success > td,.table > tbody > tr.success > td,.table > tfoot > tr.success > td,.table > thead > tr.success > th,.table > tbody > tr.success > th,.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 > tbody > tr > td.info,.table > tfoot > tr > td.info,.table > thead > tr > th.info,.table > tbody > tr > th.info,.table > tfoot > tr > th.info,.table > thead > tr.info > td,.table > tbody > tr.info > td,.table > tfoot > tr.info > td,.table > thead > tr.info > th,.table > tbody > tr.info > th,.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 > tbody > tr > td.warning,.table > tfoot > tr > td.warning,.table > thead > tr > th.warning,.table > tbody > tr > th.warning,.table > tfoot > tr > th.warning,.table > thead > tr.warning > td,.table > tbody > tr.warning > td,.table > tfoot > tr.warning > td,.table > thead > tr.warning > th,.table > tbody > tr.warning > th,.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 > tbody > tr > td.danger,.table > tfoot > tr > td.danger,.table > thead > tr > th.danger,.table > tbody > tr > th.danger,.table > tfoot > tr > th.danger,.table > thead > tr.danger > td,.table > tbody > tr.danger > td,.table > tfoot > tr.danger > td,.table > thead > tr.danger > th,.table > tbody > tr.danger > th,.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: 13.5px;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 > tbody > tr > th,.table-responsive > .table > tfoot > tr > th,.table-responsive > .table > thead > tr > td,.table-responsive > .table > tbody > tr > td,.table-responsive > .table > tfoot > tr > td{white-space: nowrap}.table-responsive > .table-bordered{border: 0}.table-responsive > .table-bordered > thead > tr > th:first-child,.table-responsive > .table-bordered > tbody > tr > th:first-child,.table-responsive > .table-bordered > tfoot > tr > th:first-child,.table-responsive > .table-bordered > thead > tr > td:first-child,.table-responsive > .table-bordered > tbody > tr > td:first-child,.table-responsive > .table-bordered > tfoot > tr > td:first-child{border-left: 0}.table-responsive > .table-bordered > thead > tr > th:last-child,.table-responsive > .table-bordered > tbody > tr > th:last-child,.table-responsive > .table-bordered > tfoot > tr > th:last-child,.table-responsive > .table-bordered > thead > tr > td:last-child,.table-responsive > .table-bordered > tbody > tr > td:last-child,.table-responsive > .table-bordered > tfoot > tr > td:last-child{border-right: 0}.table-responsive > .table-bordered > tbody > tr:last-child > th,.table-responsive > .table-bordered > tfoot > tr:last-child > th,.table-responsive > .table-bordered > tbody > tr:last-child > td,.table-responsive > .table-bordered > tfoot > tr:last-child > td{border-bottom: 0}}fieldset{padding: 0;margin: 0;border: 0;min-width: 0}legend{display: block;width: 100%;padding: 0;margin-bottom: 18px;font-size: 19.5px;line-height: inherit;color: #333;border: 0;border-bottom: 1px solid #777}label{display: inline-block;max-width: 100%;margin-bottom: 5px;font-weight: bold}input[type="search"]{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}input[type="radio"],input[type="checkbox"]{margin: 4px 0 0;margin-top: 1px \9;line-height: normal}input[type="file"]{display: block}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: 4px;font-size: 13px;line-height: 1.42857143;color: #555}.form-control{display: block;width: 100%;height: 26px;padding: 3px 5px;font-size: 13px;line-height: 1.42857143;color: #555;background-color: #fff;background-image: none;border: 1px solid #ccc;border-radius: 3px;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color: #619144;outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(97,145,68,0.6);box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(97,145,68,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[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color: #eee;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"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height: 26px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.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"]{line-height: 22px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.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"]{line-height: 41px}}.form-group{margin-bottom: 15px}.radio,.checkbox{position: relative;display: block;margin-top: 10px;margin-bottom: 10px}.radio label,.checkbox label{min-height: 18px;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="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor: not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor: not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor: not-allowed}.form-control-static{padding-top: 4px;padding-bottom: 4px;margin-bottom: 0;min-height: 31px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left: 0;padding-right: 0}.input-sm{height: 22px;padding: 1px 2px;font-size: 12px;line-height: 1.5;border-radius: 2px}select.input-sm{height: 22px;line-height: 22px}textarea.input-sm,select[multiple].input-sm{height: auto}.form-group-sm .form-control{height: 22px;padding: 1px 2px;font-size: 12px;line-height: 1.5;border-radius: 2px}select.form-group-sm .form-control{height: 22px;line-height: 22px}textarea.form-group-sm .form-control,select[multiple].form-group-sm .form-control{height: auto}.form-group-sm .form-control-static{height: 22px;padding: 1px 2px;font-size: 12px;line-height: 1.5;min-height: 30px}.input-lg{height: 41px;padding: 8px 5px;font-size: 17px;line-height: 1.3333333;border-radius: 5px}select.input-lg{height: 41px;line-height: 41px}textarea.input-lg,select[multiple].input-lg{height: auto}.form-group-lg .form-control{height: 41px;padding: 8px 5px;font-size: 17px;line-height: 1.3333333;border-radius: 5px}select.form-group-lg .form-control{height: 41px;line-height: 41px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height: auto}.form-group-lg .form-control-static{height: 41px;padding: 8px 5px;font-size: 17px;line-height: 1.3333333;min-height: 35px}.has-feedback{position: relative}.has-feedback .form-control{padding-right: 32.5px}.form-control-feedback{position: absolute;top: 0;right: 0;z-index: 2;display: block;width: 26px;height: 26px;line-height: 26px;text-align: center;pointer-events: none}.input-lg + .form-control-feedback{width: 41px;height: 41px;line-height: 41px}.input-sm + .form-control-feedback{width: 22px;height: 22px;line-height: 22px}.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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color: #2b542c;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #67b168;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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color: #66512c;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #c0a16b;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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color: #843534;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483;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: 23px}.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: 4px}.form-horizontal .radio,.form-horizontal .checkbox{min-height: 22px}.form-horizontal .form-group{margin-left: -7px;margin-right: -7px}@media (min-width: 768px){.form-horizontal .control-label{text-align: right;margin-bottom: 0;padding-top: 4px}}.form-horizontal .has-feedback .form-control-feedback{right: 7px}@media (min-width: 768px){.form-horizontal .form-group-lg .control-label{padding-top: 11.6666664px}}@media (min-width: 768px){.form-horizontal .form-group-sm .control-label{padding-top: 2px}}.btn{display: inline-block;margin-bottom: 0;font-weight: normal;text-align: center;vertical-align: middle;touch-action: manipulation;cursor: pointer;background-image: none;border: 1px solid transparent;white-space: nowrap;padding: 3px 5px;font-size: 13px;line-height: 1.42857143;border-radius: 3px;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.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;-webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);box-shadow: inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor: not-allowed;pointer-events: none;opacity: .65;filter: alpha(opacity=65);-webkit-box-shadow: none;box-shadow: none}.btn-default{color: #333;background-color: #fff;border-color: #ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open > .dropdown-toggle.btn-default{color: #333;background-color: #e6e6e6;border-color: #adadad}.btn-default:active,.btn-default.active,.open > .dropdown-toggle.btn-default{background-image: none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color: #fff;border-color: #ccc}.btn-default .badge{color: #fff;background-color: #333}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color: #fff;background-color: #333;border-color: #adadad}.btn-primary{color: #fff;background-color: #619144;border-color: #fff}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary{color: #fff;background-color: #4a6e34;border-color: #e0e0e0}.btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary{background-image: none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color: #619144;border-color: #fff}.btn-primary .badge{color: #619144;background-color: #fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color: #619144;background-color: #fff;border-color: #e0e0e0}.btn-success{color: #fff;background-color: #028302;border-color: #fff}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open > .dropdown-toggle.btn-success{color: #fff;background-color: #015101;border-color: #e0e0e0}.btn-success:active,.btn-success.active,.open > .dropdown-toggle.btn-success{background-image: none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color: #028302;border-color: #fff}.btn-success .badge{color: #028302;background-color: #fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color: #028302;background-color: #fff;border-color: #e0e0e0}.btn-info{color: #fff;background-color: #1c5f74;border-color: #fff}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open > .dropdown-toggle.btn-info{color: #fff;background-color: #123d4b;border-color: #e0e0e0}.btn-info:active,.btn-info.active,.open > .dropdown-toggle.btn-info{background-image: none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color: #1c5f74;border-color: #fff}.btn-info .badge{color: #1c5f74;background-color: #fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color: #1c5f74;background-color: #fff;border-color: #e0e0e0}.btn-warning{color: #fff;background-color: #a56100;border-color: #fff}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open > .dropdown-toggle.btn-warning{color: #fff;background-color: #724300;border-color: #e0e0e0}.btn-warning:active,.btn-warning.active,.open > .dropdown-toggle.btn-warning{background-image: none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color: #a56100;border-color: #fff}.btn-warning .badge{color: #a56100;background-color: #fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color: #a56100;background-color: #fff;border-color: #e0e0e0}.btn-danger{color: #fff;background-color: #a41915;border-color: #fff}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger{color: #fff;background-color: #77120f;border-color: #e0e0e0}.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger{background-image: none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color: #a41915;border-color: #fff}.btn-danger .badge{color: #a41915;background-color: #fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color: #a41915;background-color: #fff;border-color: #e0e0e0}.btn-link{color: #12538b;font-weight: normal;border-radius: 0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color: transparent;-webkit-box-shadow: none;box-shadow: none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color: transparent}.btn-link:hover,.btn-link:focus{color: #092b47;text-decoration: underline;background-color: transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color: #777;text-decoration: none}.btn-lg,.btn-group-lg > .btn{padding: 8px 5px;font-size: 17px;line-height: 1.3333333;border-radius: 5px}.btn-sm,.btn-group-sm > .btn{padding: 1px 2px;font-size: 12px;line-height: 1.5;border-radius: 2px}.btn-xs,.btn-group-xs > .btn{padding: 1px 1px;font-size: 12px;line-height: 1.5;border-radius: 2px}.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;-webkit-transition: opacity .15s linear;-o-transition: opacity .15s linear;transition: opacity .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;-webkit-transition-property: height, visibility;transition-property: height, visibility;-webkit-transition-duration: .35s;transition-duration: .35s;-webkit-transition-timing-function: ease;transition-timing-function: ease}.caret{display: inline-block;width: 0;height: 0;margin-left: 2px;vertical-align: middle;border-top: 4px dashed;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: 13px;text-align: left;background-color: #fff;border: 1px solid #ccc;border: 1px solid rgba(0,0,0,0.15);border-radius: 3px;-webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175);box-shadow: 0 6px 12px rgba(0,0,0,0.175);background-clip: padding-box}.dropdown-menu.pull-right{right: 0;left: auto}.dropdown-menu .divider{height: 1px;margin: 8px 0;overflow: hidden;background-color: #e5e5e5}.dropdown-menu > li > a{display: block;padding: 3px 20px;clear: both;font-weight: normal;line-height: 1.42857143;color: #333;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: #619144}.dropdown-menu > .disabled > a,.dropdown-menu > .disabled > a:hover,.dropdown-menu > .disabled > a:focus{color: #777}.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.42857143;color: #777;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 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 > .btn,.btn-group-vertical > .btn{position: relative;float: left}.btn-group > .btn:hover,.btn-group-vertical > .btn:hover,.btn-group > .btn:focus,.btn-group-vertical > .btn:focus,.btn-group > .btn:active,.btn-group-vertical > .btn:active,.btn-group > .btn.active,.btn-group-vertical > .btn.active{z-index: 2}.btn-group .btn + .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-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{padding-left: 12px;padding-right: 12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);box-shadow: inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow: none;box-shadow: none}.btn .caret{margin-left: 0}.btn-lg .caret{border-width: 5px 5px 0;border-bottom-width: 0}.dropup .btn-lg .caret{border-width: 0 5px 5px}.btn-group-vertical > .btn,.btn-group-vertical > .btn-group,.btn-group-vertical > .btn-group > .btn{display: block;float: none;width: 100%;max-width: 100%}.btn-group-vertical > .btn-group > .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: 3px;border-bottom-right-radius: 0;border-bottom-left-radius: 0}.btn-group-vertical > .btn:last-child:not(:first-child){border-bottom-left-radius: 3px;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="radio"],[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],[data-toggle="buttons"] > .btn input[type="checkbox"],[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-lg > .form-control,.input-group-lg > .input-group-addon,.input-group-lg > .input-group-btn > .btn{height: 41px;padding: 8px 5px;font-size: 17px;line-height: 1.3333333;border-radius: 5px}select.input-group-lg > .form-control,select.input-group-lg > .input-group-addon,select.input-group-lg > .input-group-btn > .btn{height: 41px;line-height: 41px}textarea.input-group-lg > .form-control,textarea.input-group-lg > .input-group-addon,textarea.input-group-lg > .input-group-btn > .btn,select[multiple].input-group-lg > .form-control,select[multiple].input-group-lg > .input-group-addon,select[multiple].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: 22px;padding: 1px 2px;font-size: 12px;line-height: 1.5;border-radius: 2px}select.input-group-sm > .form-control,select.input-group-sm > .input-group-addon,select.input-group-sm > .input-group-btn > .btn{height: 22px;line-height: 22px}textarea.input-group-sm > .form-control,textarea.input-group-sm > .input-group-addon,textarea.input-group-sm > .input-group-btn > .btn,select[multiple].input-group-sm > .form-control,select[multiple].input-group-sm > .input-group-addon,select[multiple].input-group-sm > .input-group-btn > .btn{height: auto}.input-group-addon,.input-group-btn,.input-group .form-control{display: table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius: 0}.input-group-addon,.input-group-btn{width: 1%;white-space: nowrap;vertical-align: middle}.input-group-addon{padding: 3px 5px;font-size: 13px;font-weight: normal;line-height: 1;color: #555;text-align: center;background-color: #eee;border: 1px solid #ccc;border-radius: 3px}.input-group-addon.input-sm{padding: 1px 2px;font-size: 12px;border-radius: 2px}.input-group-addon.input-lg{padding: 8px 5px;font-size: 17px;border-radius: 5px}.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{margin-left: -1px}.nav{margin-bottom: 0;padding-left: 0;list-style: none}.nav > li{position: relative;display: block}.nav > li > a{position: relative;display: block;padding: 5px}.nav > li > a:hover,.nav > li > a:focus{text-decoration: none;background-color: #eee}.nav > li.disabled > a{color: #777}.nav > li.disabled > a:hover,.nav > li.disabled > a:focus{color: #777;text-decoration: none;background-color: transparent;cursor: not-allowed}.nav .open > a,.nav .open > a:hover,.nav .open > a:focus{background-color: #eee;border-color: #12538b}.nav .nav-divider{height: 1px;margin: 8px 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: 3px 3px 0 0}.nav-tabs > li > a:hover{border-color: #eee #eee #ddd}.nav-tabs > li.active > a,.nav-tabs > li.active > a:hover,.nav-tabs > li.active > a:focus{color: #555;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}.nav-tabs.nav-justified > .dropdown .dropdown-menu{top: auto;left: auto}@media (min-width: 768px){.nav-tabs.nav-justified > li{display: table-cell;width: 1%}.nav-tabs.nav-justified > li > a{margin-bottom: 0}}.nav-tabs.nav-justified > li > a{margin-right: 0;border-radius: 3px}.nav-tabs.nav-justified > .active > a,.nav-tabs.nav-justified > .active > a:hover,.nav-tabs.nav-justified > .active > a:focus{border: 1px solid #ddd}@media (min-width: 768px){.nav-tabs.nav-justified > li > a{border-bottom: 1px solid #ddd;border-radius: 3px 3px 0 0}.nav-tabs.nav-justified > .active > a,.nav-tabs.nav-justified > .active > a:hover,.nav-tabs.nav-justified > .active > a:focus{border-bottom-color: #fff}}.nav-pills > li{float: left}.nav-pills > li > a{border-radius: 3px}.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: #619144}.nav-stacked > li{float: none}.nav-stacked > li + li{margin-top: 2px;margin-left: 0}.nav-justified{width: 100%}.nav-justified > li{float: none}.nav-justified > li > a{text-align: center;margin-bottom: 5px}.nav-justified > .dropdown .dropdown-menu{top: auto;left: auto}@media (min-width: 768px){.nav-justified > li{display: table-cell;width: 1%}.nav-justified > li > a{margin-bottom: 0}}.nav-tabs-justified{border-bottom: 0}.nav-tabs-justified > li > a{margin-right: 0;border-radius: 3px}.nav-tabs-justified > .active > a,.nav-tabs-justified > .active > a:hover,.nav-tabs-justified > .active > a:focus{border: 1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified > li > a{border-bottom: 1px solid #ddd;border-radius: 3px 3px 0 0}.nav-tabs-justified > .active > a,.nav-tabs-justified > .active > a:hover,.nav-tabs-justified > .active > a:focus{border-bottom-color: #fff}}.tab-content > .tab-pane{display: none}.tab-content > .active{display: block}.nav-tabs .dropdown-menu{margin-top: -1px;border-top-right-radius: 0;border-top-left-radius: 0}.navbar{position: relative;min-height: 65px;margin-bottom: 0px;border: 1px solid transparent}@media (min-width: 768px){.navbar{border-radius: 3px}}@media (min-width: 768px){.navbar-header{float: left}}.navbar-collapse{overflow-x: visible;padding-right: 7px;padding-left: 7px;border-top: 1px solid transparent;box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling: touch}.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-fluid > .navbar-header,.container > .navbar-collapse,.container-fluid > .navbar-collapse{margin-right: -7px;margin-left: -7px}@media (min-width: 768px){.container > .navbar-header,.container-fluid > .navbar-header,.container > .navbar-collapse,.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: 23.5px 7px;font-size: 17px;line-height: 18px;height: 65px}.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: -7px}}.navbar-toggle{position: relative;float: right;margin-right: 7px;padding: 9px 10px;margin-top: 15.5px;margin-bottom: 15.5px;background-color: transparent;background-image: none;border: 1px solid transparent;border-radius: 3px}.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: 11.75px -7px}.navbar-nav > li > a{padding-top: 10px;padding-bottom: 10px;line-height: 18px}@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: 18px}.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: 23.5px;padding-bottom: 23.5px}}.navbar-form{margin-left: -7px;margin-right: -7px;padding: 10px 7px;border-top: 1px solid transparent;border-bottom: 1px solid transparent;-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.1);box-shadow: inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.1);margin-top: 19.5px;margin-bottom: 19.5px}@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;-webkit-box-shadow: none;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: 3px;border-top-left-radius: 3px;border-bottom-right-radius: 0;border-bottom-left-radius: 0}.navbar-btn{margin-top: 19.5px;margin-bottom: 19.5px}.navbar-btn.btn-sm{margin-top: 21.5px;margin-bottom: 21.5px}.navbar-btn.btn-xs{margin-top: 21.5px;margin-bottom: 21.5px}.navbar-text{margin-top: 23.5px;margin-bottom: 23.5px}@media (min-width: 768px){.navbar-text{float: left;margin-left: 7px;margin-right: 7px}}@media (min-width: 768px){.navbar-left{float: left !important}.navbar-right{float: right !important;margin-right: -7px}.navbar-right ~ .navbar-right{margin-right: 0}}.navbar-default{background-color: #132531;border-color: #0a1319}.navbar-default .navbar-brand{color: #fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color: #068139;background-color: transparent}.navbar-default .navbar-text{color: #fff}.navbar-default .navbar-nav > li > a{color: #fff}.navbar-default .navbar-nav > li > a:hover,.navbar-default .navbar-nav > li > a:focus{color: #132531;background-color: #fff}.navbar-default .navbar-nav > .active > a,.navbar-default .navbar-nav > .active > a:hover,.navbar-default .navbar-nav > .active > a:focus{color: #132531;background-color: #fff}.navbar-default .navbar-nav > .disabled > a,.navbar-default .navbar-nav > .disabled > a:hover,.navbar-default .navbar-nav > .disabled > a:focus{color: #fff;background-color: #068139}.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: #0a1319}.navbar-default .navbar-nav > .open > a,.navbar-default .navbar-nav > .open > a:hover,.navbar-default .navbar-nav > .open > a:focus{background-color: #fff;color: #132531}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu > li > a{color: #fff}.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus{color: #132531;background-color: #fff}.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: #132531;background-color: #fff}.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: #fff;background-color: #068139}}.navbar-default .navbar-link{color: #fff}.navbar-default .navbar-link:hover{color: #132531}.navbar-default .btn-link{color: #fff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color: #132531}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color: #fff}.navbar-inverse{background-color: #222;border-color: #080808}.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: #080808}.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: #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: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: #080808}.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,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color: #444}.breadcrumb{padding: 6px 20px;margin-bottom: 18px;list-style: none;background-color: #fff;border-radius: 3px}.breadcrumb > li{display: inline-block}.breadcrumb > li + li:before{content: "/\00a0";padding: 0 5px;color: #777}.breadcrumb > .active{color: #333}.pagination{display: inline-block;padding-left: 0;margin: 18px 0;border-radius: 3px}.pagination > li{display: inline}.pagination > li > a,.pagination > li > span{position: relative;float: left;padding: 3px 5px;line-height: 1.42857143;text-decoration: none;color: #12538b;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: 3px;border-top-left-radius: 3px}.pagination > li:last-child > a,.pagination > li:last-child > span{border-bottom-right-radius: 3px;border-top-right-radius: 3px}.pagination > li > a:hover,.pagination > li > span:hover,.pagination > li > a:focus,.pagination > li > span:focus{color: #092b47;background-color: #eee;border-color: #ddd}.pagination > .active > a,.pagination > .active > span,.pagination > .active > a:hover,.pagination > .active > span:hover,.pagination > .active > a:focus,.pagination > .active > span:focus{z-index: 2;color: #fff;background-color: #1c5f74;border-color: #1c5f74;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: #777;background-color: #fff;border-color: #ddd;cursor: not-allowed}.pagination-lg > li > a,.pagination-lg > li > span{padding: 8px 5px;font-size: 17px}.pagination-lg > li:first-child > a,.pagination-lg > li:first-child > span{border-bottom-left-radius: 5px;border-top-left-radius: 5px}.pagination-lg > li:last-child > a,.pagination-lg > li:last-child > span{border-bottom-right-radius: 5px;border-top-right-radius: 5px}.pagination-sm > li > a,.pagination-sm > li > span{padding: 1px 2px;font-size: 12px}.pagination-sm > li:first-child > a,.pagination-sm > li:first-child > span{border-bottom-left-radius: 2px;border-top-left-radius: 2px}.pagination-sm > li:last-child > a,.pagination-sm > li:last-child > span{border-bottom-right-radius: 2px;border-top-right-radius: 2px}.pager{padding-left: 0;margin: 18px 0;list-style: none;text-align: center}.pager li{display: inline}.pager li > a,.pager li > span{display: inline-block;padding: 5px 14px;background-color: #fff;border: 1px solid #ddd;border-radius: 15px}.pager li > a:hover,.pager li > a:focus{text-decoration: none;background-color: #eee}.pager .next > a,.pager .next > span{float: right}.pager .previous > a,.pager .previous > span{float: left}.pager .disabled > a,.pager .disabled > a:hover,.pager .disabled > a:focus,.pager .disabled > span{color: #777;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}a.label:hover,a.label:focus{color: #fff;text-decoration: none;cursor: pointer}.label:empty{display: none}.btn .label{position: relative;top: -1px}.label-default{background-color: #777}.label-default[href]:hover,.label-default[href]:focus{background-color: #5e5e5e}.label-primary{background-color: #619144}.label-primary[href]:hover,.label-primary[href]:focus{background-color: #4a6e34}.label-success{background-color: #028302}.label-success[href]:hover,.label-success[href]:focus{background-color: #015101}.label-info{background-color: #1c5f74}.label-info[href]:hover,.label-info[href]:focus{background-color: #123d4b}.label-warning{background-color: #a56100}.label-warning[href]:hover,.label-warning[href]:focus{background-color: #724300}.label-danger{background-color: #a41915}.label-danger[href]:hover,.label-danger[href]:focus{background-color: #77120f}.badge{display: inline-block;min-width: 10px;padding: 3px 7px;font-size: 12px;font-weight: bold;color: #fff;line-height: 1;vertical-align: baseline;white-space: nowrap;text-align: center;background-color: #777;border-radius: 10px}.badge:empty{display: none}.btn .badge{position: relative;top: -1px}.btn-xs .badge,.btn-group-xs > .btn .badge{top: 0;padding: 1px 5px}a.badge:hover,a.badge:focus{color: #fff;text-decoration: none;cursor: pointer}.list-group-item.active > .badge,.nav-pills > .active > a > .badge{color: #12538b;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}.jumbotron{padding: 30px 15px;margin-bottom: 30px;color: inherit;background-color: #eee}.jumbotron h1,.jumbotron .h1{color: inherit}.jumbotron p{margin-bottom: 15px;font-size: 20px;font-weight: 200}.jumbotron > hr{border-top-color: #d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius: 5px}.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: 58.5px}}.thumbnail{display: block;padding: 4px;margin-bottom: 18px;line-height: 1.42857143;background-color: #fff;border: 1px solid #ddd;border-radius: 3px;-webkit-transition: border .2s ease-in-out;-o-transition: border .2s ease-in-out;transition: border .2s ease-in-out}.thumbnail > img,.thumbnail a > img{margin-left: auto;margin-right: auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color: #12538b}.thumbnail .caption{padding: 9px;color: #333}.alert{padding: 15px;margin-bottom: 18px;border: 1px solid transparent;border-radius: 3px}.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: 18px;margin-bottom: 18px;background-color: #f5f5f5;border-radius: 3px;-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);box-shadow: inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float: left;width: 0%;height: 100%;font-size: 12px;line-height: 18px;color: #fff;text-align: center;background-color: #619144;-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition: width .6s ease;-o-transition: width .6s ease;transition: width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{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);background-size: 40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation: progress-bar-stripes 2s linear infinite;-o-animation: progress-bar-stripes 2s linear infinite;animation: progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color: #028302}.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-info{background-color: #1c5f74}.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-warning{background-color: #a56100}.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-danger{background-color: #a41915}.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)}.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-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: 3px;border-top-left-radius: 3px}.list-group-item:last-child{margin-bottom: 0;border-bottom-right-radius: 3px;border-bottom-left-radius: 3px}a.list-group-item{color: #555}a.list-group-item .list-group-item-heading{color: #333}a.list-group-item:hover,a.list-group-item:focus{text-decoration: none;color: #555;background-color: #f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color: #eee;color: #777;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: #777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index: 2;color: #fff;background-color: #619144;border-color: #619144}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading > small,.list-group-item.active:hover .list-group-item-heading > small,.list-group-item.active:focus .list-group-item-heading > small,.list-group-item.active .list-group-item-heading > .small,.list-group-item.active:hover .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: #cce1c0}.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:hover,a.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{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:hover,a.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{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:hover,a.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{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:hover,a.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{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: 18px;background-color: #fff;border: 1px solid transparent;border-radius: 3px;-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05);box-shadow: 0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding: 5px}.panel-heading{padding: 10px 15px;border-bottom: 1px solid transparent;border-top-right-radius: 2px;border-top-left-radius: 2px}.panel-heading > .dropdown .dropdown-toggle{color: inherit}.panel-title{margin-top: 0;margin-bottom: 0;font-size: 15px;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: 2px;border-bottom-left-radius: 2px}.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: 2px;border-top-left-radius: 2px}.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: 2px;border-bottom-left-radius: 2px}.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: 5px;padding-right: 5px}.panel > .table:first-child,.panel > .table-responsive:first-child > .table:first-child{border-top-right-radius: 2px;border-top-left-radius: 2px}.panel > .table:first-child > thead:first-child > tr:first-child,.panel > .table-responsive:first-child > .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 > tbody:first-child > tr:first-child{border-top-left-radius: 2px;border-top-right-radius: 2px}.panel > .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 td:first-child,.panel > .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 td:first-child,.panel > .table:first-child > thead:first-child > tr:first-child th: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 th:first-child,.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child{border-top-left-radius: 2px}.panel > .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 td:last-child,.panel > .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 td:last-child,.panel > .table:first-child > thead:first-child > tr:first-child th: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 th:last-child,.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child{border-top-right-radius: 2px}.panel > .table:last-child,.panel > .table-responsive:last-child > .table:last-child{border-bottom-right-radius: 2px;border-bottom-left-radius: 2px}.panel > .table:last-child > tbody:last-child > tr:last-child,.panel > .table-responsive:last-child > .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 > tfoot:last-child > tr:last-child{border-bottom-left-radius: 2px;border-bottom-right-radius: 2px}.panel > .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 td:first-child,.panel > .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 td:first-child,.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child{border-bottom-left-radius: 2px}.panel > .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 td:last-child,.panel > .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 td:last-child,.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child{border-bottom-right-radius: 2px}.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-responsive > .table-bordered > thead > tr > th:first-child,.panel > .table-bordered > tbody > tr > th:first-child,.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,.panel > .table-bordered > tfoot > tr > th:first-child,.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,.panel > .table-bordered > thead > tr > td:first-child,.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,.panel > .table-bordered > tbody > tr > td:first-child,.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,.panel > .table-bordered > tfoot > tr > td:first-child,.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child{border-left: 0}.panel > .table-bordered > thead > tr > th:last-child,.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,.panel > .table-bordered > tbody > tr > th:last-child,.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,.panel > .table-bordered > tfoot > tr > th:last-child,.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,.panel > .table-bordered > thead > tr > td:last-child,.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,.panel > .table-bordered > tbody > tr > td:last-child,.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,.panel > .table-bordered > tfoot > tr > td:last-child,.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child{border-right: 0}.panel > .table-bordered > thead > tr:first-child > td,.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,.panel > .table-bordered > tbody > tr:first-child > td,.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,.panel > .table-bordered > thead > tr:first-child > th,.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,.panel > .table-bordered > tbody > tr:first-child > th,.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th{border-bottom: 0}.panel > .table-bordered > tbody > tr:last-child > td,.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,.panel > .table-bordered > tfoot > tr:last-child > td,.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,.panel > .table-bordered > tbody > tr:last-child > th,.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,.panel > .table-bordered > tfoot > tr:last-child > th,.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th{border-bottom: 0}.panel > .table-responsive{border: 0;margin-bottom: 0}.panel-group{margin-bottom: 18px}.panel-group .panel{margin-bottom: 0;border-radius: 3px}.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: #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: #619144}.panel-primary > .panel-heading{color: #fff;background-color: #619144;border-color: #619144}.panel-primary > .panel-heading + .panel-collapse > .panel-body{border-top-color: #619144}.panel-primary > .panel-heading .badge{color: #619144;background-color: #fff}.panel-primary > .panel-footer + .panel-collapse > .panel-body{border-bottom-color: #619144}.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: 3px;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);box-shadow: inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color: #ddd;border-color: rgba(0,0,0,0.15)}.well-lg{padding: 24px;border-radius: 5px}.well-sm{padding: 9px;border-radius: 2px}.close,.group .group-close{float: right;font-size: 19.5px;font-weight: bold;line-height: 1;color: #000;text-shadow: 0 1px 0 #fff;opacity: .2;filter: alpha(opacity=20)}.close:hover,.close:focus{color: #000;text-decoration: none;cursor: pointer;opacity: .5;filter: alpha(opacity=50)}button.close{padding: 0;cursor: pointer;background: transparent;border: 0;-webkit-appearance: none}.modal-open{overflow: hidden}.modal{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%);-ms-transform: translate(0, -25%);-o-transform: translate(0, -25%);transform: translate(0, -25%);-webkit-transition: -webkit-transform 0.3s ease-out;-moz-transition: -moz-transform 0.3s ease-out;-o-transition: -o-transform 0.3s ease-out;transition: transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform: translate(0, 0);-ms-transform: translate(0, 0);-o-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: 5px;-webkit-box-shadow: 0 3px 9px rgba(0,0,0,0.5);box-shadow: 0 3px 9px rgba(0,0,0,0.5);background-clip: padding-box;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: .5;filter: alpha(opacity=50)}.modal-header{padding: 15px;border-bottom: 1px solid #e5e5e5;min-height: 16.42857143px}.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{-webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.5);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: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 12px;font-weight: normal;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: 3px}.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: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 13px;font-weight: normal;line-height: 1.42857143;text-align: left;background-color: #fff;background-clip: padding-box;border: 1px solid #ccc;border: 1px solid rgba(0,0,0,0.2);border-radius: 5px;-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);box-shadow: 0 5px 10px rgba(0,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: 13px;background-color: #f7f7f7;border-bottom: 1px solid #ebebeb;border-radius: 4px 4px 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: #999;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: #999;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: #999;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: #999;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;-webkit-transition: .6s ease-in-out left;-o-transition: .6s ease-in-out left;transition: .6s ease-in-out left}.carousel-inner > .item > img,.carousel-inner > .item > a > img{line-height: 1}@media all and (transform-3d), (-webkit-transform-3d){.carousel-inner > .item{-webkit-transition: -webkit-transform 0.6s ease-in-out;-moz-transition: -moz-transform 0.6s ease-in-out;-o-transition: -o-transform 0.6s ease-in-out;transition: transform 0.6s ease-in-out;-webkit-backface-visibility: hidden;-moz-backface-visibility: hidden;backface-visibility: hidden;-webkit-perspective: 1000;-moz-perspective: 1000;perspective: 1000}.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: .5;filter: alpha(opacity=50);font-size: 20px;color: #fff;text-align: center;text-shadow: 0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image: -o-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image: linear-gradient(to right, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left: auto;right: 0;background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image: -o-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image: linear-gradient(to right, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline: 0;color: #fff;text-decoration: none;opacity: .9;filter: alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position: absolute;top: 50%;z-index: 5;display: inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left: 50%;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;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;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: -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}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical > .btn-group:before,.btn-group-vertical > .btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content: " ";display: table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical > .btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer: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,.visible-sm,.visible-md,.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}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}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}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}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}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}}.sr-only{clip: rect(1px, 1px, 1px, 1px);position: absolute;width: auto;height: auto;margin: 0;padding: 0;overflow: hidden;border: 0}.sr-only:focus{background-color: #fff;border-radius: 3px;clip: auto;color: #132531;display: block;font-size: 13px;height: 65px;line-height: 18px;padding: 23.5px 7px;position: absolute;left: 5px;top: 5px;text-decoration: none;text-transform: none;width: auto;z-index: 100000}.navbar-brand{font-size: 20px}.alert.alert-info a{text-decoration: underline}.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover{color: #000}[data-toggle~="dropdown"]{cursor: pointer}.fa{cursor: default}@media (min-width: 768px){.form-control{max-width: 400px}}.has-error{margin-bottom: 0}.sms-error{margin-bottom: 0}.sms-error .help-block,.sms-error .control-label,.sms-error .radio,.sms-error .checkbox,.sms-error .radio-inline,.sms-error .checkbox-inline,.sms-error.radio label,.sms-error.checkbox label,.sms-error.radio-inline label,.sms-error.checkbox-inline label{color: #a94442}.sms-error .form-control{border-color: #a94442;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.sms-error .form-control:focus{border-color: #843534;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483;box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483}.sms-error .input-group-addon{color: #a94442;border-color: #a94442;background-color: #f2dede}.sms-error .form-control-feedback{color: #a94442}.help-block.with-errors{padding-top: 3px;padding-bottom: 3px}.help-block.with-errors:empty{padding: 0}.help-block.with-errors,.list-unstyled{margin: 0}.highlight,mark{background: #ff6;padding: .1em .2em}.icon-bar{background-color: #888}img{max-width: 100%}label.list-group-item{margin-top: 0;padding-left: 35px;font-weight: normal;border-radius: 0}.list-group-item.title{font-weight: bold}#modal{background-color: rgba(0,0,0,0.2)}#modal .modal-body > h2:first-child{display: none}.popover{width: 250px}@media (min-width: 768px){h2{font-size: 23px;font-weight: normal}}@media (max-width: 767px){h2{font-size: 20px}}@media (min-width: 768px){h3{font-size: 20px;font-weight: normal}}@media (max-width: 767px){h3{font-size: 16px}}.recordcover{max-height: 300px}.sub-breadcrumb{padding: 5px 10px;white-space: nowrap}.sub-breadcrumb li{display: inline-block}.sub-breadcrumb li + li:before{padding-left: 5px;padding-right: 5px;color: #777;content: "/\00a0"}.tab-content{padding: 4px}@media (max-width: 991px){header .container.navbar{margin-bottom: 0}.searchForm{margin-top: 0}}@media (max-width: 767px){.searchForm{padding-top: 0}}.group{position: relative;background: #eee;border-radius: 3px;border: 1px solid #c8c8c8;margin-top: 0;margin-bottom: .5em !important}.group .add_search_link{display: inline-block;margin-top: 4px}.group .group-close{position: absolute;top: .3em;right: .5em;opacity: .4;z-index: 2}.group .search{margin-bottom: 2px}.group .search .close{opacity: .8}@media (min-width: 768px){.group{padding: 10px 10px 10px 25px}.group [class^=col-]{padding-left: 0}}@media (max-width: 767px){.group .search .middle{float: left;width: 90%}.group .group-close{top: .5em;right: 1em;opacity: .6}}@media (max-width: 991px){.group .form-control{max-width: none}}#groupPlaceHolder{display: block;padding: 6px}.template-dir-eds.template-name-advanced legend{margin-bottom: 0}.template-dir-eds.template-name-advanced .no-js .group:nth-child(n+3){display: none}.template-dir-eds.template-name-advanced .search .close a{margin-left: -2em}.alphabrowse{border-collapse: separate}.alphabrowse .lcc{width: 20%}.alphabrowse .titles{width: 10%;text-align: center}.alphabrowse tr.browse-match td{border-top: .2em solid #619144;border-bottom: .2em solid #619144}.alphabrowse tr.browse-match td:first-child{border-left: .2em solid #619144}.alphabrowse tr.browse-match td:last-child{border-right: .2em solid #619144}.autocomplete-results{margin-top: 2px;border: 1px solid #ddd;background-color: #fff;border-radius: 3px;overflow: hidden}.autocomplete-results .item{display: block;padding-top: .75rem;padding-right: 1rem;padding-bottom: .75rem;padding-left: 1.25rem;border-bottom: 1px solid #ddd;cursor: pointer}.autocomplete-results .item:last-child{border: 0}.autocomplete-results .item.selected{background-color: #619144;color: #fff}.badge a{color: #fff}.browse.list-group .list-group-item{word-wrap: break-word}.browse.list-group .list-group-item.view-record{padding: 2px 4px;font-size: 85%;text-align: right;border-top: 0}.cart-controls .checkbox{line-height: 2.5em;padding-right: 1em}#modal .cart-controls .btn{margin-bottom: 4px}#modal .cart-controls .checkbox{padding-bottom: 1em}#modal .cart-controls ~ hr{margin-top: 0}.fa-grid:before{content: "\f00a"}.fa-visual:before{content: "\f008"}.fa-x:before{content: "\f0f6"}.fa-atlas:before{content: "\f14e"}.fa-book:before{content: "\f02d"}.fa-braille:before{content: "\f0a6"}.fa-cdrom:before{content: "\f109"}.fa-chart:before{content: "\f012"}.fa-chipcartridge:before{content: "\f109"}.fa-collage:before{content: "\f03e"}.fa-disccartridge:before{content: "\f109"}.fa-drawing:before{content: "\f03e"}.fa-ebook:before{content: "\f0f6"}.fa-electronic:before{content: "\f1c6"}.fa-filmstrip:before{content: "\f008"}.fa-flashcard:before{content: "\f0e7"}.fa-floppydisk:before{content: "\f0c7"}.fa-globe:before{content: "\f0ac"}.fa-journal:before{content: "\f0f6"}.fa-kit:before{content: "\f0b1"}.fa-manuscript:before{content: "\f0f6"}.fa-map:before{content: "\f14e"}.fa-microfilm:before{content: "\f008"}.fa-motionpicture:before{content: "\f03d"}.fa-musicalscore:before{content: "\f001"}.fa-musicrecording:before{content: "\f001"}.fa-newspaper:before{content: "\f0f6"}.fa-online:before{content: "\f109"}.fa-painting:before{content: "\f03e"}.fa-photo:before{content: "\f03e"}.fa-photonegative:before{content: "\f03e"}.fa-physicalobject:before{content: "\f187"}.fa-print:before{content: "\f03e"}.fa-sensorimage:before{content: "\f03e"}.fa-serial:before{content: "\f0f6"}.fa-slide:before{content: "\f008"}.fa-software:before{content: "\f109"}.fa-soundcassette:before{content: "\f025"}.fa-sounddisc:before{content: "\f109"}.fa-soundrecording:before{content: "\f025"}.fa-tapecartridge:before{content: "\f109"}.fa-tapecassette:before{content: "\f025"}.fa-tapereel:before{content: "\f008"}.fa-transparency:before{content: "\f008"}.fa-unknown:before{content: "\f128"}.fa-video:before{content: "\f03d"}.fa-videocartridge:before{content: "\f03d"}.fa-videocassette:before{content: "\f03d"}.fa-videodisc:before{content: "\f109"}.fa-videoreel:before{content: "\f03d"}#dateVisColorSettings{background-color: #fff;fill: #eaeaea;outline-color: #e8cfac;stroke: #619144}.citation .pace-car th,.citation .pace-car td{border: 0;padding: 0}.citation th{text-align: right}#hierarchyTreeHolder{overflow-x: hidden;border-right: 1px solid #eee}#hierarchyTree .currentHierarchy > a,#hierarchyTree .currentRecord a{font-weight: bold;color: #000}.tagList .tag{display: inline-block;margin: 0 1px 1px;border-radius: 4px;padding: 3px 3px;font-size: 13px;line-height: 1.42857143;border-radius: 3px}.tagList .tag.selected{background-color: #619144}.tagList .tag.selected a{color: #fff}.tagList .tag.selected .badge{color: #222;background-color: #fff}.tagList .tag.selected .badge:hover{color: #a94442}.tagList .tag .badge .fa{width: 12px}.tagList button{border: 0}.tagList .tag-form{display: inline}.tagList.loggedin .tag:not(.selected) .badge:hover{background-color: #028302}.bulkActionButtons label{display: inline-block}.bulkActionButtons label input{margin-top: 2px}@media (max-width: 767px){.grid{min-height: 250px}}.result a.title{font-weight: bold}.result .left{text-align: center}.result .left img{max-width: 100%}@media (max-width: 767px){.result a{text-decoration: underline}.result .middle,.result .right{padding: 0}}@media (max-width: 530px){.result .checkbox{display: none !important}.result .left{width: 40%}.result .middle{width: 60%}.result .right{display: none}}.search-controls .alert{margin-bottom: 0}.searchtools a{padding: 0 .5em}.title-in-heading{font-size: inherit;font-style: italic}.narrow-toggle{text-align: center}.sidebar label:not(.list-group-item){margin-left: 20px}.sidebar .list-group:not(.filters) .title{cursor: pointer}.sidebar .list-group:not(.filters) .title.collapsed{border-radius: 3px}.sidebar .list-group:not(.filters) .title.collapsed:after{content: '\25BC'}.sidebar .list-group:not(.filters) .title:after{content: '\25B2';float: right}.sidebar .collapse .list-group-item,.sidebar .collapsing .list-group-item{border-top-left-radius: 0px;border-top-right-radius: 0px}.sidebar .collapse .list-group-item[id^=more],.sidebar .collapsing .list-group-item[id^=more]{border-bottom-left-radius: 3px;border-bottom-right-radius: 3px}.sidebar #side-collapse-publishDate .list-group-item{border-bottom-left-radius: 3px;border-bottom-right-radius: 3px}.list-group-item i.fa,.badge i.fa{cursor: inherit}.sidebar .facet a{text-decoration: none}.top-row .applied{font-weight: bold}.top-row .applied:hover{color: #a94442}.top-row .applied:hover .fa.fa-check:before{content: "\f00d"}.slider-container{padding: 4px 10px;text-align: center}.slider-container .slider.slider-horizontal{width: 100%}.slider-container .slider-track{background: #777;box-shadow: inset 0 1px 0 rgba(0,0,0,0.4)}.slider-container .slider-handle{background: #619144;background-image: none;border: 1px solid #619144;box-shadow: none;opacity: .9}.slider-container .slider-handle:hover,.slider-container .slider-handle:active,.slider-container .slider-handle:focus{opacity: 1;background: #FFF;border-color: #777}.slider-container .slider-handle:active,.slider-container .slider-handle:focus{border-color: #619144}.slider-container .slider-selection{background: #CCC;box-shadow: inset 0 -1px 0 rgba(0,0,0,0.3)}.slider-container input{display: none}.table{table-layout: fixed;word-wrap: break-word}.node{position: absolute;box-sizing: content-box;margin: -1px;overflow: hidden;font: 10px sans-serif;line-height: 12px;border: 1px solid #fff}.node div{margin-top: 0px}.toplevel{border: 2px solid #000}.node .label{position: absolute;bottom: 0;left: 0;min-height: 1px;padding: 2px 4px;font-size: 85%;background-color: rgba(0,0,0,0.5);border-radius: 0;text-shadow: none}.notalabel{color: #000}#viz-instructions{padding-top: 600px}#similar-items-carousel .carousel-indicators{bottom: 0px}#similar-items-carousel .carousel-indicators li{width: 8px;height: 8px;margin: 2px;background-color: rgba(255,255,255,0.3);border-color: #222}#similar-items-carousel .hover-overlay{position: relative;display: block;min-width: 150px;min-height: 200px;margin: auto;text-align: center}#similar-items-carousel .hover-overlay img{max-width: 100%;margin: 10px 0}#similar-items-carousel .hover-overlay .content{position: absolute;top: 0;left: 0;display: none;width: 100%;height: 100%;padding: .5em .5em 0;color: #fff;background-color: rgba(0,0,0,0.5)}#similar-items-carousel .hover-overlay:hover .content{display: block}#similar-items-carousel .item{padding: 0 4em}.facet .jstree-ocl:before{float: left;width: 10px;padding: 0;margin-left: -10px;font-family: 'FontAwesome';font-weight: normal;font-style: normal;text-decoration: inherit;cursor: pointer;speak: none}.facet .jstree-default .jstree-open > .jstree-ocl:before{content: "\f0d7"}.facet .jstree-default .jstree-closed > .jstree-ocl:before{content: "\f0da"}.facet .jstree-default .jstree-leaf > .jstree-ocl:before{content: " "}.jstree-facet li span.main{display: block;padding-left: 1px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.jstree-facet .jstree-container-ul{padding: 0}.jstree-facet .jstree-container-ul > li.active,.jstree-facet .jstree-container-ul > li.active a.jstree-anchor{background-color: #265680;color: #fff}li.jstree-facet,li.jstree-node{list-style: none}li.jstree-facet .badge{cursor: text}li.jstree-facet ul{padding-left: 20px}.hierarchy-tree .jstree-ocl:before{float: left;width: 10px;padding: 0;margin-left: -10px;font-family: 'FontAwesome';font-style: normal;font-weight: normal;cursor: pointer;text-decoration: inherit;speak: none}.hierarchy-tree .jstree-open > .jstree-ocl:before{content: "\f0d7"}.hierarchy-tree .jstree-closed > .jstree-ocl:before{content: "\f0da"}.hierarchy-tree .jstree-leaf > .jstree-ocl:before{content: " "}.hierarchy-tree .jstree-icon{width: 16px;color: #000}.hierarchy-tree .jstree-anchor{padding: 2px 5px;white-space: nowrap}.hierarchy-tree .jstree-container-ul,.hierarchy-tree .jstree-children{padding-left: 16px}.hierarchy-tree .jstree-initial-node{display: none}.hierarchy-tree .jstree-clicked{color: #fff;background-color: #619144}.hierarchy-tree .jstree-clicked .jstree-icon{color: #fff}.offcanvas-overlay,.offcanvas-toggle{display: none}@media screen and (max-width: 767px){body.offcanvas{overflow-x: hidden}body.offcanvas .sidebar{position: fixed;height: 100%;top: 0;width: 75%;padding-left: 0;padding-right: 0;overflow-y: auto}body.offcanvas .sidebar h4{padding-left: 5px}body.offcanvas .sidebar .checkbox{margin-left: 25px}body.offcanvas .sidebar .list-group,body.offcanvas .sidebar .list-group-item{border-left: 0;border-right: 0;border-radius: 0 !important}body.offcanvas.active{overflow-y: hidden}body.offcanvas.offcanvas-left{padding-left: 23px}body.offcanvas.offcanvas-left .main{background: #FFF}body.offcanvas.offcanvas-left.active{margin-left: 75%;margin-right: -75%}body.offcanvas.offcanvas-left.active .sidebar{left: 0}body.offcanvas.offcanvas-left.active .offcanvas-overlay{right: -75%}body.offcanvas.offcanvas-left.active .offcanvas-toggle{left: 75%}body.offcanvas.offcanvas-left .sidebar{left: -75%}body.offcanvas.offcanvas-left .offcanvas-overlay{right: -100%}body.offcanvas.offcanvas-left .offcanvas-toggle{border-radius: 0 2px 2px 0;left: 0}body.offcanvas.offcanvas-right{padding-right: 23px}body.offcanvas.offcanvas-right .main > .container{background: #FFF}body.offcanvas.offcanvas-right.active{margin-left: -75%;margin-right: 75%}body.offcanvas.offcanvas-right.active .sidebar{right: 0}body.offcanvas.offcanvas-right.active .offcanvas-overlay{left: -75%}body.offcanvas.offcanvas-right.active .offcanvas-toggle{right: 75%}body.offcanvas.offcanvas-right .sidebar{right: -75%}body.offcanvas.offcanvas-right .offcanvas-overlay{left: -100%}body.offcanvas.offcanvas-right .offcanvas-toggle{border-radius: 2px 0 0 2px;right: 0}body.offcanvas .offcanvas-overlay{display: block;position: fixed;top: 0;width: 100%;height: 100%;background-color: rgba(0,0,0,0.3);z-index: 3}body.offcanvas .offcanvas-toggle{display: block;position: fixed;top: 50%;width: calc(25px);padding: 20px 0;background: #619144;color: #EEE;text-align: center;z-index: 5}body.offcanvas .offcanvas-overlay,body.offcanvas .offcanvas-toggle,body.offcanvas .offcanvas-toggle *{cursor: pointer}body.offcanvas,body.offcanvas .sidebar,body.offcanvas .offcanvas-overlay,body.offcanvas .offcanvas-toggle{-webkit-transition: all .25s ease-out;-o-transition: all .25s ease-out;transition: all .25s ease-out}}.bp-icon,.fa-x,i.fa-archive,i.fa-asterisk,i.fa-atlas,i.fa-bell,i.fa-book,i.fa-bookbag-add,i.fa-bookbag-delete,i.fa-bookbag-empty,i.fa-bookmark,i.fa-braille,i.fa-cancel-all-holds,i.fa-cancel-all-storage-retrieval-requests,i.fa-cancel-holds,i.fa-cancel-storage-retrieval-requests,i.fa-cdrom,i.fa-chart,i.fa-chipcartridge,i.fa-collage,i.fa-close,i.fa-disccartridge,i.fa-drawing,i.fa-ebook,i.fa-edit,i.fa-electronic,i.fa-email,i.fa-envelope,i.fa-envelope-o,i.fa-exchange,i.fa-external-link,i.fa-filmstrip,i.fa-flag,i.fa-flashcard,i.fa-floppydisk,i.fa-globe,i.fa-grid,i.fa-heart,i.fa-home,i.fa-inbox,i.fa-journal,i.fa-kit,i.fa-leaf,.fa-sitemap,i.fa-list,i.fa-list-alt,i.fa-export,i.fa-lock,i.fa-manuscript,i.fa-map,i.fa-microfilm,i.fa-minus-circle,i.fa-minus-sign,i.fa-mobile,i.fa-motionpicture,i.fa-musicalscore,i.fa-musicrecording,i.fa-newspaper,i.fa-ok,i.fa-online,i.fa-painting,i.fa-photo,i.fa-photonegative,i.fa-physicalobject,i.fa-plus,i.fa-plus-circle,i.fa-print,i.fa-qrcode,i.fa-remove,i.fa-renew,i.fa-renew-all,i.fa-report,i.fa-rss,i.fa-save,i.fa-search,i.fa-sensorimage,i.fa-serial,i.fa-shopping-cart,i.fa-sign-in,i.fa-sign-out,i.fa-slide,i.fa-software,i.fa-soundcassette,i.fa-sounddisc,i.fa-soundrecording,i.fa-spinner,i.fa-star,i.fa-suitcase,i.fa-tapecartridge,i.fa-tapecassette,i.fa-tapereel,i.fa-transparency,i.fa-trash,i.fa-trash-o,i.fa-tree,i.fa-tree-muted,i.fa-unknown,i.fa-usd,i.fa-user,i.fa-video,i.fa-videocartridge,i.fa-videocassette,i.fa-videodisc,i.fa-videoreel,i.fa-visual,#cart-empty-label i.fa-close{background-position: center center;background-repeat: no-repeat;color: transparent;content: '';display: inline-block;height: 16px;margin: 0;padding: 0;text-shadow: none;vertical-align: text-bottom;width: 16px}.fa-x{background-image: url('../../../themes/bootprint3/images/icons/page_white.png')}i.fa-archive{background-image: url('../../../themes/bootprint3/images/icons/package.png')}i.fa-asterisk{background-image: url('../../../themes/bootprint3/images/icons/list.png')}i.fa-atlas{background-image: url('../../../themes/bootprint3/images/icons/map.png')}i.fa-bell{background-image: url('../../../themes/bootprint3/images/icons/bell.png')}i.fa-book{background-image: url('../../../themes/bootprint3/images/icons/book.png')}i.fa-bookbag-add{background-image: url('../../../themes/bootprint3/images/icons/bookbag_add.png')}i.fa-bookbag-delete{background-image: url('../../../themes/bootprint3/images/icons/bookbag_delete.png')}i.fa-bookbag-empty{background-image: url('../../../themes/bootprint3/images/icons/bookbag_empty.png')}i.fa-bookmark{background-image: url('../../../themes/bootprint3/images/icons/bookmark_add.png')}i.fa-braille{background-image: url('../../../themes/bootprint3/images/icons/page_red.png')}i.fa-cancel-all-holds{background-image: url('../../../themes/bootprint3/images/icons/holdCancelAll.png')}i.fa-cancel-all-storage-retrieval-requests{background-image: url('../../../themes/bootprint3/images/icons/holdCancelAll.png')}i.fa-cancel-holds{background-image: url('../../../themes/bootprint3/images/icons/holdCancel.png')}i.fa-cancel-storage-retrieval-requests{background-image: url('../../../themes/bootprint3/images/icons/holdCancel.png')}i.fa-cdrom{background-image: url('../../../themes/bootprint3/images/icons/cd.png')}i.fa-chart{background-image: url('../../../themes/bootprint3/images/icons/chart_bar.png')}i.fa-chipcartridge{background-image: url('../../../themes/bootprint3/images/icons/server.png')}i.fa-collage{background-image: url('../../../themes/bootprint3/images/icons/pictures.png')}i.fa-close{background-image: url('../../../themes/bootprint3/images/icons/cross.png')}i.fa-disccartridge{background-image: url('../../../themes/bootprint3/images/icons/cd.png')}i.fa-drawing{background-image: url('../../../themes/bootprint3/images/icons/photo.png')}i.fa-ebook{background-image: url('../../../themes/bootprint3/images/icons/book_addresses.png')}i.fa-edit{background-image: url('../../../themes/bootprint3/images/icons/edit.png')}i.fa-electronic{background-image: url('../../../themes/bootprint3/images/icons/mouse.png')}i.fa-email,i.fa-envelope,i.fa-envelope-o{background-image: url('../../../themes/bootprint3/images/icons/email.png')}i.fa-exchange{background-image: url('../../../themes/bootprint3/images/icons/arrow_refresh.png')}i.fa-external-link{background-image: url('../../../themes/bootprint3/images/icons/link_go.png')}i.fa-filmstrip{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-flag{background-image: url('../../../themes/bootprint3/images/icons/flag_red.png')}i.fa-flashcard{background-image: url('../../../themes/bootprint3/images/icons/table_lightening.png')}i.fa-floppydisk{background-image: url('../../../themes/bootprint3/images/icons/disk.png')}i.fa-globe{background-image: url('../../../themes/bootprint3/images/icons/world.png')}i.fa-grid{background-image: url('../../../themes/bootprint3/images/icons/view_grid.png')}i.fa-heart{background-image: url('../../../themes/bootprint3/images/icons/heart.png')}i.fa-home{background-image: url('../../../themes/bootprint3/images/icons/house.png')}i.fa-inbox{background-image: url('../../../themes/bootprint3/images/icons/box.png')}i.fa-journal{background-image: url('../../../themes/bootprint3/images/icons/book.png')}i.fa-kit{background-image: url('../../../themes/bootprint3/images/icons/briefcase.png')}i.fa-leaf,.fa-sitemap{background-image: url('../../../themes/bootprint3/images/icons/treeCurrent.png')}i.fa-list{background-image: url('../../../themes/bootprint3/images/icons/view_list.png')}i.fa-list-alt,i.fa-export{background-image: url('../../../themes/bootprint3/images/icons/application_add.png')}i.fa-lock{background-image: url('../../../themes/bootprint3/images/icons/lock.png')}i.fa-manuscript{background-image: url('../../../themes/bootprint3/images/icons/script.png')}i.fa-map{background-image: url('../../../themes/bootprint3/images/icons/map.png')}i.fa-microfilm{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-minus-circle,i.fa-minus-sign{background-image: url('../../../themes/bootprint3/images/icons/delete.png')}i.fa-mobile{background-image: url('../../../themes/bootprint3/images/icons/phone.png')}i.fa-motionpicture{background-image: url('../../../themes/bootprint3/images/icons/television.png')}i.fa-musicalscore{background-image: url('../../../themes/bootprint3/images/icons/music.png')}i.fa-musicrecording{background-image: url('../../../themes/bootprint3/images/icons/music.png')}i.fa-newspaper{background-image: url('../../../themes/bootprint3/images/icons/newspaper.png')}i.fa-ok{background-image: url('../../../themes/bootprint3/images/icons/tick.png')}i.fa-online{background-image: url('../../../themes/bootprint3/images/icons/computer.png')}i.fa-painting{background-image: url('../../../themes/bootprint3/images/icons/paintbrush.png')}i.fa-photo{background-image: url('../../../themes/bootprint3/images/icons/photo.png')}i.fa-photonegative{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-physicalobject{background-image: url('../../../themes/bootprint3/images/icons/box.png')}i.fa-plus{background-image: url('../../../themes/bootprint3/images/icons/add.png')}i.fa-plus-circle{background-image: url('../../../themes/bootprint3/images/icons/add.png')}i.fa-print{background-image: url('../../../themes/bootprint3/images/icons/printer.png')}i.fa-qrcode{background-image: url('../../../themes/bootprint3/images/icons/qrcode.png')}i.fa-remove{background-image: url('../../../themes/bootprint3/images/icons/delete.png')}i.fa-renew{background-image: url('../../../themes/bootprint3/images/icons/renew.png')}i.fa-renew-all{background-image: url('../../../themes/bootprint3/images/icons/renewAll.png')}i.fa-report{background-image: url('../../../themes/bootprint3/images/icons/report.png')}i.fa-rss{background-image: url('../../../themes/bootprint3/images/icons/feed.png')}i.fa-save{background-image: url('../../../themes/bootprint3/images/icons/disk.png')}i.fa-search{background-image: url('../../../themes/bootprint3/images/icons/magnifier.png')}i.fa-sensorimage{background-image: url('../../../themes/bootprint3/images/icons/photo.png')}i.fa-serial{background-image: url('../../../themes/bootprint3/images/icons/page_white_stack.png')}i.fa-shopping-cart{background-image: url('../../../themes/bootprint3/images/icons/cart.png')}i.fa-sign-in{background-image: url('../../../themes/bootprint3/images/icons/door_in.png')}i.fa-sign-out{background-image: url('../../../themes/bootprint3/images/icons/door_out.png')}i.fa-slide{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-software{background-image: url('../../../themes/bootprint3/images/icons/drive_cd.png')}i.fa-soundcassette{background-image: url('../../../themes/bootprint3/images/icons/sound.png')}i.fa-sounddisc{background-image: url('../../../themes/bootprint3/images/icons/cd.png')}i.fa-soundrecording{background-image: url('../../../themes/bootprint3/images/icons/sound.png')}i.fa-spinner{background-image: url('../../../themes/bootprint3/images/icons/ajax_loading.gif')}i.fa-star{background-image: url('../../../themes/bootprint3/images/icons/star.png')}i.fa-suitcase{background-image: url('../../../themes/bootprint3/images/icons/bookbag.png')}i.fa-tapecartridge{background-image: url('../../../themes/bootprint3/images/icons/drive.png')}i.fa-tapecassette{background-image: url('../../../themes/bootprint3/images/icons/drive.png')}i.fa-tapereel{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-transparency{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-trash,i.fa-trash-o{background-image: url('../../../themes/bootprint3/images/icons/bin.png')}i.fa-tree{background-image: url('../../../themes/bootprint3/images/icons/treeCurrent.png')}i.fa-tree-muted{background-image: url('../../../themes/bootprint3/images/icons/treeMuted.png')}i.fa-unknown{background-image: url('../../../themes/bootprint3/images/icons/page_white.png')}i.fa-usd{background-image: url('../../../themes/bootprint3/images/icons/money_dollar.png')}i.fa-user{background-image: url('../../../themes/bootprint3/images/icons/user.png')}i.fa-video{background-image: url('../../../themes/bootprint3/images/icons/television.png')}i.fa-videocartridge{background-image: url('../../../themes/bootprint3/images/icons/television.png')}i.fa-videocassette{background-image: url('../../../themes/bootprint3/images/icons/television.png')}i.fa-videodisc{background-image: url('../../../themes/bootprint3/images/icons/cd.png')}i.fa-videoreel{background-image: url('../../../themes/bootprint3/images/icons/film.png')}i.fa-visual{background-image: url('../../../themes/bootprint3/images/icons/view_visual.png')}body.rtl i.fa-external-link{background-image: url('../../../themes/bootprint3/images/icons/link_go_rtl.png')}body.rtl i.fa-flag{background-image: url('../../../themes/bootprint3/images/icons/flag_red_rtl.png')}#cart-empty-label i.fa-close{background-image: url('../../../themes/bootprint3/images/icons/briefcase.png')}body{background: #619144;font-size: 13px}body a,body .btn-link{color: #06C}body a:hover,body .btn-link:hover{color: #09F}@media (max-width: 767px){body{padding: 6px}body header{margin-top: 0}body .label{font-size: 85%}}@media (min-width: 768px){.badge{font-size: 85%;margin-top: 1px}.label{padding-top: .3em}.modal-dialog{width: 650px}}.btn{padding: 3px 5px 2px}.btn.btn-default{background: #eee;background-image: linear-gradient(#fff, #ddd);border: 1px solid #777;color: #222;text-shadow: 0 1px 0 #fff}.btn.btn-default:hover{border: 1px solid #333;color: #222;text-shadow: none}.btn-danger,.btn-danger:hover{border-color: #6e110e;font-weight: bold}.btn-info,.btn-info:hover{border-color: #103743;font-weight: bold}.btn-primary,.btn-primary:hover{border-color: #456730;font-weight: bold}.btn-success,.btn-success:hover{border-color: #014701;font-weight: bold}.btn-warning,.btn-warning:hover{border-color: #683d00;font-weight: bold}h2{margin: 0 8px 8px}input[type="radio"],input[type="checkbox"]{margin: 0 auto;margin-top: 2px;padding: 0 2px}.nav > li > a{padding: 5px 10px}.nav-pills{display: table;margin: 0 auto}.navbar{min-height: 1px}.navbar-form{margin-top: 5px;margin-bottom: 5px}.pagination{display: table;margin: 18px auto}.pagination > li > a,.pagination > li > span{padding: 4px 12px 3px 12px}.pagination > .active > a,.pagination > .active > span,.pagination > .active > a:hover,.pagination > .active > span:hover,.pagination > .active > a:focus,.pagination > .active > span:focus{background: #619144;border-color: #619144}.panel-heading{padding: 0}.panel-heading a{cursor: pointer;display: inline-block;padding: 6px;width: 100%}.row:not(.top-row){padding: 6px 4px;margin: 0 -4px}.row.result:nth-child(even){background: #eee}.row.result:last-child{margin-bottom: 1em}.row > p{padding: 0 1em}.search .row{padding: 2px 0}.sub-breadcrumb{padding: 0 5px}.tab-content{padding: 6px 8px;border: 1px solid #ddd;border-top: 0}.container{background: #FFF;padding: 0}header{margin-top: 18px}header .fa.fa-bars{font-size: 21px}header .navbar{border-radius: 5px 5px 0 0;padding: 0 10px}header .navbar .searchForm{display: none !important}header .navbar .navbar-brand{background-image: url('../../../themes/bootprint3/images/vufind_logo.png');background-position: center center;background-repeat: no-repeat;background-size: contain;color: transparent;height: 65px;margin-top: 5px;width: 170px}header .navbar .navbar-brand:hover,header .navbar .navbar-brand:active,header .navbar .navbar-brand:focus{color: transparent}header .navbar .navbar-brand.lang-ar{background-image: url('../../../themes/bootprint3/images/vufind_logo_ar.png')}header .navbar .navbar-nav > li > a{padding: 12px 6px}@media (max-width: 767px){header .navbar .navbar-nav > li > a{padding: 8px 24px}}header .navbar .navbar-right{margin-top: 12px}@media (max-width: 767px){header .navbar .navbar-right{margin: 0}}header .searchbox{background: linear-gradient(to bottom, #fff, #eee);display: block !important}header .searchbox .tab-content{border: 0}header .searchbox .tab-content .navbar-text{margin: 5px 10px 5px 0}@media (max-width: 767px){header #header-collapse .navbar-right li{text-align: right}header .searchForm_type{margin-top: 2px;margin-bottom: 2px}}header .breadcrumb{border: 1px solid #ccc;border-radius: 0;border-width: 1px 0;font-size: 12px;margin-bottom: 2px;padding: 7px 20px 5px}.searchForm_lookfor,.searchForm_type{border-color: #619144}[name=searchForm]{margin: 6px 8px 8px;padding: 0}[name=searchForm] .btn-primary,[name=searchForm] .form-control,.template-dir-eds.template-name-advanced [name=searchForm] .clear-btn,.template-dir-search.template-name-advanced [name=searchForm] .clear-btn{font-size: 14px;height: 32px;padding: 5px 8px}[name=searchForm] .btn-primary[multiple],[name=searchForm] .form-control[multiple],.template-dir-eds.template-name-advanced [name=searchForm] .clear-btn[multiple],.template-dir-search.template-name-advanced [name=searchForm] .clear-btn[multiple]{height: auto}@media (min-width: 768px){[name=searchForm] .search-query{width: 400px}}[name=searchForm] .nav-tabs{border-bottom: 0;padding: 0 6px}[name=searchForm] .nav-tabs li a{margin-bottom: -1px;border-bottom: 0;padding-bottom: 6px}[name=searchForm] .nav-tabs li a:hover{background: none;border-color: transparent;text-decoration: underline}[name=searchForm] .nav-tabs li.active a,[name=searchForm] .nav-tabs li.active a:hover{background: #FFF;border-color: #619144;border-bottom: 0;text-decoration: none;z-index: 5}.main .container{padding: 0 4px 18px}footer{margin-bottom: 36px}footer .container{border-radius: 0 0 5px 5px;border-top: 1px solid #ddd;padding-top: 18px}footer hr{display: none}footer p{margin: 0}footer ul{padding-left: 30px}body.offcanvas .sidebar .list-group{color: #000}body.offcanvas .sidebar .list-group{color: #000}body.offcanvas .offcanvas-toggle{padding-bottom: 18px;font-size: 16px;background: #fff;box-shadow: 0 0 2px #000;color: #619144}body.offcanvas.active .sidebar{color: #FFF}body.offcanvas.active .offcanvas-toggle{box-shadow: none}#dateVisColorSettings{background-color: #fff;fill: #eaeaea;outline-color: #e8cfac;stroke: #619144}#commentList .comment:nth-child(even){background: #eee}#hierarchyRecord{background: #FFF}.alert{padding: 8px}.bulkActionButtons{margin-bottom: 6px}.result > .col-xs-1.checkbox{width: auto}.result .label{display: inline-block;margin-bottom: 4px}.result .left{text-align: center}.result .savedLists{margin: 0 0 4px 0;padding: 4px 0 4px 6px}.result .savedLists ul{padding-left: 18px}@media (max-width: 767px){.result .search-controls .form-inline{text-align: left}}@media (min-width: 768px){.result > .col-xs-1.checkbox{padding: 0}.result > .col-xs-11{width: 95%;padding: 0}}.search-controls label{text-align: left}@media (max-width: 767px){.search-controls{margin: 4px -4px;padding: 4px 0}}.searchHomeContent{float: none;margin: 1em auto;width: 90%}#advSearchForm .search{margin: 0}.group .match{margin-top: .5em}.template-dir-eds.template-name-advanced .clear-btn,.template-dir-search.template-name-advanced .clear-btn{background-image: linear-gradient(#fff, #eee)}.sidebar .list-group{margin-bottom: 5px}.sidebar .list-group label.list-group-item{padding-left: 26px}.sidebar .list-group label.list-group-item input[type=checkbox]{margin-top: 2px}.sidebar .list-group-item{padding: 7px 10px 6px}.sidebar .list-group-item.active{background: #e70;border-color: #e70;color: #FFF}.sidebar .list-group-item.active:hover{background: #e70;border-color: #e70}.sidebar .list-group-item.active .badge{color: #e70}.sidebar .slider-container{margin: 4px auto 10px;width: 95%}.sidebar .slider-container .slider-handle{background: #619144;opacity: 1}.sidebar .list-group-item .badge a,.top-row .badge a{color: #FFF}.sidebar .list-group-item .badge a:hover,.top-row .badge a:hover{color: #a41915}#custom_recaptcha_widget{display: table}#custom_recaptcha_widget embed{display: none}#custom_recaptcha_widget #recaptcha_image{border: 1px solid #000;padding: 6px;margin: 1em 0}#custom_recaptcha_widget #recaptcha_response_field{margin: 0 .5em}#custom_recaptcha_widget > div > a{display: inline-block;float: left;margin: 5px 10px 5px 0}ul.random{list-style: none;padding: 0;margin: 0px;text-align: justified}ul.random li{padding-bottom: 10px}ul.random li img{margin: 0 auto 1em auto}ul.random.image,ul.random.mixed{text-align: center}ul.random.image li img{margin: 0 auto}.tt-dropdown-menu{margin: 2px}[id^=list].list-group .col-sm-9{margin: 0}.container > .row > .col-xs-12{padding: 0}.vudl.row{padding: 4px 0}
\ No newline at end of file
diff --git a/themes/bootstrap3/css/compiled.css b/themes/bootstrap3/css/compiled.css
index 89e455ba4e949b19de4bea18edd44810bdafb9d7..62b77cc9a5fe73e5d96983469d4586d9b019677d 100644
--- a/themes/bootstrap3/css/compiled.css
+++ b/themes/bootstrap3/css/compiled.css
@@ -1 +1 @@
-/*! normalize.css v3.0.2 | MIT License | git.io/normalize */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: .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{-moz-box-sizing: content-box;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;-moz-box-sizing: content-box;-webkit-box-sizing: content-box;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: .35em .625em .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}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 th,.table-bordered td{border: 1px solid #ddd !important}}@font-face{font-family: 'Glyphicons Halflings';src: url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.eot');src: url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../../themes/bootstrap3/css/less/fonts/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: "\2a"}.glyphicon-plus:before{content: "\2b"}.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"}*{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}*:before,*:after{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}html{font-size: 10px;-webkit-tap-highlight-color: rgba(0,0,0,0)}body{font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 14px;line-height: 1.42857143;color: #333;background-color: #fff}input,button,select,textarea{font-family: inherit;font-size: inherit;line-height: inherit}a{color: #12538b;text-decoration: none}a:hover,a:focus{color: #092b47;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,.thumbnail > img,.thumbnail a > img,.carousel-inner > .item > img,.carousel-inner > .item > a > img{display: block;max-width: 100%;height: auto}.img-rounded{border-radius: 6px}.img-thumbnail{padding: 4px;line-height: 1.42857143;background-color: #fff;border: 1px solid #ddd;border-radius: 4px;-webkit-transition: all .2s ease-in-out;-o-transition: all .2s ease-in-out;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: 0;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}[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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight: normal;line-height: 1;color: #777}h1,.h1,h2,.h2,h3,.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,.h4,h5,.h5,h6,.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}@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{text-transform: uppercase}.text-capitalize{text-transform: capitalize}.text-muted{color: #777}.text-primary{color: #265680}a.text-primary:hover{color: #1a3c59}.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: #265680}a.bg-primary:hover{background-color: #1a3c59}.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}.page-header{padding-bottom: 9px;margin: 40px 0 20px;border-bottom: 1px solid #eee}ul,ol{margin-top: 0;margin-bottom: 10px}ul ul,ol ul,ul ol,ol ol{margin-bottom: 0}.list-unstyled{padding-left: 0;list-style: none}.list-inline{padding-left: 0;list-style: none;margin: 0;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.42857143}dt{font-weight: bold}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}}abbr[title],abbr[data-original-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 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.42857143;color: #777}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 #eee;border-left: 0;text-align: right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content: ''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content: '\00A0 \2014'}address{margin-bottom: 20px;font-style: normal;line-height: 1.42857143}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.42857143;word-break: break-all;word-wrap: break-word;color: #333;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}@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}.row{margin-left: -15px;margin-right: -15px}.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-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-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float: left}.col-sm-12{width: 100%}.col-sm-11{width: 91.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-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float: left}.col-md-12{width: 100%}.col-md-11{width: 91.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-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float: left}.col-lg-12{width: 100%}.col-lg-11{width: 91.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%}}table{background-color: transparent}caption{padding-top: 8px;padding-bottom: 8px;color: #777;text-align: left}th{text-align: left}.table{width: 100%;max-width: 100%;margin-bottom: 20px}.table > thead > tr > th,.table > tbody > tr > th,.table > tfoot > tr > th,.table > thead > tr > td,.table > tbody > tr > td,.table > tfoot > tr > td{padding: 8px;line-height: 1.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 > th,.table > colgroup + thead > tr:first-child > th,.table > thead:first-child > tr:first-child > th,.table > caption + thead > tr:first-child > td,.table > colgroup + thead > tr:first-child > td,.table > thead:first-child > tr:first-child > td{border-top: 0}.table > tbody + tbody{border-top: 2px solid #ddd}.table .table{background-color: #fff}.table-condensed > thead > tr > th,.table-condensed > tbody > tr > th,.table-condensed > tfoot > tr > th,.table-condensed > thead > tr > td,.table-condensed > tbody > tr > td,.table-condensed > tfoot > tr > td{padding: 5px}.table-bordered{border: 1px solid #ddd}.table-bordered > thead > tr > th,.table-bordered > tbody > tr > th,.table-bordered > tfoot > tr > th,.table-bordered > thead > tr > td,.table-bordered > tbody > tr > td,.table-bordered > tfoot > tr > td{border: 1px solid #ddd}.table-bordered > thead > tr > th,.table-bordered > thead > tr > td{border-bottom-width: 2px}.table-striped > tbody > tr:nth-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 > tbody > tr > td.active,.table > tfoot > tr > td.active,.table > thead > tr > th.active,.table > tbody > tr > th.active,.table > tfoot > tr > th.active,.table > thead > tr.active > td,.table > tbody > tr.active > td,.table > tfoot > tr.active > td,.table > thead > tr.active > th,.table > tbody > tr.active > th,.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 > tbody > tr > td.success,.table > tfoot > tr > td.success,.table > thead > tr > th.success,.table > tbody > tr > th.success,.table > tfoot > tr > th.success,.table > thead > tr.success > td,.table > tbody > tr.success > td,.table > tfoot > tr.success > td,.table > thead > tr.success > th,.table > tbody > tr.success > th,.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 > tbody > tr > td.info,.table > tfoot > tr > td.info,.table > thead > tr > th.info,.table > tbody > tr > th.info,.table > tfoot > tr > th.info,.table > thead > tr.info > td,.table > tbody > tr.info > td,.table > tfoot > tr.info > td,.table > thead > tr.info > th,.table > tbody > tr.info > th,.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 > tbody > tr > td.warning,.table > tfoot > tr > td.warning,.table > thead > tr > th.warning,.table > tbody > tr > th.warning,.table > tfoot > tr > th.warning,.table > thead > tr.warning > td,.table > tbody > tr.warning > td,.table > tfoot > tr.warning > td,.table > thead > tr.warning > th,.table > tbody > tr.warning > th,.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 > tbody > tr > td.danger,.table > tfoot > tr > td.danger,.table > thead > tr > th.danger,.table > tbody > tr > th.danger,.table > tfoot > tr > th.danger,.table > thead > tr.danger > td,.table > tbody > tr.danger > td,.table > tfoot > tr.danger > td,.table > thead > tr.danger > th,.table > tbody > tr.danger > th,.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 > tbody > tr > th,.table-responsive > .table > tfoot > tr > th,.table-responsive > .table > thead > tr > td,.table-responsive > .table > tbody > tr > td,.table-responsive > .table > tfoot > tr > td{white-space: nowrap}.table-responsive > .table-bordered{border: 0}.table-responsive > .table-bordered > thead > tr > th:first-child,.table-responsive > .table-bordered > tbody > tr > th:first-child,.table-responsive > .table-bordered > tfoot > tr > th:first-child,.table-responsive > .table-bordered > thead > tr > td:first-child,.table-responsive > .table-bordered > tbody > tr > td:first-child,.table-responsive > .table-bordered > tfoot > tr > td:first-child{border-left: 0}.table-responsive > .table-bordered > thead > tr > th:last-child,.table-responsive > .table-bordered > tbody > tr > th:last-child,.table-responsive > .table-bordered > tfoot > tr > th:last-child,.table-responsive > .table-bordered > thead > tr > td:last-child,.table-responsive > .table-bordered > tbody > tr > td:last-child,.table-responsive > .table-bordered > tfoot > tr > td:last-child{border-right: 0}.table-responsive > .table-bordered > tbody > tr:last-child > th,.table-responsive > .table-bordered > tfoot > tr:last-child > th,.table-responsive > .table-bordered > tbody > tr:last-child > td,.table-responsive > .table-bordered > tfoot > tr:last-child > td{border-bottom: 0}}fieldset{padding: 0;margin: 0;border: 0;min-width: 0}legend{display: block;width: 100%;padding: 0;margin-bottom: 20px;font-size: 21px;line-height: inherit;color: #333;border: 0;border-bottom: 1px solid #e5e5e5}label{display: inline-block;max-width: 100%;margin-bottom: 5px;font-weight: bold}input[type="search"]{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}input[type="radio"],input[type="checkbox"]{margin: 4px 0 0;margin-top: 1px \9;line-height: normal}input[type="file"]{display: block}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.42857143;color: #555}.form-control{display: block;width: 100%;height: 34px;padding: 6px 12px;font-size: 14px;line-height: 1.42857143;color: #555;background-color: #fff;background-image: none;border: 1px solid #ccc;border-radius: 4px;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color: #66afe9;outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102,175,233,0.6);box-shadow: inset 0 1px 1px rgba(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[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color: #eee;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"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height: 34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.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"]{line-height: 30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.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"]{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="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor: not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor: not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio 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,.form-control-static.input-sm{padding-left: 0;padding-right: 0}.input-sm{height: 30px;padding: 5px 10px;font-size: 12px;line-height: 1.5;border-radius: 3px}select.input-sm{height: 30px;line-height: 30px}textarea.input-sm,select[multiple].input-sm{height: auto}.form-group-sm .form-control{height: 30px;padding: 5px 10px;font-size: 12px;line-height: 1.5;border-radius: 3px}select.form-group-sm .form-control{height: 30px;line-height: 30px}textarea.form-group-sm .form-control,select[multiple].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;min-height: 32px}.input-lg{height: 46px;padding: 10px 16px;font-size: 18px;line-height: 1.3333333;border-radius: 6px}select.input-lg{height: 46px;line-height: 46px}textarea.input-lg,select[multiple].input-lg{height: auto}.form-group-lg .form-control{height: 46px;padding: 10px 16px;font-size: 18px;line-height: 1.3333333;border-radius: 6px}select.form-group-lg .form-control{height: 46px;line-height: 46px}textarea.form-group-lg .form-control,select[multiple].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;min-height: 38px}.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{width: 46px;height: 46px;line-height: 46px}.input-sm + .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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color: #2b542c;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #67b168;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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color: #66512c;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #c0a16b;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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color: #843534;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483;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}@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: 14.333333px}}@media (min-width: 768px){.form-horizontal .form-group-sm .control-label{padding-top: 6px}}.btn{display: inline-block;margin-bottom: 0;font-weight: normal;text-align: center;vertical-align: middle;touch-action: manipulation;cursor: pointer;background-image: none;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:focus,.btn:active:focus,.btn.active:focus,.btn.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;-webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);box-shadow: inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor: not-allowed;pointer-events: none;opacity: .65;filter: alpha(opacity=65);-webkit-box-shadow: none;box-shadow: none}.btn-default{color: #333;background-color: #fff;border-color: #ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open > .dropdown-toggle.btn-default{color: #333;background-color: #e6e6e6;border-color: #adadad}.btn-default:active,.btn-default.active,.open > .dropdown-toggle.btn-default{background-image: none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color: #fff;border-color: #ccc}.btn-default .badge{color: #fff;background-color: #333}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color: #fff;background-color: #333;border-color: #adadad}.btn-primary{color: #fff;background-color: #265680;border-color: #fff}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary{color: #fff;background-color: #1a3c59;border-color: #e0e0e0}.btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary{background-image: none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color: #265680;border-color: #fff}.btn-primary .badge{color: #265680;background-color: #fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color: #265680;background-color: #fff;border-color: #e0e0e0}.btn-success{color: #fff;background-color: #028302;border-color: #fff}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open > .dropdown-toggle.btn-success{color: #fff;background-color: #015101;border-color: #e0e0e0}.btn-success:active,.btn-success.active,.open > .dropdown-toggle.btn-success{background-image: none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color: #028302;border-color: #fff}.btn-success .badge{color: #028302;background-color: #fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color: #028302;background-color: #fff;border-color: #e0e0e0}.btn-info{color: #fff;background-color: #1c5f74;border-color: #fff}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open > .dropdown-toggle.btn-info{color: #fff;background-color: #123d4b;border-color: #e0e0e0}.btn-info:active,.btn-info.active,.open > .dropdown-toggle.btn-info{background-image: none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color: #1c5f74;border-color: #fff}.btn-info .badge{color: #1c5f74;background-color: #fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color: #1c5f74;background-color: #fff;border-color: #e0e0e0}.btn-warning{color: #fff;background-color: #a56100;border-color: #fff}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open > .dropdown-toggle.btn-warning{color: #fff;background-color: #724300;border-color: #e0e0e0}.btn-warning:active,.btn-warning.active,.open > .dropdown-toggle.btn-warning{background-image: none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color: #a56100;border-color: #fff}.btn-warning .badge{color: #a56100;background-color: #fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color: #a56100;background-color: #fff;border-color: #e0e0e0}.btn-danger{color: #fff;background-color: #a41915;border-color: #fff}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger{color: #fff;background-color: #77120f;border-color: #e0e0e0}.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger{background-image: none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color: #a41915;border-color: #fff}.btn-danger .badge{color: #a41915;background-color: #fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color: #a41915;background-color: #fff;border-color: #e0e0e0}.btn-link{color: #12538b;font-weight: normal;border-radius: 0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color: transparent;-webkit-box-shadow: none;box-shadow: none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color: transparent}.btn-link:hover,.btn-link:focus{color: #092b47;text-decoration: underline;background-color: transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color: #777;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;-webkit-transition: opacity .15s linear;-o-transition: opacity .15s linear;transition: opacity .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;-webkit-transition-property: height, visibility;transition-property: height, visibility;-webkit-transition-duration: .35s;transition-duration: .35s;-webkit-transition-timing-function: ease;transition-timing-function: ease}.caret{display: inline-block;width: 0;height: 0;margin-left: 2px;vertical-align: middle;border-top: 4px dashed;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;-webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175);box-shadow: 0 6px 12px rgba(0,0,0,0.175);background-clip: padding-box}.dropdown-menu.pull-right{right: 0;left: auto}.dropdown-menu .divider{height: 1px;margin: 9px 0;overflow: hidden;background-color: #e5e5e5}.dropdown-menu > li > a{display: block;padding: 3px 20px;clear: both;font-weight: normal;line-height: 1.42857143;color: #333;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: #265680}.dropdown-menu > .disabled > a,.dropdown-menu > .disabled > a:hover,.dropdown-menu > .disabled > a:focus{color: #777}.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.42857143;color: #777;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 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 > .btn,.btn-group-vertical > .btn{position: relative;float: left}.btn-group > .btn:hover,.btn-group-vertical > .btn:hover,.btn-group > .btn:focus,.btn-group-vertical > .btn:focus,.btn-group > .btn:active,.btn-group-vertical > .btn:active,.btn-group > .btn.active,.btn-group-vertical > .btn.active{z-index: 2}.btn-group .btn + .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-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{padding-left: 12px;padding-right: 12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);box-shadow: inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow: none;box-shadow: none}.btn .caret{margin-left: 0}.btn-lg .caret{border-width: 5px 5px 0;border-bottom-width: 0}.dropup .btn-lg .caret{border-width: 0 5px 5px}.btn-group-vertical > .btn,.btn-group-vertical > .btn-group,.btn-group-vertical > .btn-group > .btn{display: block;float: none;width: 100%;max-width: 100%}.btn-group-vertical > .btn-group > .btn{float: none}.btn-group-vertical > .btn + .btn,.btn-group-vertical > .btn + .btn-group,.btn-group-vertical > .btn-group + .btn,.btn-group-vertical > .btn-group + .btn-group{margin-top: -1px;margin-left: 0}.btn-group-vertical > .btn:not(:first-child):not(:last-child){border-radius: 0}.btn-group-vertical > .btn:first-child:not(:last-child){border-top-right-radius: 4px;border-bottom-right-radius: 0;border-bottom-left-radius: 0}.btn-group-vertical > .btn:last-child:not(:first-child){border-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="radio"],[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],[data-toggle="buttons"] > .btn input[type="checkbox"],[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-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}textarea.input-group-lg > .form-control,textarea.input-group-lg > .input-group-addon,textarea.input-group-lg > .input-group-btn > .btn,select[multiple].input-group-lg > .form-control,select[multiple].input-group-lg > .input-group-addon,select[multiple].input-group-lg > .input-group-btn > .btn{height: auto}.input-group-sm > .form-control,.input-group-sm > .input-group-addon,.input-group-sm > .input-group-btn > .btn{height: 30px;padding: 5px 10px;font-size: 12px;line-height: 1.5;border-radius: 3px}select.input-group-sm > .form-control,select.input-group-sm > .input-group-addon,select.input-group-sm > .input-group-btn > .btn{height: 30px;line-height: 30px}textarea.input-group-sm > .form-control,textarea.input-group-sm > .input-group-addon,textarea.input-group-sm > .input-group-btn > .btn,select[multiple].input-group-sm > .form-control,select[multiple].input-group-sm > .input-group-addon,select[multiple].input-group-sm > .input-group-btn > .btn{height: auto}.input-group-addon,.input-group-btn,.input-group .form-control{display: table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius: 0}.input-group-addon,.input-group-btn{width: 1%;white-space: nowrap;vertical-align: middle}.input-group-addon{padding: 6px 12px;font-size: 14px;font-weight: normal;line-height: 1;color: #555;text-align: center;background-color: #eee;border: 1px solid #ccc;border-radius: 4px}.input-group-addon.input-sm{padding: 5px 10px;font-size: 12px;border-radius: 3px}.input-group-addon.input-lg{padding: 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{margin-left: -1px}.nav{margin-bottom: 0;padding-left: 0;list-style: none}.nav > li{position: relative;display: block}.nav > li > a{position: relative;display: block;padding: 10px 15px}.nav > li > a:hover,.nav > li > a:focus{text-decoration: none;background-color: #eee}.nav > li.disabled > a{color: #777}.nav > li.disabled > a:hover,.nav > li.disabled > a:focus{color: #777;text-decoration: none;background-color: transparent;cursor: not-allowed}.nav .open > a,.nav .open > a:hover,.nav .open > a:focus{background-color: #eee;border-color: #12538b}.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:hover,.nav-tabs > li.active > a:focus{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}.nav-tabs.nav-justified > .dropdown .dropdown-menu{top: auto;left: auto}@media (min-width: 768px){.nav-tabs.nav-justified > li{display: table-cell;width: 1%}.nav-tabs.nav-justified > li > a{margin-bottom: 0}}.nav-tabs.nav-justified > li > a{margin-right: 0;border-radius: 4px}.nav-tabs.nav-justified > .active > a,.nav-tabs.nav-justified > .active > a:hover,.nav-tabs.nav-justified > .active > a:focus{border: 1px solid #ddd}@media (min-width: 768px){.nav-tabs.nav-justified > li > a{border-bottom: 1px solid #ddd;border-radius: 4px 4px 0 0}.nav-tabs.nav-justified > .active > a,.nav-tabs.nav-justified > .active > a:hover,.nav-tabs.nav-justified > .active > a:focus{border-bottom-color: #fff}}.nav-pills > li{float: left}.nav-pills > li > a{border-radius: 4px}.nav-pills > li + li{margin-left: 2px}.nav-pills > li.active > a,.nav-pills > li.active > a:hover,.nav-pills > li.active > a:focus{color: #fff;background-color: #265680}.nav-stacked > li{float: none}.nav-stacked > li + li{margin-top: 2px;margin-left: 0}.nav-justified{width: 100%}.nav-justified > li{float: none}.nav-justified > li > a{text-align: center;margin-bottom: 5px}.nav-justified > .dropdown .dropdown-menu{top: auto;left: auto}@media (min-width: 768px){.nav-justified > li{display: table-cell;width: 1%}.nav-justified > li > a{margin-bottom: 0}}.nav-tabs-justified{border-bottom: 0}.nav-tabs-justified > li > a{margin-right: 0;border-radius: 4px}.nav-tabs-justified > .active > a,.nav-tabs-justified > .active > a:hover,.nav-tabs-justified > .active > a:focus{border: 1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified > li > a{border-bottom: 1px solid #ddd;border-radius: 4px 4px 0 0}.nav-tabs-justified > .active > a,.nav-tabs-justified > .active > a:hover,.nav-tabs-justified > .active > a:focus{border-bottom-color: #fff}}.tab-content > .tab-pane{display: none}.tab-content > .active{display: block}.nav-tabs .dropdown-menu{margin-top: -1px;border-top-right-radius: 0;border-top-left-radius: 0}.navbar{position: relative;min-height: 50px;margin-bottom: 20px;border: 1px solid transparent}@media (min-width: 768px){.navbar{border-radius: 4px}}@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.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-fluid > .navbar-header,.container > .navbar-collapse,.container-fluid > .navbar-collapse{margin-right: -15px;margin-left: -15px}@media (min-width: 768px){.container > .navbar-header,.container-fluid > .navbar-header,.container > .navbar-collapse,.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;-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.1);box-shadow: inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.1);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;-webkit-box-shadow: none;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{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}}@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: #132531;border-color: #0a1319}.navbar-default .navbar-brand{color: #fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color: #068139;background-color: transparent}.navbar-default .navbar-text{color: #fff}.navbar-default .navbar-nav > li > a{color: #fff}.navbar-default .navbar-nav > li > a:hover,.navbar-default .navbar-nav > li > a:focus{color: #132531;background-color: #fff}.navbar-default .navbar-nav > .active > a,.navbar-default .navbar-nav > .active > a:hover,.navbar-default .navbar-nav > .active > a:focus{color: #132531;background-color: #fff}.navbar-default .navbar-nav > .disabled > a,.navbar-default .navbar-nav > .disabled > a:hover,.navbar-default .navbar-nav > .disabled > a:focus{color: #fff;background-color: #068139}.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: #0a1319}.navbar-default .navbar-nav > .open > a,.navbar-default .navbar-nav > .open > a:hover,.navbar-default .navbar-nav > .open > a:focus{background-color: #fff;color: #132531}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu > li > a{color: #fff}.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus{color: #132531;background-color: #fff}.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: #132531;background-color: #fff}.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: #fff;background-color: #068139}}.navbar-default .navbar-link{color: #fff}.navbar-default .navbar-link:hover{color: #132531}.navbar-default .btn-link{color: #fff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color: #132531}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color: #fff}.navbar-inverse{background-color: #222;border-color: #080808}.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: #080808}.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: #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: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: #080808}.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,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,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: "/\00a0";padding: 0 5px;color: #ccc}.breadcrumb > .active{color: #777}.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.42857143;text-decoration: none;color: #12538b;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 > span:hover,.pagination > li > a:focus,.pagination > li > span:focus{color: #092b47;background-color: #eee;border-color: #ddd}.pagination > .active > a,.pagination > .active > span,.pagination > .active > a:hover,.pagination > .active > span:hover,.pagination > .active > a:focus,.pagination > .active > span:focus{z-index: 2;color: #fff;background-color: #265680;border-color: #265680;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: #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{display: inline}.pager li > a,.pager li > span{display: inline-block;padding: 5px 14px;background-color: #fff;border: 1px solid #ddd;border-radius: 15px}.pager li > a:hover,.pager li > a:focus{text-decoration: none;background-color: #eee}.pager .next > a,.pager .next > span{float: right}.pager .previous > a,.pager .previous > span{float: left}.pager .disabled > a,.pager .disabled > a:hover,.pager .disabled > a:focus,.pager .disabled > span{color: #777;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}a.label:hover,a.label:focus{color: #fff;text-decoration: none;cursor: pointer}.label:empty{display: none}.btn .label{position: relative;top: -1px}.label-default{background-color: #777}.label-default[href]:hover,.label-default[href]:focus{background-color: #5e5e5e}.label-primary{background-color: #265680}.label-primary[href]:hover,.label-primary[href]:focus{background-color: #1a3c59}.label-success{background-color: #028302}.label-success[href]:hover,.label-success[href]:focus{background-color: #015101}.label-info{background-color: #1c5f74}.label-info[href]:hover,.label-info[href]:focus{background-color: #123d4b}.label-warning{background-color: #a56100}.label-warning[href]:hover,.label-warning[href]:focus{background-color: #724300}.label-danger{background-color: #a41915}.label-danger[href]:hover,.label-danger[href]:focus{background-color: #77120f}.badge{display: inline-block;min-width: 10px;padding: 3px 7px;font-size: 12px;font-weight: bold;color: #fff;line-height: 1;vertical-align: baseline;white-space: nowrap;text-align: center;background-color: #777;border-radius: 10px}.badge:empty{display: none}.btn .badge{position: relative;top: -1px}.btn-xs .badge,.btn-group-xs > .btn .badge{top: 0;padding: 1px 5px}a.badge:hover,a.badge:focus{color: #fff;text-decoration: none;cursor: pointer}.list-group-item.active > .badge,.nav-pills > .active > a > .badge{color: #12538b;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}.jumbotron{padding: 30px 15px;margin-bottom: 30px;color: inherit;background-color: #eee}.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}.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{display: block;padding: 4px;margin-bottom: 20px;line-height: 1.42857143;background-color: #fff;border: 1px solid #ddd;border-radius: 4px;-webkit-transition: border .2s ease-in-out;-o-transition: border .2s ease-in-out;transition: border .2s ease-in-out}.thumbnail > img,.thumbnail a > img{margin-left: auto;margin-right: auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color: #12538b}.thumbnail .caption{padding: 9px;color: #333}.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;-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);box-shadow: inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float: left;width: 0%;height: 100%;font-size: 12px;line-height: 20px;color: #fff;text-align: center;background-color: #265680;-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition: width .6s ease;-o-transition: width .6s ease;transition: width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{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);background-size: 40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation: progress-bar-stripes 2s linear infinite;-o-animation: progress-bar-stripes 2s linear infinite;animation: progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color: #028302}.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-info{background-color: #1c5f74}.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-warning{background-color: #a56100}.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-danger{background-color: #a41915}.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)}.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-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,.tt-dropdown-menu{margin-bottom: 20px;padding-left: 0}.list-group-item,.tt-suggestion{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:hover,a.list-group-item:focus{text-decoration: none;color: #555;background-color: #f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color: #eee;color: #777;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: #777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index: 2;color: #fff;background-color: #265680;border-color: #265680}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading > small,.list-group-item.active:hover .list-group-item-heading > small,.list-group-item.active:focus .list-group-item-heading > small,.list-group-item.active .list-group-item-heading > .small,.list-group-item.active:hover .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: #93bcdf}.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:hover,a.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{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:hover,a.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{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:hover,a.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{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:hover,a.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{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;-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05);box-shadow: 0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding: 15px}.panel-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-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-responsive:first-child > .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 > 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-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,.panel > .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 td:first-child,.panel > .table:first-child > thead:first-child > tr:first-child th: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 th: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-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,.panel > .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 td:last-child,.panel > .table:first-child > thead:first-child > tr:first-child th: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 th: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-responsive:last-child > .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 > 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-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,.panel > .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 td:first-child,.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,.panel > .table:last-child > tfoot:last-child > tr:last-child th: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-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,.panel > .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 td:last-child,.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,.panel > .table:last-child > tfoot:last-child > tr:last-child th: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-responsive > .table-bordered > thead > tr > th:first-child,.panel > .table-bordered > tbody > tr > th:first-child,.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,.panel > .table-bordered > tfoot > tr > th:first-child,.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,.panel > .table-bordered > thead > tr > td:first-child,.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,.panel > .table-bordered > tbody > tr > td:first-child,.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,.panel > .table-bordered > tfoot > tr > td:first-child,.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child{border-left: 0}.panel > .table-bordered > thead > tr > th:last-child,.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,.panel > .table-bordered > tbody > tr > th:last-child,.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,.panel > .table-bordered > tfoot > tr > th:last-child,.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,.panel > .table-bordered > thead > tr > td:last-child,.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,.panel > .table-bordered > tbody > tr > td:last-child,.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,.panel > .table-bordered > tfoot > tr > td:last-child,.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child{border-right: 0}.panel > .table-bordered > thead > tr:first-child > td,.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,.panel > .table-bordered > tbody > tr:first-child > td,.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,.panel > .table-bordered > thead > tr:first-child > th,.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,.panel > .table-bordered > tbody > tr:first-child > th,.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th{border-bottom: 0}.panel > .table-bordered > tbody > tr:last-child > td,.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,.panel > .table-bordered > tfoot > tr:last-child > td,.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,.panel > .table-bordered > tbody > tr:last-child > th,.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,.panel > .table-bordered > tfoot > tr:last-child > th,.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th{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: #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: #265680}.panel-primary > .panel-heading{color: #fff;background-color: #265680;border-color: #265680}.panel-primary > .panel-heading + .panel-collapse > .panel-body{border-top-color: #265680}.panel-primary > .panel-heading .badge{color: #265680;background-color: #fff}.panel-primary > .panel-footer + .panel-collapse > .panel-body{border-bottom-color: #265680}.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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);box-shadow: inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color: #ddd;border-color: rgba(0,0,0,0.15)}.well-lg{padding: 24px;border-radius: 6px}.well-sm{padding: 9px;border-radius: 3px}.close,.group .group-close{float: right;font-size: 21px;font-weight: bold;line-height: 1;color: #000;text-shadow: 0 1px 0 #fff;opacity: .2;filter: alpha(opacity=20)}.close:hover,.close:focus{color: #000;text-decoration: none;cursor: pointer;opacity: .5;filter: alpha(opacity=50)}button.close{padding: 0;cursor: pointer;background: transparent;border: 0;-webkit-appearance: none}.modal-open{overflow: hidden}.modal{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%);-ms-transform: translate(0, -25%);-o-transform: translate(0, -25%);transform: translate(0, -25%);-webkit-transition: -webkit-transform 0.3s ease-out;-moz-transition: -moz-transform 0.3s ease-out;-o-transition: -o-transform 0.3s ease-out;transition: transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform: translate(0, 0);-ms-transform: translate(0, 0);-o-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;-webkit-box-shadow: 0 3px 9px rgba(0,0,0,0.5);box-shadow: 0 3px 9px rgba(0,0,0,0.5);background-clip: padding-box;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: .5;filter: alpha(opacity=50)}.modal-header{padding: 15px;border-bottom: 1px solid #e5e5e5;min-height: 16.42857143px}.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{-webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.5);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: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 12px;font-weight: normal;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{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: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 14px;font-weight: normal;line-height: 1.42857143;text-align: left;background-color: #fff;background-clip: padding-box;border: 1px solid #ccc;border: 1px solid rgba(0,0,0,0.2);border-radius: 6px;-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);box-shadow: 0 5px 10px rgba(0,0,0,0.2);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}.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,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: #999;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: #999;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: #999;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;-webkit-transition: .6s ease-in-out left;-o-transition: .6s ease-in-out left;transition: .6s ease-in-out left}.carousel-inner > .item > img,.carousel-inner > .item > a > img{line-height: 1}@media all and (transform-3d), (-webkit-transform-3d){.carousel-inner > .item{-webkit-transition: -webkit-transform 0.6s ease-in-out;-moz-transition: -moz-transform 0.6s ease-in-out;-o-transition: -o-transform 0.6s ease-in-out;transition: transform 0.6s ease-in-out;-webkit-backface-visibility: hidden;-moz-backface-visibility: hidden;backface-visibility: hidden;-webkit-perspective: 1000;-moz-perspective: 1000;perspective: 1000}.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: .5;filter: alpha(opacity=50);font-size: 20px;color: #fff;text-align: center;text-shadow: 0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image: -o-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image: linear-gradient(to right, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left: auto;right: 0;background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image: -o-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image: linear-gradient(to right, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline: 0;color: #fff;text-decoration: none;opacity: .9;filter: alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position: absolute;top: 50%;z-index: 5;display: inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left: 50%;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;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;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: -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}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical > .btn-group:before,.btn-group-vertical > .btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content: " ";display: table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical > .btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer: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,.visible-sm,.visible-md,.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}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}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}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}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}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}}.sr-only{clip: rect(1px, 1px, 1px, 1px);position: absolute;width: auto;height: auto;margin: 0;padding: 0;overflow: hidden;border: 0}.sr-only:focus{background-color: #fff;border-radius: 4px;clip: auto;color: #132531;display: block;font-size: 14px;height: 50px;line-height: 20px;padding: 15px 15px;position: absolute;left: 5px;top: 5px;text-decoration: none;text-transform: none;width: auto;z-index: 100000}.navbar-brand{font-size: 20px}.alert.alert-info a{text-decoration: underline}.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover{color: #000}[data-toggle~="dropdown"]{cursor: pointer}.fa{cursor: default}@media (min-width: 768px){.form-control{max-width: 400px}}.has-error{margin-bottom: 0}.sms-error{margin-bottom: 0}.sms-error .help-block,.sms-error .control-label,.sms-error .radio,.sms-error .checkbox,.sms-error .radio-inline,.sms-error .checkbox-inline,.sms-error.radio label,.sms-error.checkbox label,.sms-error.radio-inline label,.sms-error.checkbox-inline label{color: #a94442}.sms-error .form-control{border-color: #a94442;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.sms-error .form-control:focus{border-color: #843534;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483;box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483}.sms-error .input-group-addon{color: #a94442;border-color: #a94442;background-color: #f2dede}.sms-error .form-control-feedback{color: #a94442}.help-block.with-errors{padding-top: 6px;padding-bottom: 6px}.help-block.with-errors:empty{padding: 0}.help-block.with-errors,.list-unstyled{margin: 0}.highlight,mark{background: #ff6;padding: .1em .2em}.icon-bar{background-color: #888}img{max-width: 100%}label.list-group-item{margin-top: 0;padding-left: 35px;font-weight: normal;border-radius: 0}.list-group-item.title{font-weight: bold}#modal{background-color: rgba(0,0,0,0.2)}#modal .modal-body > h2:first-child{display: none}.popover{width: 250px}@media (min-width: 768px){h2{font-size: 23px;font-weight: normal}}@media (max-width: 767px){h2{font-size: 20px}}@media (min-width: 768px){h3{font-size: 20px;font-weight: normal}}@media (max-width: 767px){h3{font-size: 16px}}.recordcover{max-height: 300px}.sub-breadcrumb{padding: 5px 10px;white-space: nowrap}.sub-breadcrumb li{display: inline-block}.sub-breadcrumb li + li:before{padding-left: 5px;padding-right: 5px;color: #ccc;content: "/\00a0"}.tab-content{padding: 4px}@media (max-width: 991px){header .container.navbar{margin-bottom: 0}.searchForm{margin-top: 0}}@media (max-width: 767px){.searchForm{padding-top: 0}}.group{position: relative;background: #eee;border-radius: 4px;border: 1px solid #c8c8c8;margin-top: 0;margin-bottom: .5em !important}.group .add_search_link{display: inline-block;margin-top: 4px}.group .group-close{position: absolute;top: .3em;right: .5em;opacity: .4;z-index: 2}.group .search{margin-bottom: 2px}.group .search .close{opacity: .8}@media (min-width: 768px){.group{padding: 10px 10px 10px 25px}.group [class^=col-]{padding-left: 0}}@media (max-width: 767px){.group .search .middle{float: left;width: 90%}.group .group-close{top: .5em;right: 1em;opacity: .6}}@media (max-width: 991px){.group .form-control{max-width: none}}#groupPlaceHolder{display: block;padding: 6px}.template-dir-eds.template-name-advanced legend{margin-bottom: 0}.template-dir-eds.template-name-advanced .no-js .group:nth-child(n+3){display: none}.template-dir-eds.template-name-advanced .search .close a{margin-left: -2em}.alphabrowse{border-collapse: separate}.alphabrowse .lcc{width: 20%}.alphabrowse .titles{width: 10%;text-align: center}.alphabrowse tr.browse-match td{border-top: .2em solid #265680;border-bottom: .2em solid #265680}.alphabrowse tr.browse-match td:first-child{border-left: .2em solid #265680}.alphabrowse tr.browse-match td:last-child{border-right: .2em solid #265680}.twitter-typeahead{vertical-align: top;background-color: #fff;border-radius: 4px}@media (max-width: 767px){.twitter-typeahead{width: 100%}}.twitter-typeahead .tt-hint{display: none}.tt-suggestion{cursor: pointer;text-overflow: ellipsis;white-space: nowrap}.tt-suggestion.active{white-space: inherit}.tt-suggestion.tt-cursor{background-color: #265680;color: #fff}.tt-suggestion p{margin: 0}.badge a{color: #fff}.browse.list-group .list-group-item{word-wrap: break-word}.browse.list-group .list-group-item.view-record{padding: 2px 4px;font-size: 85%;text-align: right;border-top: 0}.cart-controls .checkbox{line-height: 2.5em;padding-right: 1em}#modal .cart-controls .btn{margin-bottom: 4px}#modal .cart-controls .checkbox{padding-bottom: 1em}#modal .cart-controls ~ hr{margin-top: 0}.fa-grid:before{content: "\f00a"}.fa-visual:before{content: "\f008"}.fa-x:before{content: "\f0f6"}.fa-atlas:before{content: "\f14e"}.fa-book:before{content: "\f02d"}.fa-braille:before{content: "\f0a6"}.fa-cdrom:before{content: "\f109"}.fa-chart:before{content: "\f012"}.fa-chipcartridge:before{content: "\f109"}.fa-collage:before{content: "\f03e"}.fa-disccartridge:before{content: "\f109"}.fa-drawing:before{content: "\f03e"}.fa-ebook:before{content: "\f0f6"}.fa-electronic:before{content: "\f1c6"}.fa-filmstrip:before{content: "\f008"}.fa-flashcard:before{content: "\f0e7"}.fa-floppydisk:before{content: "\f0c7"}.fa-globe:before{content: "\f0ac"}.fa-journal:before{content: "\f0f6"}.fa-kit:before{content: "\f0b1"}.fa-manuscript:before{content: "\f0f6"}.fa-map:before{content: "\f14e"}.fa-microfilm:before{content: "\f008"}.fa-motionpicture:before{content: "\f03d"}.fa-musicalscore:before{content: "\f001"}.fa-musicrecording:before{content: "\f001"}.fa-newspaper:before{content: "\f0f6"}.fa-online:before{content: "\f109"}.fa-painting:before{content: "\f03e"}.fa-photo:before{content: "\f03e"}.fa-photonegative:before{content: "\f03e"}.fa-physicalobject:before{content: "\f187"}.fa-print:before{content: "\f03e"}.fa-sensorimage:before{content: "\f03e"}.fa-serial:before{content: "\f0f6"}.fa-slide:before{content: "\f008"}.fa-software:before{content: "\f109"}.fa-soundcassette:before{content: "\f025"}.fa-sounddisc:before{content: "\f109"}.fa-soundrecording:before{content: "\f025"}.fa-tapecartridge:before{content: "\f109"}.fa-tapecassette:before{content: "\f025"}.fa-tapereel:before{content: "\f008"}.fa-transparency:before{content: "\f008"}.fa-unknown:before{content: "\f128"}.fa-video:before{content: "\f03d"}.fa-videocartridge:before{content: "\f03d"}.fa-videocassette:before{content: "\f03d"}.fa-videodisc:before{content: "\f109"}.fa-videoreel:before{content: "\f03d"}#dateVisColorSettings{background-color: #fff;fill: #eaeaea;outline-color: #e8cfac;stroke: #265680}.citation .pace-car th,.citation .pace-car td{border: 0;padding: 0}.citation th{text-align: right}#hierarchyTreeHolder{overflow-x: hidden;border-right: 1px solid #eee}#hierarchyTree .currentHierarchy > a,#hierarchyTree .currentRecord a{font-weight: bold;color: #000}#tagList .tag{display: inline-block;margin: 0 1px 1px;padding: 6px 6px;font-size: 14px;line-height: 1.42857143;border-radius: 4px}#tagList .tag.selected{background-color: #265680}#tagList .tag.selected a{color: #fff}#tagList .tag.selected .badge{color: #222;background-color: #fff}#tagList .tag.selected .badge:hover{color: #a94442}#tagList .tag .badge .fa{width: 12px}#tagList .tag-form{display: inline}#tagList .tag-form button{border: 0}#tagList.loggedin .tag:not(.selected) .badge:hover{background-color: #028302}.bulkActionButtons label{display: inline-block}.bulkActionButtons label input{margin-top: 2px}@media (max-width: 767px){.grid{min-height: 250px}}.result a.title{font-weight: bold}.result .left{text-align: center}.result .left img{max-width: 100%}@media (max-width: 767px){.result a{text-decoration: underline}.result .middle,.result .right{padding: 0}}@media (max-width: 530px){.result .checkbox{display: none !important}.result .left{width: 40%}.result .middle{width: 60%}.result .right{display: none}}.search-controls .alert{margin-bottom: 0}.searchtools a{padding: 0 .5em}.title-in-heading{font-size: inherit;font-style: italic}.narrow-toggle{text-align: center}.sidebar label:not(.list-group-item){margin-left: 20px}.sidebar .list-group:not(.filters) .title{cursor: pointer}.sidebar .list-group:not(.filters) .title.collapsed{border-radius: 4px}.sidebar .list-group:not(.filters) .title.collapsed:after{content: '\25BC'}.sidebar .list-group:not(.filters) .title:after{content: '\25B2';float: right}.sidebar .collapse .list-group-item,.sidebar .collapsing .list-group-item{border-top-left-radius: 0px;border-top-right-radius: 0px}.sidebar .collapse .list-group-item[id^=more],.sidebar .collapsing .list-group-item[id^=more]{border-bottom-left-radius: 4px;border-bottom-right-radius: 4px}.sidebar #side-collapse-publishDate .list-group-item{border-bottom-left-radius: 4px;border-bottom-right-radius: 4px}.list-group-item i.fa,.badge i.fa{cursor: inherit}.sidebar .facet a{text-decoration: none}.top-row .applied{font-weight: bold}.top-row .applied:hover{color: #a94442}.top-row .applied:hover .fa.fa-check:before{content: "\f00d"}.slider-container{padding: 4px 10px;text-align: center}.slider-container .slider.slider-horizontal{width: 100%}.slider-container .slider-track{background: #777;box-shadow: inset 0 1px 0 rgba(0,0,0,0.4)}.slider-container .slider-handle{background: #265680;background-image: none;border: 1px solid #265680;box-shadow: none;opacity: .9}.slider-container .slider-handle:hover,.slider-container .slider-handle:active,.slider-container .slider-handle:focus{opacity: 1;background: #FFF;border-color: #777}.slider-container .slider-handle:active,.slider-container .slider-handle:focus{border-color: #265680}.slider-container .slider-selection{background: #CCC;box-shadow: inset 0 -1px 0 rgba(0,0,0,0.3)}.slider-container input{display: none}.table{table-layout: fixed;word-wrap: break-word}.node{position: absolute;box-sizing: content-box;margin: -1px;overflow: hidden;font: 10px sans-serif;line-height: 12px;border: 1px solid #fff}.node div{margin-top: 0px}.toplevel{border: 2px solid #000}.node .label{position: absolute;bottom: 0;left: 0;min-height: 1px;padding: 2px 4px;font-size: 85%;background-color: rgba(0,0,0,0.5);border-radius: 0;text-shadow: none}.notalabel{color: #000}#viz-instructions{padding-top: 600px}#similar-items-carousel .carousel-indicators{bottom: 0px}#similar-items-carousel .carousel-indicators li{width: 8px;height: 8px;margin: 2px;background-color: rgba(255,255,255,0.3);border-color: #222}#similar-items-carousel .hover-overlay{position: relative;display: block;min-width: 150px;min-height: 200px;margin: auto;text-align: center}#similar-items-carousel .hover-overlay img{max-width: 100%;margin: 10px 0}#similar-items-carousel .hover-overlay .content{position: absolute;top: 0;left: 0;display: none;width: 100%;height: 100%;padding: .5em .5em 0;color: #fff;background-color: rgba(0,0,0,0.5)}#similar-items-carousel .hover-overlay:hover .content{display: block}#similar-items-carousel .item{padding: 0 4em}.facet .jstree-ocl:before{float: left;width: 10px;padding: 0;margin-left: -10px;font-family: 'FontAwesome';font-weight: normal;font-style: normal;text-decoration: inherit;cursor: pointer;speak: none}.facet .jstree-default .jstree-open > .jstree-ocl:before{content: "\f0d7"}.facet .jstree-default .jstree-closed > .jstree-ocl:before{content: "\f0da"}.facet .jstree-default .jstree-leaf > .jstree-ocl:before{content: " "}.jstree-facet li span.main{display: block;padding-left: 1px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.jstree-facet .jstree-container-ul{padding: 0}.jstree-facet .jstree-container-ul > li.active,.jstree-facet .jstree-container-ul > li.active a.jstree-anchor{background-color: #265680;color: #fff}li.jstree-facet,li.jstree-node{list-style: none}li.jstree-facet .badge{cursor: text}li.jstree-facet ul{padding-left: 20px}.hierarchy-tree .jstree-ocl:before{float: left;width: 10px;padding: 0;margin-left: -10px;font-family: 'FontAwesome';font-style: normal;font-weight: normal;cursor: pointer;text-decoration: inherit;speak: none}.hierarchy-tree .jstree-open > .jstree-ocl:before{content: "\f0d7"}.hierarchy-tree .jstree-closed > .jstree-ocl:before{content: "\f0da"}.hierarchy-tree .jstree-leaf > .jstree-ocl:before{content: " "}.hierarchy-tree .jstree-icon{width: 16px;color: #000}.hierarchy-tree .jstree-anchor{padding: 2px 5px;white-space: nowrap}.hierarchy-tree .jstree-container-ul,.hierarchy-tree .jstree-children{padding-left: 16px}.hierarchy-tree .jstree-initial-node{display: none}.hierarchy-tree .jstree-clicked{color: #fff;background-color: #265680}.hierarchy-tree .jstree-clicked .jstree-icon{color: #fff}.offcanvas-overlay,.offcanvas-toggle{display: none}@media screen and (max-width: 767px){body.offcanvas{overflow-x: hidden}body.offcanvas .sidebar{position: fixed;height: 100%;top: 0;width: 75%;padding-left: 0;padding-right: 0;overflow-y: auto}body.offcanvas .sidebar h4{padding-left: 12px}body.offcanvas .sidebar .checkbox{margin-left: 32px}body.offcanvas .sidebar .list-group,body.offcanvas .sidebar .list-group-item{border-left: 0;border-right: 0;border-radius: 0 !important}body.offcanvas.active{overflow-y: hidden}body.offcanvas.offcanvas-left{padding-left: 15px}body.offcanvas.offcanvas-left .main{background: #FFF}body.offcanvas.offcanvas-left.active{margin-left: 75%;margin-right: -75%}body.offcanvas.offcanvas-left.active .sidebar{left: 0}body.offcanvas.offcanvas-left.active .offcanvas-overlay{right: -75%}body.offcanvas.offcanvas-left.active .offcanvas-toggle{left: 75%}body.offcanvas.offcanvas-left .sidebar{left: -75%}body.offcanvas.offcanvas-left .offcanvas-overlay{right: -100%}body.offcanvas.offcanvas-left .offcanvas-toggle{border-radius: 0 3px 3px 0;left: 0}body.offcanvas.offcanvas-right{padding-right: 15px}body.offcanvas.offcanvas-right .main > .container{background: #FFF}body.offcanvas.offcanvas-right.active{margin-left: -75%;margin-right: 75%}body.offcanvas.offcanvas-right.active .sidebar{right: 0}body.offcanvas.offcanvas-right.active .offcanvas-overlay{left: -75%}body.offcanvas.offcanvas-right.active .offcanvas-toggle{right: 75%}body.offcanvas.offcanvas-right .sidebar{right: -75%}body.offcanvas.offcanvas-right .offcanvas-overlay{left: -100%}body.offcanvas.offcanvas-right .offcanvas-toggle{border-radius: 3px 0 0 3px;right: 0}body.offcanvas .offcanvas-overlay{display: block;position: fixed;top: 0;width: 100%;height: 100%;background-color: rgba(0,0,0,0.3);z-index: 3}body.offcanvas .offcanvas-toggle{display: block;position: fixed;top: 50%;width: calc(25px);padding: 20px 0;background: #265680;color: #EEE;text-align: center;z-index: 5}body.offcanvas .offcanvas-overlay,body.offcanvas .offcanvas-toggle,body.offcanvas .offcanvas-toggle *{cursor: pointer}body.offcanvas,body.offcanvas .sidebar,body.offcanvas .offcanvas-overlay,body.offcanvas .offcanvas-toggle{-webkit-transition: all .25s ease-out;-o-transition: all .25s ease-out;transition: all .25s ease-out}}
\ No newline at end of file
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */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: .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{-moz-box-sizing: content-box;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;-moz-box-sizing: content-box;-webkit-box-sizing: content-box;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: .35em .625em .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}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 th,.table-bordered td{border: 1px solid #ddd !important}}@font-face{font-family: 'Glyphicons Halflings';src: url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.eot');src: url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../../themes/bootstrap3/css/less/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../../themes/bootstrap3/css/less/fonts/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: "\2a"}.glyphicon-plus:before{content: "\2b"}.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"}*{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}*:before,*:after{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}html{font-size: 10px;-webkit-tap-highlight-color: rgba(0,0,0,0)}body{font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 14px;line-height: 1.42857143;color: #333;background-color: #fff}input,button,select,textarea{font-family: inherit;font-size: inherit;line-height: inherit}a{color: #12538b;text-decoration: none}a:hover,a:focus{color: #092b47;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,.thumbnail > img,.thumbnail a > img,.carousel-inner > .item > img,.carousel-inner > .item > a > img{display: block;max-width: 100%;height: auto}.img-rounded{border-radius: 6px}.img-thumbnail{padding: 4px;line-height: 1.42857143;background-color: #fff;border: 1px solid #ddd;border-radius: 4px;-webkit-transition: all .2s ease-in-out;-o-transition: all .2s ease-in-out;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: 0;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}[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,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight: normal;line-height: 1;color: #777}h1,.h1,h2,.h2,h3,.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,.h4,h5,.h5,h6,.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}@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{text-transform: uppercase}.text-capitalize{text-transform: capitalize}.text-muted{color: #777}.text-primary{color: #265680}a.text-primary:hover{color: #1a3c59}.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: #265680}a.bg-primary:hover{background-color: #1a3c59}.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}.page-header{padding-bottom: 9px;margin: 40px 0 20px;border-bottom: 1px solid #eee}ul,ol{margin-top: 0;margin-bottom: 10px}ul ul,ol ul,ul ol,ol ol{margin-bottom: 0}.list-unstyled{padding-left: 0;list-style: none}.list-inline{padding-left: 0;list-style: none;margin: 0;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.42857143}dt{font-weight: bold}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}}abbr[title],abbr[data-original-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 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.42857143;color: #777}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 #eee;border-left: 0;text-align: right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content: ''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content: '\00A0 \2014'}address{margin-bottom: 20px;font-style: normal;line-height: 1.42857143}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.42857143;word-break: break-all;word-wrap: break-word;color: #333;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}@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}.row{margin-left: -15px;margin-right: -15px}.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-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-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float: left}.col-sm-12{width: 100%}.col-sm-11{width: 91.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-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float: left}.col-md-12{width: 100%}.col-md-11{width: 91.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-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float: left}.col-lg-12{width: 100%}.col-lg-11{width: 91.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%}}table{background-color: transparent}caption{padding-top: 8px;padding-bottom: 8px;color: #777;text-align: left}th{text-align: left}.table{width: 100%;max-width: 100%;margin-bottom: 20px}.table > thead > tr > th,.table > tbody > tr > th,.table > tfoot > tr > th,.table > thead > tr > td,.table > tbody > tr > td,.table > tfoot > tr > td{padding: 8px;line-height: 1.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 > th,.table > colgroup + thead > tr:first-child > th,.table > thead:first-child > tr:first-child > th,.table > caption + thead > tr:first-child > td,.table > colgroup + thead > tr:first-child > td,.table > thead:first-child > tr:first-child > td{border-top: 0}.table > tbody + tbody{border-top: 2px solid #ddd}.table .table{background-color: #fff}.table-condensed > thead > tr > th,.table-condensed > tbody > tr > th,.table-condensed > tfoot > tr > th,.table-condensed > thead > tr > td,.table-condensed > tbody > tr > td,.table-condensed > tfoot > tr > td{padding: 5px}.table-bordered{border: 1px solid #ddd}.table-bordered > thead > tr > th,.table-bordered > tbody > tr > th,.table-bordered > tfoot > tr > th,.table-bordered > thead > tr > td,.table-bordered > tbody > tr > td,.table-bordered > tfoot > tr > td{border: 1px solid #ddd}.table-bordered > thead > tr > th,.table-bordered > thead > tr > td{border-bottom-width: 2px}.table-striped > tbody > tr:nth-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 > tbody > tr > td.active,.table > tfoot > tr > td.active,.table > thead > tr > th.active,.table > tbody > tr > th.active,.table > tfoot > tr > th.active,.table > thead > tr.active > td,.table > tbody > tr.active > td,.table > tfoot > tr.active > td,.table > thead > tr.active > th,.table > tbody > tr.active > th,.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 > tbody > tr > td.success,.table > tfoot > tr > td.success,.table > thead > tr > th.success,.table > tbody > tr > th.success,.table > tfoot > tr > th.success,.table > thead > tr.success > td,.table > tbody > tr.success > td,.table > tfoot > tr.success > td,.table > thead > tr.success > th,.table > tbody > tr.success > th,.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 > tbody > tr > td.info,.table > tfoot > tr > td.info,.table > thead > tr > th.info,.table > tbody > tr > th.info,.table > tfoot > tr > th.info,.table > thead > tr.info > td,.table > tbody > tr.info > td,.table > tfoot > tr.info > td,.table > thead > tr.info > th,.table > tbody > tr.info > th,.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 > tbody > tr > td.warning,.table > tfoot > tr > td.warning,.table > thead > tr > th.warning,.table > tbody > tr > th.warning,.table > tfoot > tr > th.warning,.table > thead > tr.warning > td,.table > tbody > tr.warning > td,.table > tfoot > tr.warning > td,.table > thead > tr.warning > th,.table > tbody > tr.warning > th,.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 > tbody > tr > td.danger,.table > tfoot > tr > td.danger,.table > thead > tr > th.danger,.table > tbody > tr > th.danger,.table > tfoot > tr > th.danger,.table > thead > tr.danger > td,.table > tbody > tr.danger > td,.table > tfoot > tr.danger > td,.table > thead > tr.danger > th,.table > tbody > tr.danger > th,.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 > tbody > tr > th,.table-responsive > .table > tfoot > tr > th,.table-responsive > .table > thead > tr > td,.table-responsive > .table > tbody > tr > td,.table-responsive > .table > tfoot > tr > td{white-space: nowrap}.table-responsive > .table-bordered{border: 0}.table-responsive > .table-bordered > thead > tr > th:first-child,.table-responsive > .table-bordered > tbody > tr > th:first-child,.table-responsive > .table-bordered > tfoot > tr > th:first-child,.table-responsive > .table-bordered > thead > tr > td:first-child,.table-responsive > .table-bordered > tbody > tr > td:first-child,.table-responsive > .table-bordered > tfoot > tr > td:first-child{border-left: 0}.table-responsive > .table-bordered > thead > tr > th:last-child,.table-responsive > .table-bordered > tbody > tr > th:last-child,.table-responsive > .table-bordered > tfoot > tr > th:last-child,.table-responsive > .table-bordered > thead > tr > td:last-child,.table-responsive > .table-bordered > tbody > tr > td:last-child,.table-responsive > .table-bordered > tfoot > tr > td:last-child{border-right: 0}.table-responsive > .table-bordered > tbody > tr:last-child > th,.table-responsive > .table-bordered > tfoot > tr:last-child > th,.table-responsive > .table-bordered > tbody > tr:last-child > td,.table-responsive > .table-bordered > tfoot > tr:last-child > td{border-bottom: 0}}fieldset{padding: 0;margin: 0;border: 0;min-width: 0}legend{display: block;width: 100%;padding: 0;margin-bottom: 20px;font-size: 21px;line-height: inherit;color: #333;border: 0;border-bottom: 1px solid #e5e5e5}label{display: inline-block;max-width: 100%;margin-bottom: 5px;font-weight: bold}input[type="search"]{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box}input[type="radio"],input[type="checkbox"]{margin: 4px 0 0;margin-top: 1px \9;line-height: normal}input[type="file"]{display: block}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.42857143;color: #555}.form-control{display: block;width: 100%;height: 34px;padding: 6px 12px;font-size: 14px;line-height: 1.42857143;color: #555;background-color: #fff;background-image: none;border: 1px solid #ccc;border-radius: 4px;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color: #66afe9;outline: 0;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102,175,233,0.6);box-shadow: inset 0 1px 1px rgba(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[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color: #eee;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"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height: 34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.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"]{line-height: 30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.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"]{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="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor: not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor: not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio 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,.form-control-static.input-sm{padding-left: 0;padding-right: 0}.input-sm{height: 30px;padding: 5px 10px;font-size: 12px;line-height: 1.5;border-radius: 3px}select.input-sm{height: 30px;line-height: 30px}textarea.input-sm,select[multiple].input-sm{height: auto}.form-group-sm .form-control{height: 30px;padding: 5px 10px;font-size: 12px;line-height: 1.5;border-radius: 3px}select.form-group-sm .form-control{height: 30px;line-height: 30px}textarea.form-group-sm .form-control,select[multiple].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;min-height: 32px}.input-lg{height: 46px;padding: 10px 16px;font-size: 18px;line-height: 1.3333333;border-radius: 6px}select.input-lg{height: 46px;line-height: 46px}textarea.input-lg,select[multiple].input-lg{height: auto}.form-group-lg .form-control{height: 46px;padding: 10px 16px;font-size: 18px;line-height: 1.3333333;border-radius: 6px}select.form-group-lg .form-control{height: 46px;line-height: 46px}textarea.form-group-lg .form-control,select[multiple].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;min-height: 38px}.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{width: 46px;height: 46px;line-height: 46px}.input-sm + .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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color: #2b542c;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #67b168;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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color: #66512c;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #c0a16b;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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color: #843534;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483;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}@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: 14.333333px}}@media (min-width: 768px){.form-horizontal .form-group-sm .control-label{padding-top: 6px}}.btn{display: inline-block;margin-bottom: 0;font-weight: normal;text-align: center;vertical-align: middle;touch-action: manipulation;cursor: pointer;background-image: none;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:focus,.btn:active:focus,.btn.active:focus,.btn.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;-webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);box-shadow: inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor: not-allowed;pointer-events: none;opacity: .65;filter: alpha(opacity=65);-webkit-box-shadow: none;box-shadow: none}.btn-default{color: #333;background-color: #fff;border-color: #ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open > .dropdown-toggle.btn-default{color: #333;background-color: #e6e6e6;border-color: #adadad}.btn-default:active,.btn-default.active,.open > .dropdown-toggle.btn-default{background-image: none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color: #fff;border-color: #ccc}.btn-default .badge{color: #fff;background-color: #333}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color: #fff;background-color: #333;border-color: #adadad}.btn-primary{color: #fff;background-color: #265680;border-color: #fff}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary{color: #fff;background-color: #1a3c59;border-color: #e0e0e0}.btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary{background-image: none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color: #265680;border-color: #fff}.btn-primary .badge{color: #265680;background-color: #fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color: #265680;background-color: #fff;border-color: #e0e0e0}.btn-success{color: #fff;background-color: #028302;border-color: #fff}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open > .dropdown-toggle.btn-success{color: #fff;background-color: #015101;border-color: #e0e0e0}.btn-success:active,.btn-success.active,.open > .dropdown-toggle.btn-success{background-image: none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color: #028302;border-color: #fff}.btn-success .badge{color: #028302;background-color: #fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color: #028302;background-color: #fff;border-color: #e0e0e0}.btn-info{color: #fff;background-color: #1c5f74;border-color: #fff}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open > .dropdown-toggle.btn-info{color: #fff;background-color: #123d4b;border-color: #e0e0e0}.btn-info:active,.btn-info.active,.open > .dropdown-toggle.btn-info{background-image: none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color: #1c5f74;border-color: #fff}.btn-info .badge{color: #1c5f74;background-color: #fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color: #1c5f74;background-color: #fff;border-color: #e0e0e0}.btn-warning{color: #fff;background-color: #a56100;border-color: #fff}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open > .dropdown-toggle.btn-warning{color: #fff;background-color: #724300;border-color: #e0e0e0}.btn-warning:active,.btn-warning.active,.open > .dropdown-toggle.btn-warning{background-image: none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color: #a56100;border-color: #fff}.btn-warning .badge{color: #a56100;background-color: #fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color: #a56100;background-color: #fff;border-color: #e0e0e0}.btn-danger{color: #fff;background-color: #a41915;border-color: #fff}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger{color: #fff;background-color: #77120f;border-color: #e0e0e0}.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger{background-image: none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color: #a41915;border-color: #fff}.btn-danger .badge{color: #a41915;background-color: #fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color: #a41915;background-color: #fff;border-color: #e0e0e0}.btn-link{color: #12538b;font-weight: normal;border-radius: 0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color: transparent;-webkit-box-shadow: none;box-shadow: none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color: transparent}.btn-link:hover,.btn-link:focus{color: #092b47;text-decoration: underline;background-color: transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color: #777;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;-webkit-transition: opacity .15s linear;-o-transition: opacity .15s linear;transition: opacity .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;-webkit-transition-property: height, visibility;transition-property: height, visibility;-webkit-transition-duration: .35s;transition-duration: .35s;-webkit-transition-timing-function: ease;transition-timing-function: ease}.caret{display: inline-block;width: 0;height: 0;margin-left: 2px;vertical-align: middle;border-top: 4px dashed;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;-webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175);box-shadow: 0 6px 12px rgba(0,0,0,0.175);background-clip: padding-box}.dropdown-menu.pull-right{right: 0;left: auto}.dropdown-menu .divider{height: 1px;margin: 9px 0;overflow: hidden;background-color: #e5e5e5}.dropdown-menu > li > a{display: block;padding: 3px 20px;clear: both;font-weight: normal;line-height: 1.42857143;color: #333;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: #265680}.dropdown-menu > .disabled > a,.dropdown-menu > .disabled > a:hover,.dropdown-menu > .disabled > a:focus{color: #777}.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.42857143;color: #777;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 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 > .btn,.btn-group-vertical > .btn{position: relative;float: left}.btn-group > .btn:hover,.btn-group-vertical > .btn:hover,.btn-group > .btn:focus,.btn-group-vertical > .btn:focus,.btn-group > .btn:active,.btn-group-vertical > .btn:active,.btn-group > .btn.active,.btn-group-vertical > .btn.active{z-index: 2}.btn-group .btn + .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-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{padding-left: 12px;padding-right: 12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);box-shadow: inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow: none;box-shadow: none}.btn .caret{margin-left: 0}.btn-lg .caret{border-width: 5px 5px 0;border-bottom-width: 0}.dropup .btn-lg .caret{border-width: 0 5px 5px}.btn-group-vertical > .btn,.btn-group-vertical > .btn-group,.btn-group-vertical > .btn-group > .btn{display: block;float: none;width: 100%;max-width: 100%}.btn-group-vertical > .btn-group > .btn{float: none}.btn-group-vertical > .btn + .btn,.btn-group-vertical > .btn + .btn-group,.btn-group-vertical > .btn-group + .btn,.btn-group-vertical > .btn-group + .btn-group{margin-top: -1px;margin-left: 0}.btn-group-vertical > .btn:not(:first-child):not(:last-child){border-radius: 0}.btn-group-vertical > .btn:first-child:not(:last-child){border-top-right-radius: 4px;border-bottom-right-radius: 0;border-bottom-left-radius: 0}.btn-group-vertical > .btn:last-child:not(:first-child){border-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="radio"],[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],[data-toggle="buttons"] > .btn input[type="checkbox"],[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-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}textarea.input-group-lg > .form-control,textarea.input-group-lg > .input-group-addon,textarea.input-group-lg > .input-group-btn > .btn,select[multiple].input-group-lg > .form-control,select[multiple].input-group-lg > .input-group-addon,select[multiple].input-group-lg > .input-group-btn > .btn{height: auto}.input-group-sm > .form-control,.input-group-sm > .input-group-addon,.input-group-sm > .input-group-btn > .btn{height: 30px;padding: 5px 10px;font-size: 12px;line-height: 1.5;border-radius: 3px}select.input-group-sm > .form-control,select.input-group-sm > .input-group-addon,select.input-group-sm > .input-group-btn > .btn{height: 30px;line-height: 30px}textarea.input-group-sm > .form-control,textarea.input-group-sm > .input-group-addon,textarea.input-group-sm > .input-group-btn > .btn,select[multiple].input-group-sm > .form-control,select[multiple].input-group-sm > .input-group-addon,select[multiple].input-group-sm > .input-group-btn > .btn{height: auto}.input-group-addon,.input-group-btn,.input-group .form-control{display: table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius: 0}.input-group-addon,.input-group-btn{width: 1%;white-space: nowrap;vertical-align: middle}.input-group-addon{padding: 6px 12px;font-size: 14px;font-weight: normal;line-height: 1;color: #555;text-align: center;background-color: #eee;border: 1px solid #ccc;border-radius: 4px}.input-group-addon.input-sm{padding: 5px 10px;font-size: 12px;border-radius: 3px}.input-group-addon.input-lg{padding: 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{margin-left: -1px}.nav{margin-bottom: 0;padding-left: 0;list-style: none}.nav > li{position: relative;display: block}.nav > li > a{position: relative;display: block;padding: 10px 15px}.nav > li > a:hover,.nav > li > a:focus{text-decoration: none;background-color: #eee}.nav > li.disabled > a{color: #777}.nav > li.disabled > a:hover,.nav > li.disabled > a:focus{color: #777;text-decoration: none;background-color: transparent;cursor: not-allowed}.nav .open > a,.nav .open > a:hover,.nav .open > a:focus{background-color: #eee;border-color: #12538b}.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:hover,.nav-tabs > li.active > a:focus{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}.nav-tabs.nav-justified > .dropdown .dropdown-menu{top: auto;left: auto}@media (min-width: 768px){.nav-tabs.nav-justified > li{display: table-cell;width: 1%}.nav-tabs.nav-justified > li > a{margin-bottom: 0}}.nav-tabs.nav-justified > li > a{margin-right: 0;border-radius: 4px}.nav-tabs.nav-justified > .active > a,.nav-tabs.nav-justified > .active > a:hover,.nav-tabs.nav-justified > .active > a:focus{border: 1px solid #ddd}@media (min-width: 768px){.nav-tabs.nav-justified > li > a{border-bottom: 1px solid #ddd;border-radius: 4px 4px 0 0}.nav-tabs.nav-justified > .active > a,.nav-tabs.nav-justified > .active > a:hover,.nav-tabs.nav-justified > .active > a:focus{border-bottom-color: #fff}}.nav-pills > li{float: left}.nav-pills > li > a{border-radius: 4px}.nav-pills > li + li{margin-left: 2px}.nav-pills > li.active > a,.nav-pills > li.active > a:hover,.nav-pills > li.active > a:focus{color: #fff;background-color: #265680}.nav-stacked > li{float: none}.nav-stacked > li + li{margin-top: 2px;margin-left: 0}.nav-justified{width: 100%}.nav-justified > li{float: none}.nav-justified > li > a{text-align: center;margin-bottom: 5px}.nav-justified > .dropdown .dropdown-menu{top: auto;left: auto}@media (min-width: 768px){.nav-justified > li{display: table-cell;width: 1%}.nav-justified > li > a{margin-bottom: 0}}.nav-tabs-justified{border-bottom: 0}.nav-tabs-justified > li > a{margin-right: 0;border-radius: 4px}.nav-tabs-justified > .active > a,.nav-tabs-justified > .active > a:hover,.nav-tabs-justified > .active > a:focus{border: 1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified > li > a{border-bottom: 1px solid #ddd;border-radius: 4px 4px 0 0}.nav-tabs-justified > .active > a,.nav-tabs-justified > .active > a:hover,.nav-tabs-justified > .active > a:focus{border-bottom-color: #fff}}.tab-content > .tab-pane{display: none}.tab-content > .active{display: block}.nav-tabs .dropdown-menu{margin-top: -1px;border-top-right-radius: 0;border-top-left-radius: 0}.navbar{position: relative;min-height: 50px;margin-bottom: 20px;border: 1px solid transparent}@media (min-width: 768px){.navbar{border-radius: 4px}}@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.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-fluid > .navbar-header,.container > .navbar-collapse,.container-fluid > .navbar-collapse{margin-right: -15px;margin-left: -15px}@media (min-width: 768px){.container > .navbar-header,.container-fluid > .navbar-header,.container > .navbar-collapse,.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;-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.1);box-shadow: inset 0 1px 0 rgba(255,255,255,0.1), 0 1px 0 rgba(255,255,255,0.1);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;-webkit-box-shadow: none;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{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}}@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: #132531;border-color: #0a1319}.navbar-default .navbar-brand{color: #fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color: #068139;background-color: transparent}.navbar-default .navbar-text{color: #fff}.navbar-default .navbar-nav > li > a{color: #fff}.navbar-default .navbar-nav > li > a:hover,.navbar-default .navbar-nav > li > a:focus{color: #132531;background-color: #fff}.navbar-default .navbar-nav > .active > a,.navbar-default .navbar-nav > .active > a:hover,.navbar-default .navbar-nav > .active > a:focus{color: #132531;background-color: #fff}.navbar-default .navbar-nav > .disabled > a,.navbar-default .navbar-nav > .disabled > a:hover,.navbar-default .navbar-nav > .disabled > a:focus{color: #fff;background-color: #068139}.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: #0a1319}.navbar-default .navbar-nav > .open > a,.navbar-default .navbar-nav > .open > a:hover,.navbar-default .navbar-nav > .open > a:focus{background-color: #fff;color: #132531}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu > li > a{color: #fff}.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus{color: #132531;background-color: #fff}.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: #132531;background-color: #fff}.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: #fff;background-color: #068139}}.navbar-default .navbar-link{color: #fff}.navbar-default .navbar-link:hover{color: #132531}.navbar-default .btn-link{color: #fff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color: #132531}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color: #fff}.navbar-inverse{background-color: #222;border-color: #080808}.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: #080808}.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: #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: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: #080808}.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,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,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: "/\00a0";padding: 0 5px;color: #ccc}.breadcrumb > .active{color: #777}.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.42857143;text-decoration: none;color: #12538b;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 > span:hover,.pagination > li > a:focus,.pagination > li > span:focus{color: #092b47;background-color: #eee;border-color: #ddd}.pagination > .active > a,.pagination > .active > span,.pagination > .active > a:hover,.pagination > .active > span:hover,.pagination > .active > a:focus,.pagination > .active > span:focus{z-index: 2;color: #fff;background-color: #265680;border-color: #265680;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: #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{display: inline}.pager li > a,.pager li > span{display: inline-block;padding: 5px 14px;background-color: #fff;border: 1px solid #ddd;border-radius: 15px}.pager li > a:hover,.pager li > a:focus{text-decoration: none;background-color: #eee}.pager .next > a,.pager .next > span{float: right}.pager .previous > a,.pager .previous > span{float: left}.pager .disabled > a,.pager .disabled > a:hover,.pager .disabled > a:focus,.pager .disabled > span{color: #777;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}a.label:hover,a.label:focus{color: #fff;text-decoration: none;cursor: pointer}.label:empty{display: none}.btn .label{position: relative;top: -1px}.label-default{background-color: #777}.label-default[href]:hover,.label-default[href]:focus{background-color: #5e5e5e}.label-primary{background-color: #265680}.label-primary[href]:hover,.label-primary[href]:focus{background-color: #1a3c59}.label-success{background-color: #028302}.label-success[href]:hover,.label-success[href]:focus{background-color: #015101}.label-info{background-color: #1c5f74}.label-info[href]:hover,.label-info[href]:focus{background-color: #123d4b}.label-warning{background-color: #a56100}.label-warning[href]:hover,.label-warning[href]:focus{background-color: #724300}.label-danger{background-color: #a41915}.label-danger[href]:hover,.label-danger[href]:focus{background-color: #77120f}.badge{display: inline-block;min-width: 10px;padding: 3px 7px;font-size: 12px;font-weight: bold;color: #fff;line-height: 1;vertical-align: baseline;white-space: nowrap;text-align: center;background-color: #777;border-radius: 10px}.badge:empty{display: none}.btn .badge{position: relative;top: -1px}.btn-xs .badge,.btn-group-xs > .btn .badge{top: 0;padding: 1px 5px}a.badge:hover,a.badge:focus{color: #fff;text-decoration: none;cursor: pointer}.list-group-item.active > .badge,.nav-pills > .active > a > .badge{color: #12538b;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}.jumbotron{padding: 30px 15px;margin-bottom: 30px;color: inherit;background-color: #eee}.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}.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{display: block;padding: 4px;margin-bottom: 20px;line-height: 1.42857143;background-color: #fff;border: 1px solid #ddd;border-radius: 4px;-webkit-transition: border .2s ease-in-out;-o-transition: border .2s ease-in-out;transition: border .2s ease-in-out}.thumbnail > img,.thumbnail a > img{margin-left: auto;margin-right: auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color: #12538b}.thumbnail .caption{padding: 9px;color: #333}.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;-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);box-shadow: inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float: left;width: 0%;height: 100%;font-size: 12px;line-height: 20px;color: #fff;text-align: center;background-color: #265680;-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition: width .6s ease;-o-transition: width .6s ease;transition: width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{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);background-size: 40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation: progress-bar-stripes 2s linear infinite;-o-animation: progress-bar-stripes 2s linear infinite;animation: progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color: #028302}.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-info{background-color: #1c5f74}.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-warning{background-color: #a56100}.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-danger{background-color: #a41915}.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)}.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-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{color: #555}a.list-group-item .list-group-item-heading{color: #333}a.list-group-item:hover,a.list-group-item:focus{text-decoration: none;color: #555;background-color: #f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color: #eee;color: #777;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: #777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index: 2;color: #fff;background-color: #265680;border-color: #265680}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading > small,.list-group-item.active:hover .list-group-item-heading > small,.list-group-item.active:focus .list-group-item-heading > small,.list-group-item.active .list-group-item-heading > .small,.list-group-item.active:hover .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: #93bcdf}.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:hover,a.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{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:hover,a.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{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:hover,a.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{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:hover,a.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{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;-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05);box-shadow: 0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding: 15px}.panel-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-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-responsive:first-child > .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 > 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-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,.panel > .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 td:first-child,.panel > .table:first-child > thead:first-child > tr:first-child th: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 th: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-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,.panel > .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 td:last-child,.panel > .table:first-child > thead:first-child > tr:first-child th: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 th: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-responsive:last-child > .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 > 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-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,.panel > .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 td:first-child,.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,.panel > .table:last-child > tfoot:last-child > tr:last-child th: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-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,.panel > .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 td:last-child,.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,.panel > .table:last-child > tfoot:last-child > tr:last-child th: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-responsive > .table-bordered > thead > tr > th:first-child,.panel > .table-bordered > tbody > tr > th:first-child,.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,.panel > .table-bordered > tfoot > tr > th:first-child,.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,.panel > .table-bordered > thead > tr > td:first-child,.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,.panel > .table-bordered > tbody > tr > td:first-child,.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,.panel > .table-bordered > tfoot > tr > td:first-child,.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child{border-left: 0}.panel > .table-bordered > thead > tr > th:last-child,.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,.panel > .table-bordered > tbody > tr > th:last-child,.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,.panel > .table-bordered > tfoot > tr > th:last-child,.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,.panel > .table-bordered > thead > tr > td:last-child,.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,.panel > .table-bordered > tbody > tr > td:last-child,.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,.panel > .table-bordered > tfoot > tr > td:last-child,.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child{border-right: 0}.panel > .table-bordered > thead > tr:first-child > td,.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,.panel > .table-bordered > tbody > tr:first-child > td,.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,.panel > .table-bordered > thead > tr:first-child > th,.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,.panel > .table-bordered > tbody > tr:first-child > th,.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th{border-bottom: 0}.panel > .table-bordered > tbody > tr:last-child > td,.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,.panel > .table-bordered > tfoot > tr:last-child > td,.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,.panel > .table-bordered > tbody > tr:last-child > th,.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,.panel > .table-bordered > tfoot > tr:last-child > th,.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th{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: #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: #265680}.panel-primary > .panel-heading{color: #fff;background-color: #265680;border-color: #265680}.panel-primary > .panel-heading + .panel-collapse > .panel-body{border-top-color: #265680}.panel-primary > .panel-heading .badge{color: #265680;background-color: #fff}.panel-primary > .panel-footer + .panel-collapse > .panel-body{border-bottom-color: #265680}.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;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);box-shadow: inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color: #ddd;border-color: rgba(0,0,0,0.15)}.well-lg{padding: 24px;border-radius: 6px}.well-sm{padding: 9px;border-radius: 3px}.close,.group .group-close{float: right;font-size: 21px;font-weight: bold;line-height: 1;color: #000;text-shadow: 0 1px 0 #fff;opacity: .2;filter: alpha(opacity=20)}.close:hover,.close:focus{color: #000;text-decoration: none;cursor: pointer;opacity: .5;filter: alpha(opacity=50)}button.close{padding: 0;cursor: pointer;background: transparent;border: 0;-webkit-appearance: none}.modal-open{overflow: hidden}.modal{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%);-ms-transform: translate(0, -25%);-o-transform: translate(0, -25%);transform: translate(0, -25%);-webkit-transition: -webkit-transform 0.3s ease-out;-moz-transition: -moz-transform 0.3s ease-out;-o-transition: -o-transform 0.3s ease-out;transition: transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform: translate(0, 0);-ms-transform: translate(0, 0);-o-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;-webkit-box-shadow: 0 3px 9px rgba(0,0,0,0.5);box-shadow: 0 3px 9px rgba(0,0,0,0.5);background-clip: padding-box;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: .5;filter: alpha(opacity=50)}.modal-header{padding: 15px;border-bottom: 1px solid #e5e5e5;min-height: 16.42857143px}.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{-webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.5);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: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 12px;font-weight: normal;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{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: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 14px;font-weight: normal;line-height: 1.42857143;text-align: left;background-color: #fff;background-clip: padding-box;border: 1px solid #ccc;border: 1px solid rgba(0,0,0,0.2);border-radius: 6px;-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);box-shadow: 0 5px 10px rgba(0,0,0,0.2);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}.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,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: #999;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: #999;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: #999;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;-webkit-transition: .6s ease-in-out left;-o-transition: .6s ease-in-out left;transition: .6s ease-in-out left}.carousel-inner > .item > img,.carousel-inner > .item > a > img{line-height: 1}@media all and (transform-3d), (-webkit-transform-3d){.carousel-inner > .item{-webkit-transition: -webkit-transform 0.6s ease-in-out;-moz-transition: -moz-transform 0.6s ease-in-out;-o-transition: -o-transform 0.6s ease-in-out;transition: transform 0.6s ease-in-out;-webkit-backface-visibility: hidden;-moz-backface-visibility: hidden;backface-visibility: hidden;-webkit-perspective: 1000;-moz-perspective: 1000;perspective: 1000}.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: .5;filter: alpha(opacity=50);font-size: 20px;color: #fff;text-align: center;text-shadow: 0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image: -o-linear-gradient(left, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-image: linear-gradient(to right, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left: auto;right: 0;background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image: -o-linear-gradient(left, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-image: linear-gradient(to right, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-repeat: repeat-x;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline: 0;color: #fff;text-decoration: none;opacity: .9;filter: alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position: absolute;top: 50%;z-index: 5;display: inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left: 50%;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;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;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: -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}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical > .btn-group:before,.btn-group-vertical > .btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content: " ";display: table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical > .btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer: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,.visible-sm,.visible-md,.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}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}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}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}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}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}}.sr-only{clip: rect(1px, 1px, 1px, 1px);position: absolute;width: auto;height: auto;margin: 0;padding: 0;overflow: hidden;border: 0}.sr-only:focus{background-color: #fff;border-radius: 4px;clip: auto;color: #132531;display: block;font-size: 14px;height: 50px;line-height: 20px;padding: 15px 15px;position: absolute;left: 5px;top: 5px;text-decoration: none;text-transform: none;width: auto;z-index: 100000}.navbar-brand{font-size: 20px}.alert.alert-info a{text-decoration: underline}.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover{color: #000}[data-toggle~="dropdown"]{cursor: pointer}.fa{cursor: default}@media (min-width: 768px){.form-control{max-width: 400px}}.has-error{margin-bottom: 0}.sms-error{margin-bottom: 0}.sms-error .help-block,.sms-error .control-label,.sms-error .radio,.sms-error .checkbox,.sms-error .radio-inline,.sms-error .checkbox-inline,.sms-error.radio label,.sms-error.checkbox label,.sms-error.radio-inline label,.sms-error.checkbox-inline label{color: #a94442}.sms-error .form-control{border-color: #a94442;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);box-shadow: inset 0 1px 1px rgba(0,0,0,0.075)}.sms-error .form-control:focus{border-color: #843534;-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483;box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 6px #ce8483}.sms-error .input-group-addon{color: #a94442;border-color: #a94442;background-color: #f2dede}.sms-error .form-control-feedback{color: #a94442}.help-block.with-errors{padding-top: 6px;padding-bottom: 6px}.help-block.with-errors:empty{padding: 0}.help-block.with-errors,.list-unstyled{margin: 0}.highlight,mark{background: #ff6;padding: .1em .2em}.icon-bar{background-color: #888}img{max-width: 100%}label.list-group-item{margin-top: 0;padding-left: 35px;font-weight: normal;border-radius: 0}.list-group-item.title{font-weight: bold}#modal{background-color: rgba(0,0,0,0.2)}#modal .modal-body > h2:first-child{display: none}.popover{width: 250px}@media (min-width: 768px){h2{font-size: 23px;font-weight: normal}}@media (max-width: 767px){h2{font-size: 20px}}@media (min-width: 768px){h3{font-size: 20px;font-weight: normal}}@media (max-width: 767px){h3{font-size: 16px}}.recordcover{max-height: 300px}.sub-breadcrumb{padding: 5px 10px;white-space: nowrap}.sub-breadcrumb li{display: inline-block}.sub-breadcrumb li + li:before{padding-left: 5px;padding-right: 5px;color: #ccc;content: "/\00a0"}.tab-content{padding: 4px}@media (max-width: 991px){header .container.navbar{margin-bottom: 0}.searchForm{margin-top: 0}}@media (max-width: 767px){.searchForm{padding-top: 0}}.group{position: relative;background: #eee;border-radius: 4px;border: 1px solid #c8c8c8;margin-top: 0;margin-bottom: .5em !important}.group .add_search_link{display: inline-block;margin-top: 4px}.group .group-close{position: absolute;top: .3em;right: .5em;opacity: .4;z-index: 2}.group .search{margin-bottom: 2px}.group .search .close{opacity: .8}@media (min-width: 768px){.group{padding: 10px 10px 10px 25px}.group [class^=col-]{padding-left: 0}}@media (max-width: 767px){.group .search .middle{float: left;width: 90%}.group .group-close{top: .5em;right: 1em;opacity: .6}}@media (max-width: 991px){.group .form-control{max-width: none}}#groupPlaceHolder{display: block;padding: 6px}.template-dir-eds.template-name-advanced legend{margin-bottom: 0}.template-dir-eds.template-name-advanced .no-js .group:nth-child(n+3){display: none}.template-dir-eds.template-name-advanced .search .close a{margin-left: -2em}.alphabrowse{border-collapse: separate}.alphabrowse .lcc{width: 20%}.alphabrowse .titles{width: 10%;text-align: center}.alphabrowse tr.browse-match td{border-top: .2em solid #265680;border-bottom: .2em solid #265680}.alphabrowse tr.browse-match td:first-child{border-left: .2em solid #265680}.alphabrowse tr.browse-match td:last-child{border-right: .2em solid #265680}.autocomplete-results{margin-top: 2px;border: 1px solid #ddd;background-color: #fff;border-radius: 4px;overflow: hidden}.autocomplete-results .item{display: block;padding-top: .75rem;padding-right: 1rem;padding-bottom: .75rem;padding-left: 1.25rem;border-bottom: 1px solid #ddd;cursor: pointer}.autocomplete-results .item:last-child{border: 0}.autocomplete-results .item.selected{background-color: #265680;color: #fff}.badge a{color: #fff}.browse.list-group .list-group-item{word-wrap: break-word}.browse.list-group .list-group-item.view-record{padding: 2px 4px;font-size: 85%;text-align: right;border-top: 0}.cart-controls .checkbox{line-height: 2.5em;padding-right: 1em}#modal .cart-controls .btn{margin-bottom: 4px}#modal .cart-controls .checkbox{padding-bottom: 1em}#modal .cart-controls ~ hr{margin-top: 0}.fa-grid:before{content: "\f00a"}.fa-visual:before{content: "\f008"}.fa-x:before{content: "\f0f6"}.fa-atlas:before{content: "\f14e"}.fa-book:before{content: "\f02d"}.fa-braille:before{content: "\f0a6"}.fa-cdrom:before{content: "\f109"}.fa-chart:before{content: "\f012"}.fa-chipcartridge:before{content: "\f109"}.fa-collage:before{content: "\f03e"}.fa-disccartridge:before{content: "\f109"}.fa-drawing:before{content: "\f03e"}.fa-ebook:before{content: "\f0f6"}.fa-electronic:before{content: "\f1c6"}.fa-filmstrip:before{content: "\f008"}.fa-flashcard:before{content: "\f0e7"}.fa-floppydisk:before{content: "\f0c7"}.fa-globe:before{content: "\f0ac"}.fa-journal:before{content: "\f0f6"}.fa-kit:before{content: "\f0b1"}.fa-manuscript:before{content: "\f0f6"}.fa-map:before{content: "\f14e"}.fa-microfilm:before{content: "\f008"}.fa-motionpicture:before{content: "\f03d"}.fa-musicalscore:before{content: "\f001"}.fa-musicrecording:before{content: "\f001"}.fa-newspaper:before{content: "\f0f6"}.fa-online:before{content: "\f109"}.fa-painting:before{content: "\f03e"}.fa-photo:before{content: "\f03e"}.fa-photonegative:before{content: "\f03e"}.fa-physicalobject:before{content: "\f187"}.fa-print:before{content: "\f03e"}.fa-sensorimage:before{content: "\f03e"}.fa-serial:before{content: "\f0f6"}.fa-slide:before{content: "\f008"}.fa-software:before{content: "\f109"}.fa-soundcassette:before{content: "\f025"}.fa-sounddisc:before{content: "\f109"}.fa-soundrecording:before{content: "\f025"}.fa-tapecartridge:before{content: "\f109"}.fa-tapecassette:before{content: "\f025"}.fa-tapereel:before{content: "\f008"}.fa-transparency:before{content: "\f008"}.fa-unknown:before{content: "\f128"}.fa-video:before{content: "\f03d"}.fa-videocartridge:before{content: "\f03d"}.fa-videocassette:before{content: "\f03d"}.fa-videodisc:before{content: "\f109"}.fa-videoreel:before{content: "\f03d"}#dateVisColorSettings{background-color: #fff;fill: #eaeaea;outline-color: #e8cfac;stroke: #265680}.citation .pace-car th,.citation .pace-car td{border: 0;padding: 0}.citation th{text-align: right}#hierarchyTreeHolder{overflow-x: hidden;border-right: 1px solid #eee}#hierarchyTree .currentHierarchy > a,#hierarchyTree .currentRecord a{font-weight: bold;color: #000}.tagList .tag{display: inline-block;margin: 0 1px 1px;padding: 6px 6px;font-size: 14px;line-height: 1.42857143;border-radius: 4px}.tagList .tag.selected{background-color: #265680}.tagList .tag.selected a{color: #fff}.tagList .tag.selected .badge{color: #222;background-color: #fff}.tagList .tag.selected .badge:hover{color: #a94442}.tagList .tag .badge .fa{width: 12px}.tagList button{border: 0}.tagList .tag-form{display: inline}.tagList.loggedin .tag:not(.selected) .badge:hover{background-color: #028302}.bulkActionButtons label{display: inline-block}.bulkActionButtons label input{margin-top: 2px}@media (max-width: 767px){.grid{min-height: 250px}}.result a.title{font-weight: bold}.result .left{text-align: center}.result .left img{max-width: 100%}@media (max-width: 767px){.result a{text-decoration: underline}.result .middle,.result .right{padding: 0}}@media (max-width: 530px){.result .checkbox{display: none !important}.result .left{width: 40%}.result .middle{width: 60%}.result .right{display: none}}.search-controls .alert{margin-bottom: 0}.searchtools a{padding: 0 .5em}.title-in-heading{font-size: inherit;font-style: italic}.narrow-toggle{text-align: center}.sidebar label:not(.list-group-item){margin-left: 20px}.sidebar .list-group:not(.filters) .title{cursor: pointer}.sidebar .list-group:not(.filters) .title.collapsed{border-radius: 4px}.sidebar .list-group:not(.filters) .title.collapsed:after{content: '\25BC'}.sidebar .list-group:not(.filters) .title:after{content: '\25B2';float: right}.sidebar .collapse .list-group-item,.sidebar .collapsing .list-group-item{border-top-left-radius: 0px;border-top-right-radius: 0px}.sidebar .collapse .list-group-item[id^=more],.sidebar .collapsing .list-group-item[id^=more]{border-bottom-left-radius: 4px;border-bottom-right-radius: 4px}.sidebar #side-collapse-publishDate .list-group-item{border-bottom-left-radius: 4px;border-bottom-right-radius: 4px}.list-group-item i.fa,.badge i.fa{cursor: inherit}.sidebar .facet a{text-decoration: none}.top-row .applied{font-weight: bold}.top-row .applied:hover{color: #a94442}.top-row .applied:hover .fa.fa-check:before{content: "\f00d"}.slider-container{padding: 4px 10px;text-align: center}.slider-container .slider.slider-horizontal{width: 100%}.slider-container .slider-track{background: #777;box-shadow: inset 0 1px 0 rgba(0,0,0,0.4)}.slider-container .slider-handle{background: #265680;background-image: none;border: 1px solid #265680;box-shadow: none;opacity: .9}.slider-container .slider-handle:hover,.slider-container .slider-handle:active,.slider-container .slider-handle:focus{opacity: 1;background: #FFF;border-color: #777}.slider-container .slider-handle:active,.slider-container .slider-handle:focus{border-color: #265680}.slider-container .slider-selection{background: #CCC;box-shadow: inset 0 -1px 0 rgba(0,0,0,0.3)}.slider-container input{display: none}.table{table-layout: fixed;word-wrap: break-word}.node{position: absolute;box-sizing: content-box;margin: -1px;overflow: hidden;font: 10px sans-serif;line-height: 12px;border: 1px solid #fff}.node div{margin-top: 0px}.toplevel{border: 2px solid #000}.node .label{position: absolute;bottom: 0;left: 0;min-height: 1px;padding: 2px 4px;font-size: 85%;background-color: rgba(0,0,0,0.5);border-radius: 0;text-shadow: none}.notalabel{color: #000}#viz-instructions{padding-top: 600px}#similar-items-carousel .carousel-indicators{bottom: 0px}#similar-items-carousel .carousel-indicators li{width: 8px;height: 8px;margin: 2px;background-color: rgba(255,255,255,0.3);border-color: #222}#similar-items-carousel .hover-overlay{position: relative;display: block;min-width: 150px;min-height: 200px;margin: auto;text-align: center}#similar-items-carousel .hover-overlay img{max-width: 100%;margin: 10px 0}#similar-items-carousel .hover-overlay .content{position: absolute;top: 0;left: 0;display: none;width: 100%;height: 100%;padding: .5em .5em 0;color: #fff;background-color: rgba(0,0,0,0.5)}#similar-items-carousel .hover-overlay:hover .content{display: block}#similar-items-carousel .item{padding: 0 4em}.facet .jstree-ocl:before{float: left;width: 10px;padding: 0;margin-left: -10px;font-family: 'FontAwesome';font-weight: normal;font-style: normal;text-decoration: inherit;cursor: pointer;speak: none}.facet .jstree-default .jstree-open > .jstree-ocl:before{content: "\f0d7"}.facet .jstree-default .jstree-closed > .jstree-ocl:before{content: "\f0da"}.facet .jstree-default .jstree-leaf > .jstree-ocl:before{content: " "}.jstree-facet li span.main{display: block;padding-left: 1px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap}.jstree-facet .jstree-container-ul{padding: 0}.jstree-facet .jstree-container-ul > li.active,.jstree-facet .jstree-container-ul > li.active a.jstree-anchor{background-color: #265680;color: #fff}li.jstree-facet,li.jstree-node{list-style: none}li.jstree-facet .badge{cursor: text}li.jstree-facet ul{padding-left: 20px}.hierarchy-tree .jstree-ocl:before{float: left;width: 10px;padding: 0;margin-left: -10px;font-family: 'FontAwesome';font-style: normal;font-weight: normal;cursor: pointer;text-decoration: inherit;speak: none}.hierarchy-tree .jstree-open > .jstree-ocl:before{content: "\f0d7"}.hierarchy-tree .jstree-closed > .jstree-ocl:before{content: "\f0da"}.hierarchy-tree .jstree-leaf > .jstree-ocl:before{content: " "}.hierarchy-tree .jstree-icon{width: 16px;color: #000}.hierarchy-tree .jstree-anchor{padding: 2px 5px;white-space: nowrap}.hierarchy-tree .jstree-container-ul,.hierarchy-tree .jstree-children{padding-left: 16px}.hierarchy-tree .jstree-initial-node{display: none}.hierarchy-tree .jstree-clicked{color: #fff;background-color: #265680}.hierarchy-tree .jstree-clicked .jstree-icon{color: #fff}.offcanvas-overlay,.offcanvas-toggle{display: none}@media screen and (max-width: 767px){body.offcanvas{overflow-x: hidden}body.offcanvas .sidebar{position: fixed;height: 100%;top: 0;width: 75%;padding-left: 0;padding-right: 0;overflow-y: auto}body.offcanvas .sidebar h4{padding-left: 12px}body.offcanvas .sidebar .checkbox{margin-left: 32px}body.offcanvas .sidebar .list-group,body.offcanvas .sidebar .list-group-item{border-left: 0;border-right: 0;border-radius: 0 !important}body.offcanvas.active{overflow-y: hidden}body.offcanvas.offcanvas-left{padding-left: 15px}body.offcanvas.offcanvas-left .main{background: #FFF}body.offcanvas.offcanvas-left.active{margin-left: 75%;margin-right: -75%}body.offcanvas.offcanvas-left.active .sidebar{left: 0}body.offcanvas.offcanvas-left.active .offcanvas-overlay{right: -75%}body.offcanvas.offcanvas-left.active .offcanvas-toggle{left: 75%}body.offcanvas.offcanvas-left .sidebar{left: -75%}body.offcanvas.offcanvas-left .offcanvas-overlay{right: -100%}body.offcanvas.offcanvas-left .offcanvas-toggle{border-radius: 0 3px 3px 0;left: 0}body.offcanvas.offcanvas-right{padding-right: 15px}body.offcanvas.offcanvas-right .main > .container{background: #FFF}body.offcanvas.offcanvas-right.active{margin-left: -75%;margin-right: 75%}body.offcanvas.offcanvas-right.active .sidebar{right: 0}body.offcanvas.offcanvas-right.active .offcanvas-overlay{left: -75%}body.offcanvas.offcanvas-right.active .offcanvas-toggle{right: 75%}body.offcanvas.offcanvas-right .sidebar{right: -75%}body.offcanvas.offcanvas-right .offcanvas-overlay{left: -100%}body.offcanvas.offcanvas-right .offcanvas-toggle{border-radius: 3px 0 0 3px;right: 0}body.offcanvas .offcanvas-overlay{display: block;position: fixed;top: 0;width: 100%;height: 100%;background-color: rgba(0,0,0,0.3);z-index: 3}body.offcanvas .offcanvas-toggle{display: block;position: fixed;top: 50%;width: calc(25px);padding: 20px 0;background: #265680;color: #EEE;text-align: center;z-index: 5}body.offcanvas .offcanvas-overlay,body.offcanvas .offcanvas-toggle,body.offcanvas .offcanvas-toggle *{cursor: pointer}body.offcanvas,body.offcanvas .sidebar,body.offcanvas .offcanvas-overlay,body.offcanvas .offcanvas-toggle{-webkit-transition: all .25s ease-out;-o-transition: all .25s ease-out;transition: all .25s ease-out}}
\ No newline at end of file
diff --git a/themes/bootstrap3/js/advanced_search.js b/themes/bootstrap3/js/advanced_search.js
index f28910422527a823f14ea3e07be560a4735aad2f..aa9e6a4aaaf344399f36729e666190e47ce39e86 100644
--- a/themes/bootstrap3/js/advanced_search.js
+++ b/themes/bootstrap3/js/advanced_search.js
@@ -13,7 +13,9 @@ function addSearch(group, fieldValues)
   $newSearch.attr('id', 'search'+inputID);
   $newSearch.find('input.form-control')
     .attr('id', 'search_lookfor'+inputID)
-    .attr('name', 'lookfor'+group+'[]');
+    .attr('name', 'lookfor'+group+'[]')
+    .attr('value', '');
+  $newSearch.find('select.type option:first-child').attr('selected', 1);
   $newSearch.find('select.type')
     .attr('id', 'search_type'+inputID)
     .attr('name', 'type'+group+'[]');
@@ -143,4 +145,4 @@ $(document).ready(function() {
     $("option:selected").removeAttr("selected");
     $("#illustrated_-1").click();
   });
-});
\ No newline at end of file
+});
diff --git a/themes/bootstrap3/js/autocomplete.js b/themes/bootstrap3/js/autocomplete.js
new file mode 100644
index 0000000000000000000000000000000000000000..5fd98e262be3198d8b3a3b95a127d0345c466fbb
--- /dev/null
+++ b/themes/bootstrap3/js/autocomplete.js
@@ -0,0 +1,295 @@
+/**
+ * vufind.typeahead.js 0.8
+ * ~ @crhallberg
+ */
+(function ( $ ) {
+
+  $.fn.autocomplete = function(settings) {
+
+    var options = $.extend( {}, $.fn.autocomplete.options, settings );
+
+    function show() {
+      $.fn.autocomplete.element.removeClass(options.hidingClass);
+    }
+    function hide() {
+      $.fn.autocomplete.element.addClass(options.hidingClass);
+    }
+
+    function populate(value, input, eventType) {
+      input.val(value);
+      hide();
+      input.trigger('autocomplete:select', {value: value, eventType: eventType});
+    }
+
+    function createList(data, input) {
+      var shell = $('<div/>');
+      var length = Math.min(options.maxResults, data.length);
+      input.data('length', length);
+      for (var i=0; i<length; i++) {
+        if (typeof data[i] === 'string') {
+          data[i] = {val: data[i]};
+        }
+        var content = data[i].val;
+        if (options.highlight) {
+          // escape term for regex
+          // https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js
+          var escapedTerm = input.val().replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
+          var regex = new RegExp('('+escapedTerm+')', 'ig');
+          content = content.replace(regex, '<b>$1</b>');
+        }
+        var item = typeof data[i].href === 'undefined'
+          ? $('<div/>')
+          : $('<a/>').attr('href', data[i].href);
+        item.attr('data-index', i+0)
+            .attr('data-value', data[i].val)
+            .addClass('item')
+            .html(content)
+            .mouseover(function() {
+              $.fn.autocomplete.element.find('.item.selected').removeClass('selected');
+              $(this).addClass('selected');
+              input.data('selected', this.dataset.index);
+            });
+        if (typeof data[i].description !== 'undefined') {
+          item.append($('<small/>').text(data[i].description));
+        }
+        shell.append(item);
+      }
+      $.fn.autocomplete.element.html(shell);
+      $.fn.autocomplete.element.find('.item').mousedown(function() {
+        populate($(this).attr('data-value'), input, {mouse: true});
+      });
+      align(input, $.fn.autocomplete.element);
+    }
+
+    function search(input, element) {
+      if (xhr) xhr.abort();
+      if (input.val().length >= options.minLength) {
+        element.html('<i class="item loading">'+options.loadingString+'</i>');
+        show();
+        align(input, $.fn.autocomplete.element);
+        var term = input.val();
+        var cid = input.data('cache-id');
+        if (options.cache && typeof $.fn.autocomplete.cache[cid][term] !== "undefined") {
+          if ($.fn.autocomplete.cache[cid][term].length === 0) {
+            hide();
+          } else {
+            createList($.fn.autocomplete.cache[cid][term], input, element);
+          }
+        } else if (typeof options.handler !== "undefined") {
+          options.handler(input.val(), function(data) {
+            $.fn.autocomplete.cache[cid][term] = data;
+            if (data.length === 0) {
+              hide();
+            } else {
+              createList(data, input, element);
+            }
+          });
+        } else {
+          console.error('handler function not provided for autocomplete');
+        }
+        input.data('selected', -1);
+      } else {
+        hide();
+      }
+    }
+
+    function align(input, element) {
+      var offset = input[0].getBoundingClientRect();
+      element.css({
+        position: 'absolute',
+        top: offset.top + offset.height + document.body.scrollTop,
+        left: offset.left,
+        minWidth: offset.width,
+        maxWidth: input.closest('form').width(),
+        zIndex: 50
+      });
+    }
+
+    function setup(input, element) {
+      if (typeof element === 'undefined') {
+        element = $('<div/>')
+          .addClass('autocomplete-results hidden')
+          .html('<i class="item loading">'+options.loadingString+'</i>');
+        align(input, element);
+        $('body').append(element);
+        $(window).resize(function() {
+          align(input, element);
+        });
+      }
+
+      input.data('selected', -1);
+      input.data('length', 0);
+
+      if (options.cache) {
+        var cid = Math.floor(Math.random()*1000);
+        input.data('cache-id', cid);
+        $.fn.autocomplete.cache[cid] = {};
+      }
+
+      input.blur(function(e) {
+        if (e.target.acitem) {
+          setTimeout(hide, 10);
+        } else {
+          hide();
+        }
+      });
+      input.click(function() {
+        search(input, element);
+      });
+      input.focus(function() {
+        search(input, element);
+      });
+      input.keyup(function(event) {
+        // Ignore navigation keys
+        // - Ignore control functions
+        if (event.ctrlKey) {
+          return;
+        }
+        // - Function keys (F1 - F15)
+        if (112 <= event.which && event.which <= 126) {
+          return;
+        }
+        switch (event.which) {
+          case 9:    // tab
+          case 13:   // enter
+          case 16:   // shift
+          case 20:   // caps lock
+          case 27:   // esc
+          case 33:   // page up
+          case 34:   // page down
+          case 35:   // end
+          case 36:   // home
+          case 37:   // arrows
+          case 38:
+          case 39:
+          case 40:
+          case 45:   // insert
+          case 144:  // num lock
+          case 145:  // scroll lock
+          case 19: { // pause/break
+            return;
+          }
+          default: {
+            search(input, element);
+          }
+        }
+      });
+      input.keydown(function(event) {
+        var element = $.fn.autocomplete.element;
+        var position = $(this).data('selected');
+        switch (event.which) {
+          // arrow keys through items
+          case 38: {
+            event.preventDefault();
+            element.find('.item.selected').removeClass('selected');
+            if (position > 0) {
+              position--;
+              element.find('.item:eq('+position+')').addClass('selected');
+              $(this).data('selected', position);
+            } else {
+              $(this).data('selected', -1);
+            }
+            break;
+          }
+          case 40: {
+            event.preventDefault();
+            if ($.fn.autocomplete.element.hasClass(options.hidingClass)) {
+              search(input, element);
+            } else if (position < input.data('length')-1) {
+              position++;
+              element.find('.item.selected').removeClass('selected');
+              element.find('.item:eq('+position+')').addClass('selected');
+              $(this).data('selected', position);
+            }
+            break;
+          }
+          // enter to nav or populate
+          case 9:
+          case 13: {
+            var selected = element.find('.item.selected');
+            if (selected.length > 0) {
+              event.preventDefault();
+              if (event.which === 13 && selected.attr('href')) {
+                location.assign(selected.attr('href'));
+              } else {
+                populate(selected.attr('data-value'), $(this), element, {key: true});
+                element.find('.item.selected').removeClass('selected');
+                $(this).data('selected', -1);
+              }
+            }
+            break;
+          }
+          // hide on escape
+          case 27: {
+            hide();
+            $(this).data('selected', -1);
+            break;
+          }
+        }
+      });
+
+      if (
+        typeof options.data    === "undefined" &&
+        typeof options.handler === "undefined" &&
+        typeof options.preload === "undefined" &&
+        typeof options.remote  === "undefined"
+      ) {
+        return input;
+      }
+
+      return element;
+    }
+
+    return this.each(function() {
+
+      var input = $(this);
+
+      if (typeof settings === "string") {
+        if (settings === "show") {
+          show();
+          align(input, $.fn.autocomplete.element);
+        } else if (settings === "hide") {
+          hide();
+        } else if (settings === "clear cache" && options.cache) {
+          var cid = parseInt(input.data('cache-id'));
+          $.fn.autocomplete.cache[cid] = {};
+        }
+        return input;
+      } else {
+        if (!$.fn.autocomplete.element) {
+          $.fn.autocomplete.element = setup(input);
+        } else {
+          setup(input, $.fn.autocomplete.element);
+        }
+      }
+
+      return input;
+
+    });
+  };
+
+  var xhr = false;
+  var timer = false;
+  if (typeof $.fn.autocomplete.cache === 'undefined') {
+    $.fn.autocomplete.cache = {};
+    $.fn.autocomplete.element = false;
+    $.fn.autocomplete.options = {
+      ajaxDelay: 200,
+      cache: true,
+      hidingClass: 'hidden',
+      highlight: true,
+      loadingString: 'Loading...',
+      maxResults: 20,
+      minLength: 3
+    };
+    $.fn.autocomplete.ajax = function(ops) {
+      if (timer) clearTimeout(timer);
+      if (xhr) xhr.abort();
+      timer = setTimeout(
+        function() { xhr = $.ajax(ops); },
+        $.fn.autocomplete.options.ajaxDelay
+      );
+    }
+  }
+
+}( jQuery ));
diff --git a/themes/bootstrap3/js/cart.js b/themes/bootstrap3/js/cart.js
index 1a32b0adff5504c1b7ec4974f26dc529574d7a6e..4ae751100082ebf9ca4766aa4af799ea57900eb7 100644
--- a/themes/bootstrap3/js/cart.js
+++ b/themes/bootstrap3/js/cart.js
@@ -1,4 +1,4 @@
-/*global bulkActionSubmit, cartCookieDomain, Cookies, newAccountHandler, path, vufindString, Lightbox, updatePageForLogin */
+/*global bulkActionSubmit, cartCookieDomain, Cookies, newAccountHandler, Lightbox, refreshPageForLogin, VuFind */
 
 var _CART_COOKIE = 'vufind_cart';
 var _CART_COOKIE_SOURCES = 'vufind_cart_src';
@@ -36,7 +36,7 @@ function getFullCartItems() {
 
 function addItemToCart(id,source) {
   if(!source) {
-    source = 'VuFind';
+    source = VuFind.getDefaultSearchBackend();
   }
   var cartItems = getCartItems();
   var cartSources = getCartSources();
@@ -131,17 +131,17 @@ function registerUpdateCart($form) {
         });
         var updated = getFullCartItems();
         var added = updated.length - orig.length;
-        msg += added + " " + vufindString.itemsAddBag;
+        msg += added + " " + VuFind.translate('itemsAddBag');
         if (inCart > 0 && orig.length > 0) {
-          msg += "<br/>" + inCart + " " + vufindString.itemsInBag;
+          msg += "<br/>" + inCart + " " + VuFind.translate('itemsInBag');
         }
-        if (updated.length >= vufindString.bookbagMax) {
-          msg += "<br/>" + vufindString.bookbagFull;
+        if (updated.length >= VuFind.translate('bookbagMax')) {
+          msg += "<br/>" + VuFind.translate('bookbagFull');
         }
         $('#'+elId).data('bs.popover').options.content = msg;
         $('#cartItems strong').html(updated.length);
       } else {
-        $('#'+elId).data('bs.popover').options.content = vufindString.bulk_noitems_advice;
+        $('#'+elId).data('bs.popover').options.content = VuFind.translate('bulk_noitems_advice');
       }
       $('#'+elId).popover('show');
       if (cartNotificationTimeout !== false) {
@@ -157,19 +157,22 @@ function registerUpdateCart($form) {
 
 $(document).ready(function() {
   // Record buttons
-  var cartId = $('#cartId');
-  if(cartId.length > 0) {
-    cartId = cartId.val().split('|');
-    currentId = cartId[1];
-    currentSource = cartId[0];
-    $('#cart-add.correct,#cart-remove.correct').removeClass('correct hidden');
-    $('#cart-add').click(function() {
-      addItemToCart(currentId,currentSource);
-      $('#cart-add,#cart-remove').toggleClass('hidden');
-    });
-    $('#cart-remove').click(function() {
-      removeItemFromCart(currentId,currentSource);
-      $('#cart-add,#cart-remove').toggleClass('hidden');
+  var $cartId = $('.cartId');
+  if($cartId.length > 0) {
+    $cartId.each(function() {
+      var cartId = this.value.split('|');
+      currentId = cartId[1];
+      currentSource = cartId[0];
+      var $parent = $(this).parent();
+      $parent.find('.cart-add.correct,.cart-remove.correct').removeClass('correct hidden');
+      $parent.find('.cart-add').click(function() {
+        addItemToCart(currentId,currentSource);
+        $parent.find('.cart-add,.cart-remove').toggleClass('hidden');
+      });
+      $parent.find('.cart-remove').click(function() {
+        removeItemFromCart(currentId,currentSource);
+        $parent.find('.cart-add,.cart-remove').toggleClass('hidden');
+      });
     });
   } else {
     // Search results
@@ -185,7 +188,7 @@ $(document).ready(function() {
   });
   // Overwrite
   Lightbox.addFormCallback('accountForm', function(html) {
-    updatePageForLogin();
+    Lightbox.addCloseAction(refreshPageForLogin);
     if (lastCartSubmit !== false) {
       bulkActionSubmit(lastCartSubmit);
       lastCartSubmit = false;
@@ -199,7 +202,7 @@ $(document).ready(function() {
     return false;
   });
   Lightbox.addFormCallback('bulkEmail', function(html) {
-    Lightbox.confirm(vufindString['bulk_email_success']);
+    Lightbox.confirm(VuFind.translate('bulk_email_success'));
   });
   $('#modal').on('hidden.bs.modal', function() {
     // Update cart items (add to cart, remove from cart, cart lightbox interface)
diff --git a/themes/bootstrap3/js/check_item_statuses.js b/themes/bootstrap3/js/check_item_statuses.js
index 2c79147047b48fb7c97d0b2f849c27881bf8eb55..62d213f58ea1f293d2545484ab1258f6909feca0 100644
--- a/themes/bootstrap3/js/check_item_statuses.js
+++ b/themes/bootstrap3/js/check_item_statuses.js
@@ -1,4 +1,4 @@
-/*global path*/
+/*global VuFind */
 
 function checkItemStatuses() {
   var id = $.map($('.ajaxItem'), function(i) {
@@ -11,7 +11,7 @@ function checkItemStatuses() {
   $(".ajax-availability").removeClass('hidden');
   $.ajax({
     dataType: 'json',
-    url: path + '/AJAX/JSON?method=getItemStatuses',
+    url: VuFind.getPath() + '/AJAX/JSON?method=getItemStatuses',
     data: {id:id},
     success: function(response) {
       if(response.status == 'OK') {
diff --git a/themes/bootstrap3/js/check_save_statuses.js b/themes/bootstrap3/js/check_save_statuses.js
index 9ddc276ffe2a4a58008a97010640ffc96c9e5dcb..12dac954b81428fb3682db9f26c301ea8c160756 100644
--- a/themes/bootstrap3/js/check_save_statuses.js
+++ b/themes/bootstrap3/js/check_save_statuses.js
@@ -1,4 +1,4 @@
-/*global path*/
+/*global VuFind */
 
 function checkSaveStatuses() {
   var data = $.map($('.result,.record'), function(i) {
@@ -16,7 +16,7 @@ function checkSaveStatuses() {
     }
     $.ajax({
       dataType: 'json',
-      url: path + '/AJAX/JSON?method=getSaveStatuses',
+      url: VuFind.getPath() + '/AJAX/JSON?method=getSaveStatuses',
       data: {id:ids, 'source':srcs},
       success: function(response) {
         if(response.status == 'OK') {
@@ -24,14 +24,14 @@ function checkSaveStatuses() {
           $.each(response.data, function(i, result) {
             var $container = $('#result'+result.record_number).find('.savedLists');
             if ($container.length == 0) { // Record view
-              $container = $('#savedLists');
+              $container = $('.savedLists');
             }
             var $ul = $container.children('ul:first');
             if ($ul.length == 0) {
               $container.append('<ul></ul>');
               $ul = $container.children('ul:first');
             }
-            var html = '<li><a href="' + path + '/MyResearch/MyList/' + result.list_id + '">'
+            var html = '<li><a href="' + VuFind.getPath() + '/MyResearch/MyList/' + result.list_id + '">'
                      + result.list_title + '</a></li>';
             $ul.append(html);
             $container.removeClass('hidden');
@@ -42,6 +42,4 @@ function checkSaveStatuses() {
   }
 }
 
-$(document).ready(function() {
-  checkSaveStatuses();
-});
+$(document).ready(checkSaveStatuses);
diff --git a/themes/bootstrap3/js/common.js b/themes/bootstrap3/js/common.js
index d841688d6c45e5b9e0fde29a8f562f41178ab15c..ae597c91b790e4817c91032aeb7349c71ea8630e 100644
--- a/themes/bootstrap3/js/common.js
+++ b/themes/bootstrap3/js/common.js
@@ -1,7 +1,23 @@
-/*global ajaxLoadTab, btoa, checkSaveStatuses, console, extractSource, hexEncode, isPhoneNumberValid, Lightbox, path, rc4Encrypt, refreshCommentList, refreshTagList, unescape, vufindString */
+/*global btoa, console, hexEncode, isPhoneNumberValid, Lightbox, rc4Encrypt, unescape, VuFind */
+
+function VuFindNamespace(p, s, dsb) {
+  var defaultSearchBackend = dsb;
+  var path = p;
+  var strings = s;
+
+  var getDefaultSearchBackend = function() { return defaultSearchBackend; };
+  var getPath = function() { return path; };
+  var translate = function(op) { return strings[op] || op; };
+
+  return {
+    getDefaultSearchBackend: getDefaultSearchBackend,
+    getPath: getPath,
+    translate: translate
+  };
+}
 
 /* --- GLOBAL FUNCTIONS --- */
-function htmlEncode(value){
+function htmlEncode(value) {
   if (value) {
     return jQuery('<div />').text(value).html();
   } else {
@@ -23,31 +39,6 @@ function extractClassParams(str) {
   }
   return params;
 }
-function jqEscape(myid) {
-  return String(myid).replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g, "\\$&");
-}
-function html_entity_decode(string, quote_style)
-{
-  var hash_map = {},
-    symbol = '',
-    tmp_str = '',
-    entity = '';
-  tmp_str = string.toString();
-
-  delete(hash_map['&']);
-  hash_map['&'] = '&amp;';
-  hash_map['>'] = '&gt;';
-  hash_map['<'] = '&lt;';
-
-  for (symbol in hash_map) {
-    entity = hash_map[symbol];
-    tmp_str = tmp_str.split(entity).join(symbol);
-  }
-  tmp_str = tmp_str.split('&#039;').join("'");
-
-  return tmp_str;
-}
-
 // Turn GET string into array
 function deparam(url) {
   if(!url.match(/\?|&/)) {
@@ -85,21 +76,15 @@ function lessFacets(id) {
 }
 
 // Phone number validation
-var libphoneTranslateCodes = ["libphonenumber_invalid", "libphonenumber_invalidcountry", "libphonenumber_invalidregion", "libphonenumber_notanumber", "libphonenumber_toolong", "libphonenumber_tooshort", "libphonenumber_tooshortidd"];
-var libphoneErrorStrings = ["Phone number invalid", "Invalid country calling code", "Invalid region code", "The string supplied did not seem to be a phone number", "The string supplied is too long to be a phone number", "The string supplied is too short to be a phone number", "Phone number too short after IDD"];
 function phoneNumberFormHandler(numID, regionCode) {
   var phoneInput = document.getElementById(numID);
   var number = phoneInput.value;
   var valid = isPhoneNumberValid(number, regionCode);
   if(valid != true) {
     if(typeof valid === 'string') {
-      for(var i=libphoneErrorStrings.length;i--;) {
-        if(valid.match(libphoneErrorStrings[i])) {
-          valid = vufindString[libphoneTranslateCodes[i]];
-        }
-      }
+      valid = VuFind.translate(valid);
     } else {
-      valid = vufindString['libphonenumber_invalid'];
+      valid = VuFind.translate('libphonenumber_invalid');
     }
     $(phoneInput).siblings('.help-block.with-errors').html(valid);
     $(phoneInput).closest('.form-group').addClass('sms-error');
@@ -107,7 +92,6 @@ function phoneNumberFormHandler(numID, regionCode) {
     $(phoneInput).closest('.form-group').removeClass('sms-error');
     $(phoneInput).siblings('.help-block.with-errors').html('');
   }
-  return valid == true;
 }
 
 // Lightbox
@@ -122,12 +106,12 @@ function bulkActionSubmit($form) {
   var submit = button.attr('name');
   var checks = $form.find('input.checkbox-select-item:checked');
   if(checks.length == 0 && submit != 'empty') {
-    Lightbox.displayError(vufindString['bulk_noitems_advice']);
+    Lightbox.displayError(VuFind.translate('bulk_noitems_advice'));
     return false;
   }
   if (submit == 'print') {
     //redirect page
-    var url = path+'/Records/Home?print=true';
+    var url = VuFind.getPath() + '/Records/Home?print=true';
     for(var i=0;i<checks.length;i++) {
       url += '&id[]='+checks[i].value;
     }
@@ -139,6 +123,7 @@ function bulkActionSubmit($form) {
   }
   return false;
 }
+
 function registerLightboxEvents() {
   var modal = $("#modal");
   // New list
@@ -188,60 +173,27 @@ function registerLightboxEvents() {
     }
   });
 }
-function updatePageForLogin() {
-  // Hide "log in" options and show "log out" options:
-  $('#loginOptions').addClass('hidden');
-  $('.logoutOptions').removeClass('hidden');
-
-  var recordId = $('#record_id').val();
 
-  // Update user save statuses if the current context calls for it:
-  if (typeof(checkSaveStatuses) == 'function') {
-    checkSaveStatuses();
-  }
-
-  // refresh the comment list so the "Delete" links will show
-  $('.commentList').each(function(){
-    var recordSource = extractSource($('#record'));
-    refreshCommentList(recordId, recordSource);
-  });
-
-  var summon = false;
-  $('.hiddenSource').each(function(i, e) {
-    if(e.value == 'Summon') {
-      summon = true;
-      // If summon, queue reload for when we close
-      Lightbox.addCloseAction(function(){document.location.reload(true);});
-    }
-  });
-
-  // Refresh tab content
-  var recordTabs = $('.recordTabs');
-  if(!summon && recordTabs.length > 0) { // If summon, skip: about to reload anyway
-    var tab = recordTabs.find('.active a').attr('id');
-    ajaxLoadTab(tab);
-  }
-
-  // Refresh tag list
-  if(typeof refreshTagList === "function") {
-    refreshTagList(true);
-  }
+function refreshPageForLogin() {
+  window.location.reload();
 }
+
 function newAccountHandler(html) {
-  updatePageForLogin();
+  Lightbox.addCloseAction(refreshPageForLogin);
   var params = deparam(Lightbox.openingURL);
-  if (params['subaction'] != 'UserLogin') {
+  if (params['subaction'] == 'UserLogin') {
+    Lightbox.close();
+  } else {
     Lightbox.getByUrl(Lightbox.openingURL);
     Lightbox.openingURL = false;
-  } else {
-    Lightbox.close();
   }
+  return false;
 }
 
 // This is a full handler for the login form
 function ajaxLogin(form) {
   Lightbox.ajax({
-    url: path + '/AJAX/JSON?method=getSalt',
+    url: VuFind.getPath() + '/AJAX/JSON?method=getSalt',
     dataType: 'json',
     success: function(response) {
       if (response.status == 'OK') {
@@ -267,12 +219,12 @@ function ajaxLogin(form) {
         // login via ajax
         Lightbox.ajax({
           type: 'POST',
-          url: path + '/AJAX/JSON?method=login',
+          url: VuFind.getPath() + '/AJAX/JSON?method=login',
           dataType: 'json',
           data: params,
           success: function(response) {
             if (response.status == 'OK') {
-              updatePageForLogin();
+              Lightbox.addCloseAction(refreshPageForLogin);
               // and we update the modal
               var params = deparam(Lightbox.lastURL);
               if (params['subaction'] == 'UserLogin') {
@@ -296,8 +248,8 @@ function ajaxLogin(form) {
   });
 }
 
-$(document).ready(function() {
-  // Off canvas
+// Ready functions
+function setupOffcanvas() {
   if($('.sidebar').length > 0) {
     $('[data-toggle="offcanvas"]').click(function () {
       $('body.offcanvas').toggleClass('active');
@@ -313,10 +265,9 @@ $(document).ready(function() {
   } else {
     $('[data-toggle="offcanvas"]').addClass('hidden');
   }
+}
 
-  // support "jump menu" dropdown boxes
-  $('select.jumpMenu').change(function(){ $(this).parent('form').submit(); });
-
+function setupBacklinks() {
   // Highlight previous links, grey out following
   $('.backlink')
     .mouseover(function() {
@@ -347,47 +298,102 @@ $(document).ready(function() {
         t = t.next();
       } while(t.length > 0);
     });
+}
 
+function setupAutocomplete() {
   // Search autocomplete
-  $('.autocomplete').each(function (i, element) {
-    $(element).typeahead(
-      {
-        highlight: true,
-        minLength: 3
-      }, {
-        displayKey:'val',
-        source: function(query, cb) {
-          var searcher = extractClassParams(element);
-          $.ajax({
-            url: path + '/AJAX/JSON',
-            data: {
-              q:query,
-              method:'getACSuggestions',
-              searcher:searcher['searcher'],
-              type:searcher['type'] ? searcher['type'] : $(element).closest('.searchForm').find('.searchForm_type').val()
-            },
-            dataType:'json',
-            success: function(json) {
-              if (json.status == 'OK' && json.data.length > 0) {
-                var datums = [];
-                for (var i=0;i<json.data.length;i++) {
-                  datums.push({val:json.data[i]});
-                }
-                cb(datums);
-              } else {
-                cb([]);
+  $('.autocomplete').each(function(i, op) {
+    $(op).autocomplete({
+      maxResults: 10,
+      loadingString: VuFind.translate('loading')+'...',
+      handler: function(query, cb) {
+        var searcher = extractClassParams(op);
+        $.fn.autocomplete.ajax({
+          url: VuFind.getPath() + '/AJAX/JSON',
+          data: {
+            q:query,
+            method:'getACSuggestions',
+            searcher:searcher['searcher'],
+            type:searcher['type'] ? searcher['type'] : $(op).closest('.searchForm').find('.searchForm_type').val()
+          },
+          dataType:'json',
+          success: function(json) {
+            if (json.status == 'OK' && json.data.length > 0) {
+              var datums = [];
+              for (var i=0;i<json.data.length;i++) {
+                datums.push(json.data[i]);
               }
+              cb(datums);
+            } else {
+              cb([]);
             }
-          });
-        }
+          }
+        });
       }
-    );
+    });
   });
+  // Update autocomplete on type change
   $('.searchForm_type').change(function() {
     var $lookfor = $(this).closest('.searchForm').find('.searchForm_lookfor[name]');
-    var query = $lookfor.val();
-    $lookfor.focus().typeahead('val', '').typeahead('val', query);
+    $lookfor.autocomplete('clear cache');
+    $lookfor.focus();
   });
+}
+
+/**
+ * Handle arrow keys to jump to next record
+ * @returns {undefined}
+ */
+function keyboardShortcuts() {
+    var $searchform = $('#searchForm_lookfor');
+    if ($('.pager').length > 0) {
+        $(window).keydown(function(e) {
+          if (!$searchform.is(':focus')) {
+            var $target = null;
+            switch (e.keyCode) {
+              case 37: // left arrow key
+                $target = $('.pager').find('a.previous');
+                if ($target.length > 0) {
+                    $target[0].click();
+                    return;
+                }
+                break;
+              case 38: // up arrow key
+                if (e.ctrlKey) {
+                    $target = $('.pager').find('a.backtosearch');
+                    if ($target.length > 0) {
+                        $target[0].click();
+                        return;
+                    }
+                }
+                break;
+              case 39: //right arrow key
+                $target = $('.pager').find('a.next');
+                if ($target.length > 0) {
+                    $target[0].click();
+                    return;
+                }
+                break;
+              case 40: // down arrow key
+                break;
+            }
+          }
+        });
+    }
+}
+
+$(document).ready(function() {
+  // Setup search autocomplete
+  setupAutocomplete();
+  // Setup highlighting of backlinks
+  setupBacklinks() ;
+  // Off canvas
+  setupOffcanvas();
+  // Keyboard shortcuts in detail view
+  keyboardShortcuts();
+
+  // support "jump menu" dropdown boxes
+  $('select.jumpMenu').change(function(){ $(this).parent('form').submit(); });
 
   // Checkbox select all
   $('.checkbox-select-all').change(function() {
@@ -400,21 +406,18 @@ $(document).ready(function() {
   // handle QR code links
   $('a.qrcodeLink').click(function() {
     if ($(this).hasClass("active")) {
-      $(this).html(vufindString.qrcode_show).removeClass("active");
+      $(this).html(VuFind.translate('qrcode_show')).removeClass("active");
     } else {
-      $(this).html(vufindString.qrcode_hide).addClass("active");
+      $(this).html(VuFind.translate('qrcode_hide')).addClass("active");
     }
 
     var holder = $(this).next('.qrcode');
-
     if (holder.find('img').length == 0) {
       // We need to insert the QRCode image
       var template = holder.find('.qrCodeImgTag').html();
       holder.html(template);
     }
-
     holder.toggleClass('hidden');
-
     return false;
   });
 
@@ -426,12 +429,12 @@ $(document).ready(function() {
       window.print();
     });
     // Make an ajax call to ensure that ajaxStop is triggered
-    $.getJSON(path + '/AJAX/JSON', {method: 'keepAlive'});
+    $.getJSON(VuFind.getPath() + '/AJAX/JSON', {method: 'keepAlive'});
   }
 
   // Advanced facets
   $('.facetOR').click(function() {
-    $(this).closest('.collapse').html('<div class="list-group-item">'+vufindString.loading+'...</div>');
+    $(this).closest('.collapse').html('<div class="list-group-item">'+VuFind.translate('loading')+'...</div>');
     window.location.assign($(this).attr('href'));
   });
 
@@ -446,104 +449,4 @@ $(document).ready(function() {
     // Add useful information
     $(this).attr("clicked", "true");
   });
-
-  /******************************
-   * LIGHTBOX DEFAULT BEHAVIOUR *
-   ******************************/
-  Lightbox.addOpenAction(registerLightboxEvents);
-
-  Lightbox.addFormCallback('newList', Lightbox.changeContent);
-  Lightbox.addFormCallback('accountForm', newAccountHandler);
-  Lightbox.addFormCallback('bulkDelete', function(html) {
-    location.reload();
-  });
-  Lightbox.addFormCallback('bulkSave', function(html) {
-    Lightbox.addCloseAction(updatePageForLogin);
-    Lightbox.confirm(vufindString['bulk_save_success']);
-  });
-  Lightbox.addFormCallback('bulkRecord', function(html) {
-    Lightbox.close();
-    checkSaveStatuses();
-  });
-  Lightbox.addFormCallback('emailSearch', function(html) {
-    Lightbox.confirm(vufindString['bulk_email_success']);
-  });
-  Lightbox.addFormCallback('saveRecord', function(html) {
-    Lightbox.close();
-    checkSaveStatuses();
-  });
-
-  Lightbox.addFormHandler('exportForm', function(evt) {
-    $.ajax({
-      url: path + '/AJAX/JSON?' + $.param({method:'exportFavorites'}),
-      type:'POST',
-      dataType:'json',
-      data:Lightbox.getFormData($(evt.target)),
-      success:function(data) {
-        if(data.data.export_type == 'download' || data.data.needs_redirect) {
-          document.location.href = data.data.result_url;
-          Lightbox.close();
-          return false;
-        } else {
-          Lightbox.changeContent(data.data.result_additional);
-        }
-      },
-      error:function(d,e) {
-        //console.log(d,e); // Error reporting
-      }
-    });
-    return false;
-  });
-  Lightbox.addFormHandler('feedback', function(evt) {
-    var $form = $(evt.target);
-    // Grabs hidden inputs
-    var formSuccess     = $form.find("input#formSuccess").val();
-    var feedbackFailure = $form.find("input#feedbackFailure").val();
-    var feedbackSuccess = $form.find("input#feedbackSuccess").val();
-    // validate and process form here
-    var name  = $form.find("input#name").val();
-    var email = $form.find("input#email").val();
-    var comments = $form.find("textarea#comments").val();
-    if (name.length == 0 || comments.length == 0) {
-      Lightbox.displayError(feedbackFailure);
-    } else {
-      Lightbox.get('Feedback', 'Email', {}, {'name':name,'email':email,'comments':comments}, function() {
-        Lightbox.changeContent('<div class="alert alert-info">'+formSuccess+'</div>');
-      });
-    }
-    return false;
-  });
-  Lightbox.addFormHandler('loginForm', function(evt) {
-    ajaxLogin(evt.target);
-    return false;
-  });
-
-  // Feedback
-  $('#feedbackLink').click(function() {
-    return Lightbox.get('Feedback', 'Home');
-  });
-  // Help links
-  $('.help-link').click(function() {
-    var split = this.href.split('=');
-    return Lightbox.get('Help','Home',{topic:split[1]});
-  });
-  // Hierarchy links
-  $('.hierarchyTreeLink a').click(function() {
-    var id = $(this).parent().parent().parent().find(".hiddenId")[0].value;
-    var hierarchyID = $(this).parent().find(".hiddenHierarchyId")[0].value;
-    return Lightbox.get('Record','AjaxTab',{id:id},{hierarchy:hierarchyID,tab:'HierarchyTree'});
-  });
-  // Login link
-  $('#loginOptions a.modal-link').click(function() {
-    return Lightbox.get('MyResearch','UserLogin');
-  });
-  // Email search link
-  $('.mailSearch').click(function() {
-    return Lightbox.get('Search','Email',{url:document.URL});
-  });
-  // Save record links
-  $('.save-record').click(function() {
-    var parts = this.href.split('/');
-    return Lightbox.get(parts[parts.length-3],'Save',{id:$(this).attr('id')});
-  });
 });
diff --git a/themes/bootstrap3/js/facets.js b/themes/bootstrap3/js/facets.js
index 852b5cb0a3e495e6b0648b4c78423652d48a3017..77461c61c55a3524471385a1053876f883562bc5 100644
--- a/themes/bootstrap3/js/facets.js
+++ b/themes/bootstrap3/js/facets.js
@@ -1,21 +1,21 @@
-/*global htmlEncode, path, vufindString */
+/*global htmlEncode, VuFind */
 function buildFacetNodes(data, currentPath, allowExclude, excludeTitle, counts)
 {
   var json = [];
-  
+
   $(data).each(function() {
     var html = '';
     if (!this.isApplied && counts) {
-      html = '<span class="badge" style="float: right">' + this.count.toString().replace(/\B(?=(\d{3})+\b)/g, vufindString.number_thousands_separator);
+      html = '<span class="badge" style="float: right">' + this.count.toString().replace(/\B(?=(\d{3})+\b)/g, VuFind.translate('number_thousands_separator'));
       if (allowExclude) {
         var excludeURL = currentPath + this.exclude;
         excludeURL.replace("'", "\\'");
         // Just to be safe
         html += ' <a href="' + excludeURL + '" onclick="document.location.href=\'' + excludeURL + '\'; return false;" title="' + htmlEncode(excludeTitle) + '"><i class="fa fa-times"></i></a>';
       }
-      html += '</span>'; 
+      html += '</span>';
     }
-    
+
     var url = currentPath + this.href;
     // Just to be safe
     url.replace("'", "\\'");
@@ -23,12 +23,12 @@ function buildFacetNodes(data, currentPath, allowExclude, excludeTitle, counts)
       + ' onclick="document.location.href=\'' + url + '\'; return false;">';
     if (this.operator == 'OR') {
       if (this.isApplied) {
-        html += '<i class="fa fa-check-square-o"></i>';  
+        html += '<i class="fa fa-check-square-o"></i>';
       } else {
-        html += '<i class="fa fa-square-o"></i>';  
+        html += '<i class="fa fa-square-o"></i>';
       }
     } else if (this.isApplied) {
-      html += '<i class="fa fa-check pull-right"></i>';  
+      html += '<i class="fa fa-check pull-right"></i>';
     }
     html += ' ' + this.displayText;
     html += '</span>';
@@ -47,7 +47,7 @@ function buildFacetNodes(data, currentPath, allowExclude, excludeTitle, counts)
       'li_attr': this.isApplied ? { 'class': 'active' } : {}
     });
   });
-  
+
   return json;
 }
 
@@ -58,7 +58,7 @@ function initFacetTree(treeNode, inSidebar)
     return;
   }
   treeNode.data('loaded', true);
-  
+
   var facet = treeNode.data('facet');
   var operator = treeNode.data('operator');
   var currentPath = treeNode.data('path');
@@ -70,14 +70,14 @@ function initFacetTree(treeNode, inSidebar)
   if (inSidebar) {
     treeNode.prepend('<li class="list-group-item"><i class="fa fa-spinner fa-spin"></i></li>');
   } else {
-    treeNode.prepend('<div><i class="fa fa-spinner fa-spin"></i><div>');  
+    treeNode.prepend('<div><i class="fa fa-spinner fa-spin"></i><div>');
   }
-  $.getJSON(path + '/AJAX/JSON?' + query,
+  $.getJSON(VuFind.getPath() + '/AJAX/JSON?' + query,
     {
       method: "getFacetData",
       facetName: facet,
       facetSort: sort,
-      facetOperator: operator 
+      facetOperator: operator
     },
     function(response, textStatus) {
       if (response.status == "OK") {
@@ -93,7 +93,7 @@ function initFacetTree(treeNode, inSidebar)
             'data': results
           }
         });
-      } 
+      }
     }
   );
 }
diff --git a/themes/bootstrap3/js/hierarchyTree.js b/themes/bootstrap3/js/hierarchyTree.js
index 4efe0af5f44f1852f21f2d75944df5756a650447..20b906b56c95dc7040214d6bb28f35aa770d368f 100644
--- a/themes/bootstrap3/js/hierarchyTree.js
+++ b/themes/bootstrap3/js/hierarchyTree.js
@@ -1,14 +1,32 @@
-
-/*global hierarchySettings, html_entity_decode, jqEscape, path, vufindString*/
-
+/*global hierarchySettings, VuFind */
 
 var hierarchyID, recordID, htmlID, hierarchyContext;
 var baseTreeSearchFullURL;
 
-function getRecord(recordID)
-{
+/* Utility functions */
+function htmlEncodeId(id) {
+  return id.replace(/\W/g, "-"); // Also change Hierarchy/TreeRenderer/JSTree.php
+}
+function html_entity_decode(string, quote_style) {
+  var hash_map = {
+    '&': '&amp;',
+    '>': '&gt;',
+    '<': '&lt;'
+  };
+  var tmp_str = string.toString();
+
+  for (var symbol in hash_map) {
+    var entity = hash_map[symbol];
+    tmp_str = tmp_str.split(entity).join(symbol);
+  }
+  tmp_str = tmp_str.split('&#039;').join("'");
+
+  return tmp_str;
+}
+
+function getRecord(recordID) {
   $.ajax({
-    url: path + '/Hierarchy/GetRecord?' + $.param({id: recordID}),
+    url: VuFind.getPath() + '/Hierarchy/GetRecord?' + $.param({id: recordID}),
     dataType: 'html',
     success: function(response) {
       if (response) {
@@ -24,8 +42,7 @@ function getRecord(recordID)
   });
 }
 
-function changeNoResultLabel(display)
-{
+function changeNoResultLabel(display) {
   if (display) {
     $("#treeSearchNoResults").removeClass('hidden');
   } else {
@@ -33,8 +50,7 @@ function changeNoResultLabel(display)
   }
 }
 
-function changeLimitReachedLabel(display)
-{
+function changeLimitReachedLabel(display) {
   if (display) {
     $("#treeSearchLimitReached").removeClass('hidden');
   } else {
@@ -42,14 +58,8 @@ function changeLimitReachedLabel(display)
   }
 }
 
-function htmlEncodeId(id)
-{
-  return id.replace(/\W/g, "-"); // Also change Hierarchy/TreeRenderer/JSTree.php
-}
-
 var searchAjax = false;
-function doTreeSearch()
-{
+function doTreeSearch() {
   $('#treeSearchLoadingImg').removeClass('hidden');
   var keyword = $("#treeSearchText").val();
   var type = $("#treeSearchType").val();
@@ -64,7 +74,7 @@ function doTreeSearch()
       searchAjax.abort();
     }
     searchAjax = $.ajax({
-      "url" : path + '/Hierarchy/SearchTree?' + $.param({
+      "url" : VuFind.getPath() + '/Hierarchy/SearchTree?' + $.param({
         'lookfor': keyword,
         'hierarchyID': hierarchyID,
         'type': $("#treeSearchType").val()
@@ -93,8 +103,7 @@ function doTreeSearch()
   }
 }
 
-function buildJSONNodes(xml)
-{
+function buildJSONNodes(xml) {
   var jsonNode = [];
   $(xml).children('item').each(function() {
     var content = $(this).children('content');
@@ -116,9 +125,9 @@ function buildJSONNodes(xml)
   });
   return jsonNode;
 }
-function buildTreeWithXml(cb)
-{
-  $.ajax({'url': path + '/Hierarchy/GetTree',
+
+function buildTreeWithXml(cb) {
+  $.ajax({'url': VuFind.getPath() + '/Hierarchy/GetTree',
     'data': {
       'hierarchyID': hierarchyID,
       'id': recordID,
@@ -132,19 +141,18 @@ function buildTreeWithXml(cb)
   });
 }
 
-$(document).ready(function()
-{
+$(document).ready(function() {
   // Code for the search button
   hierarchyID = $("#hierarchyTree").find(".hiddenHierarchyId")[0].value;
   recordID = $("#hierarchyTree").find(".hiddenRecordId")[0].value;
   htmlID = htmlEncodeId(recordID);
   hierarchyContext = $("#hierarchyTree").find(".hiddenContext")[0].value;
 
-  $("#hierarchyLoading").removeClass('hide');  
+  $("#hierarchyLoading").removeClass('hide');
 
   $("#hierarchyTree")
     .bind("ready.jstree", function (event, data) {
-      $("#hierarchyLoading").addClass('hide');  
+      $("#hierarchyLoading").addClass('hide');
       var tree = $("#hierarchyTree").jstree(true);
       tree.select_node(htmlID);
       tree._open_to(htmlID);
@@ -181,7 +189,7 @@ $(document).ready(function()
       'core' : {
         'data' : function (obj, cb) {
           $.ajax({
-            'url': path + '/Hierarchy/GetTreeJSON',
+            'url': VuFind.getPath() + '/Hierarchy/GetTreeJSON',
             'data': {
               'hierarchyID': hierarchyID,
               'id': recordID
@@ -218,4 +226,4 @@ $(document).ready(function()
       doTreeSearch();
     }
   });
-});
\ No newline at end of file
+});
diff --git a/themes/bootstrap3/js/hold.js b/themes/bootstrap3/js/hold.js
index 06555cc43ea3f69a3dc810d9c5ebafcd9145587c..4895a5ab3447543c44999d7cd34d1adfc5056a0e 100644
--- a/themes/bootstrap3/js/hold.js
+++ b/themes/bootstrap3/js/hold.js
@@ -1,4 +1,4 @@
-/*global path */
+/*global VuFind */
 function setUpHoldRequestForm(recordId) {
   $('#requestGroupId').change(function() {
     var $emptyOption = $("#pickUpLocation option[value='']");
@@ -11,13 +11,13 @@ function setUpHoldRequestForm(recordId) {
     var params = {
       method: 'getRequestGroupPickupLocations',
       id: recordId,
-      requestGroupId: $('#requestGroupId').val()              
+      requestGroupId: $('#requestGroupId').val()
     };
     $.ajax({
       data: params,
       dataType: 'json',
       cache: false,
-      url: path + '/AJAX/JSON',
+      url: VuFind.getPath() + '/AJAX/JSON',
       success: function(response) {
         if (response.status == 'OK') {
           var defaultValue = $('#pickUpLocation').data('default');
@@ -36,7 +36,7 @@ function setUpHoldRequestForm(recordId) {
         $('#pickUpLocationLabel i').removeClass("fa fa-spinner icon-spin");
         $('#pickUpLocation').removeAttr('disabled');
       }
-    });   
+    });
   });
   $('#requestGroupId').change();
 }
diff --git a/themes/bootstrap3/js/ill.js b/themes/bootstrap3/js/ill.js
index 3ae164aea782cea31a97d3e01d9413bee9da3293..e9033271d002878188f8cec5774cb8800d0e467d 100644
--- a/themes/bootstrap3/js/ill.js
+++ b/themes/bootstrap3/js/ill.js
@@ -1,30 +1,33 @@
-/*global path */
+/*global VuFind */
 function setUpILLRequestForm(recordId) {
-    $("#ILLRequestForm #pickupLibrary").change(function() {
-        $("#ILLRequestForm #pickupLibraryLocation option").remove();
-        $("#ILLRequestForm #pickupLibraryLocationLabel i").addClass("fa fa-spinner icon-spin");
-        var url = path + '/AJAX/JSON?' + $.param({method:'getLibraryPickupLocations', id: recordId, pickupLib: $("#ILLRequestForm #pickupLibrary").val() });
-        $.ajax({
-            dataType: 'json',
-            cache: false,
-            url: url,
-            success: function(response) {
-                if (response.status == 'OK') {
-                    $.each(response.data.locations, function() {
-                        var option = $("<option></option>").attr("value", this.id).text(this.name);
-                        if (this.isDefault) {
-                            option.attr("selected", "selected");
-                        }
-                        $("#ILLRequestForm #pickupLibraryLocation").append(option);
-                    });
-                }
-                $("#ILLRequestForm #pickupLibraryLocationLabel i").removeClass("fa fa-spinner icon-spin");
-            },
-            fail: function() {
-                $("#ILLRequestForm #pickupLibraryLocationLabel i").removeClass("fa fa-spinner icon-spin");
+  $("#ILLRequestForm #pickupLibrary").change(function() {
+    $("#ILLRequestForm #pickupLibraryLocation option").remove();
+    $("#ILLRequestForm #pickupLibraryLocationLabel i").addClass("fa fa-spinner icon-spin");
+    var url = VuFind.getPath() + '/AJAX/JSON?' + $.param({
+      id: recordId,
+      method:'getLibraryPickupLocations',
+      pickupLib: $("#ILLRequestForm #pickupLibrary").val()
+    });
+    $.ajax({
+      dataType: 'json',
+      cache: false,
+      url: url,
+      success: function(response) {
+        if (response.status == 'OK') {
+          $.each(response.data.locations, function() {
+            var option = $("<option></option>").attr("value", this.id).text(this.name);
+            if (this.isDefault) {
+              option.attr("selected", "selected");
             }
-        });   
-        
+            $("#ILLRequestForm #pickupLibraryLocation").append(option);
+          });
+        }
+        $("#ILLRequestForm #pickupLibraryLocationLabel i").removeClass("fa fa-spinner icon-spin");
+      },
+      fail: function() {
+        $("#ILLRequestForm #pickupLibraryLocationLabel i").removeClass("fa fa-spinner icon-spin");
+      }
     });
-    $("#ILLRequestForm #pickupLibrary").change();
+  });
+  $("#ILLRequestForm #pickupLibrary").change();
 }
diff --git a/themes/bootstrap3/js/keep_alive.js b/themes/bootstrap3/js/keep_alive.js
index 5556008d6762ef7d2ebe940bba359c7196057d1d..d0e45d79b4d8a6eb55a97ebba3b97c760de79639 100644
--- a/themes/bootstrap3/js/keep_alive.js
+++ b/themes/bootstrap3/js/keep_alive.js
@@ -1,7 +1,7 @@
-/*global path, keepAliveInterval */
+/*global keepAliveInterval, VuFind */
 
 $(document).ready(function() {
   window.setInterval(function() {
-    $.getJSON(path + '/AJAX/JSON', {method: 'keepAlive'});
+    $.getJSON(VuFind.getPath() + '/AJAX/JSON', {method: 'keepAlive'});
   }, keepAliveInterval * 1000);
 });
diff --git a/themes/bootstrap3/js/lightbox.js b/themes/bootstrap3/js/lightbox.js
index 2b25b1fbd3f8ae20d05cbd39852f7759b74a01d5..3085d266afd324b541be9ba10f7b1d650fd806a8 100644
--- a/themes/bootstrap3/js/lightbox.js
+++ b/themes/bootstrap3/js/lightbox.js
@@ -1,4 +1,4 @@
-/*global checkSaveStatuses, console, deparam, path, Recaptcha, vufindString */
+/*global ajaxLogin, checkSaveStatuses, console, deparam, newAccountHandler, Recaptcha, refreshPageForLogin, registerLightboxEvents, VuFind */
 
 var Lightbox = {
   /**
@@ -136,7 +136,7 @@ var Lightbox = {
     // Reset content so we start fresh when we open a lightbox
     $('#modal').removeData('modal');
     $('#modal').find('.modal-title').html('&nbsp;');
-    $('#modal').find('.modal-body').html(vufindString.loading + "...");
+    $('#modal').find('.modal-body').html(VuFind.translate('loading') + "...");
   },
   /**
    * Call all the functions we need for when the modal loads
@@ -152,7 +152,10 @@ var Lightbox = {
    * This function changes the content of the lightbox to a message with a close button
    */
   confirm: function(message) {
-    this.changeContent('<div class="alert alert-info">'+message+'</div><button class="btn btn-default" onClick="Lightbox.close()">'+vufindString['close']+'</button>');
+    this.changeContent('<div class="alert alert-info">'+message+'</div><button class="btn btn-default" onClick="Lightbox.close()">'+VuFind.translate('close')+'</button>');
+  },
+  success: function(message) {
+    this.changeContent('<div class="alert alert-success">'+message+'</div><button class="btn btn-default" onClick="Lightbox.close()">'+VuFind.translate('close')+'</button>');
   },
   /**
    * Regexes a piece of html to find an error alert
@@ -183,9 +186,9 @@ var Lightbox = {
     $('#modal .modal-body .alert').remove();
     var html = $.parseHTML($('#modal .modal-body').html());
      // Empty or alert only, change to message with button
-    if($('#modal .modal-body').html() == vufindString.loading+"..."
+    if($('#modal .modal-body').html() == VuFind.translate('loading') + "..."
       || (html.length == 1 && $(html).hasClass('alert-'+type))) {
-      Lightbox.changeContent('<div class="alert alert-'+type+'" role="alert">'+message+'</div><button class="btn btn-default" onClick="Lightbox.close()">'+vufindString['close']+'</button>');
+      Lightbox.changeContent('<div class="alert alert-'+type+'" role="alert">'+message+'</div><button class="btn btn-default" onClick="Lightbox.close()">'+VuFind.translate('close')+'</button>');
     // Page without alert
     } else {
       $('#modal .modal-body').prepend('<div class="alert alert-'+type+' alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button><p class="message">'+message+'</p></div>');
@@ -259,7 +262,7 @@ var Lightbox = {
    */
   get: function(controller, action, get, post, callback) {
     // Build URL
-    var url = path+'/AJAX/JSON?method=getLightbox&submodule='+controller+'&subaction='+action;
+    var url = VuFind.getPath()+'/AJAX/JSON?method=getLightbox&submodule='+controller+'&subaction='+action;
     if(typeof get !== "undefined" && get !== {}) {
       url += '&'+$.param(get);
     }
@@ -382,6 +385,7 @@ var Lightbox = {
     var POST = $form.attr('method') && $form.attr('method').toUpperCase() == 'POST';
     if($form.attr('action')) {
       // Parse action location
+      var path = VuFind.getPath();
       var action = $form.attr('action').substring($form.attr('action').indexOf(path)+path.length+1);
       var params = action.split('?');
       action = action.split('/');
@@ -397,7 +401,7 @@ var Lightbox = {
     } else {
       this.getByUrl(this.lastURL, {}, callback);
     }
-    $(this).find('.modal-body').html(vufindString.loading + "...");
+    $(this).find('.modal-body').html(VuFind.translate('loading') + "...");
   }
 };
 
@@ -426,4 +430,106 @@ $(document).ready(function() {
     $('#modal .modal-title').html(title);
     Lightbox.titleSet = true;
   });
+
+  /******************************
+   * LIGHTBOX DEFAULT BEHAVIOUR *
+   ******************************/
+  Lightbox.addOpenAction(registerLightboxEvents);
+
+  Lightbox.addFormCallback('newList', Lightbox.changeContent);
+  Lightbox.addFormCallback('accountForm', newAccountHandler);
+  Lightbox.addFormCallback('bulkDelete', function(html) {
+    location.reload();
+  });
+  Lightbox.addFormCallback('bulkSave', function(html) {
+    var listID = $('<div>'+html+'</div>').find('[name="listID"]');
+    var listUrl = VuFind.getPath() + '/MyResearch/MyList/'+listID.val();
+    Lightbox.addCloseAction(refreshPageForLogin);
+    Lightbox.success(VuFind.translate('bulk_save_success') + '. <a href="'+listUrl+'">' + VuFind.translate('go_to_list') + '</a>.');
+  });
+  Lightbox.addFormCallback('bulkRecord', function(html) {
+    Lightbox.close();
+    checkSaveStatuses();
+  });
+  Lightbox.addFormCallback('emailSearch', function(html) {
+    Lightbox.success(VuFind.translate('bulk_email_success'));
+  });
+  Lightbox.addFormCallback('saveRecord', function(html) {
+    Lightbox.close();
+    checkSaveStatuses();
+  });
+
+  Lightbox.addFormHandler('exportForm', function(evt) {
+    $.ajax({
+      url: VuFind.getPath() + '/AJAX/JSON?' + $.param({method:'exportFavorites'}),
+      type:'POST',
+      dataType:'json',
+      data:Lightbox.getFormData($(evt.target)),
+      success:function(data) {
+        if(data.data.export_type == 'download' || data.data.needs_redirect) {
+          document.location.href = data.data.result_url;
+          Lightbox.close();
+          return false;
+        } else {
+          Lightbox.changeContent(data.data.result_additional);
+        }
+      },
+      error:function(d,e) {
+        //console.log(d,e); // Error reporting
+      }
+    });
+    return false;
+  });
+  Lightbox.addFormHandler('feedback', function(evt) {
+    var $form = $(evt.target);
+    // Grabs hidden inputs
+    var formSuccess     = $form.find("input#formSuccess").val();
+    var feedbackFailure = $form.find("input#feedbackFailure").val();
+    var feedbackSuccess = $form.find("input#feedbackSuccess").val();
+    // validate and process form here
+    var name  = $form.find("input#name").val();
+    var email = $form.find("input#email").val();
+    var comments = $form.find("textarea#comments").val();
+    if (name.length == 0 || comments.length == 0) {
+      Lightbox.displayError(feedbackFailure);
+    } else {
+      Lightbox.get('Feedback', 'Email', {}, {'name':name,'email':email,'comments':comments}, function() {
+        Lightbox.changeContent('<div class="alert alert-info">'+formSuccess+'</div>');
+      });
+    }
+    return false;
+  });
+  Lightbox.addFormHandler('loginForm', function(evt) {
+    ajaxLogin(evt.target);
+    return false;
+  });
+
+  // Feedback
+  $('#feedbackLink').click(function() {
+    return Lightbox.get('Feedback', 'Home');
+  });
+  // Help links
+  $('.help-link').click(function() {
+    var split = this.href.split('=');
+    return Lightbox.get('Help','Home',{topic:split[1]});
+  });
+  // Hierarchy links
+  $('.hierarchyTreeLink a').click(function() {
+    var id = $(this).parent().parent().parent().find(".hiddenId")[0].value;
+    var hierarchyID = $(this).parent().find(".hiddenHierarchyId")[0].value;
+    return Lightbox.get('Record','AjaxTab',{id:id},{hierarchy:hierarchyID,tab:'HierarchyTree'});
+  });
+  // Login link
+  $('#loginOptions a.modal-link').click(function() {
+    return Lightbox.get('MyResearch','UserLogin');
+  });
+  // Email search link
+  $('.mailSearch').click(function() {
+    return Lightbox.get('Search','Email',{url:document.URL});
+  });
+  // Save record links
+  $('.result .save-record').click(function() {
+    var parts = this.href.split('/');
+    return Lightbox.get(parts[parts.length-3],'Save',{id:$(this).attr('data-id')});
+  });
 });
\ No newline at end of file
diff --git a/themes/bootstrap3/js/openurl.js b/themes/bootstrap3/js/openurl.js
index 142c325a111f9a8586f949eb0fac38bc791d7116..7d9f4432e2c6fb9415700db59675baecca2f9d86 100644
--- a/themes/bootstrap3/js/openurl.js
+++ b/themes/bootstrap3/js/openurl.js
@@ -1,55 +1,55 @@
-/*global extractClassParams, path*/
+/*global extractClassParams, VuFind */
 
 function loadResolverLinks($target, openUrl) {
-    $target.addClass('ajax_availability');
-    var url = path + '/AJAX/JSON?' + $.param({method:'getResolverLinks',openurl:openUrl});
-    $.ajax({
-        dataType: 'json',
-        url: url,
-        success: function(response) {
-            if (response.status == 'OK') {
-                $target.removeClass('ajax_availability')
-                    .empty().append(response.data);
-            } else {
-                $target.removeClass('ajax_availability').addClass('error')
-                    .empty().append(response.data);
-            }
-        }
-    });
+  $target.addClass('ajax_availability');
+  var url = VuFind.getPath() + '/AJAX/JSON?' + $.param({method:'getResolverLinks',openurl:openUrl});
+  $.ajax({
+    dataType: 'json',
+    url: url,
+    success: function(response) {
+      if (response.status == 'OK') {
+        $target.removeClass('ajax_availability')
+          .empty().append(response.data);
+      } else {
+        $target.removeClass('ajax_availability').addClass('error')
+          .empty().append(response.data);
+      }
+    }
+  });
 }
 
 function embedOpenUrlLinks(element) {
-    // Extract the OpenURL associated with the clicked element:
-    var openUrl = element.children('span.openUrl:first').attr('title');
+  // Extract the OpenURL associated with the clicked element:
+  var openUrl = element.children('span.openUrl:first').attr('title');
 
-    // Hide the controls now that something has been clicked:
-    var controls = element.parents('.openUrlControls');
-    controls.removeClass('openUrlEmbed').addClass('hidden');
+  // Hide the controls now that something has been clicked:
+  var controls = element.parents('.openUrlControls');
+  controls.removeClass('openUrlEmbed').addClass('hidden');
 
-    // Locate the target area for displaying the results:
-    var target = controls.next('div.resolver');
+  // Locate the target area for displaying the results:
+  var target = controls.next('div.resolver');
 
-    // If the target is already visible, a previous click has populated it;
-    // don't waste time doing redundant work.
-    if (target.hasClass('hidden')) {
-        loadResolverLinks(target.removeClass('hidden'), openUrl);
-    }
+  // If the target is already visible, a previous click has populated it;
+  // don't waste time doing redundant work.
+  if (target.hasClass('hidden')) {
+    loadResolverLinks(target.removeClass('hidden'), openUrl);
+  }
 }
 
 $(document).ready(function() {
-    // assign action to the openUrlWindow link class
-    $('a.openUrlWindow').click(function(){
-        var params = extractClassParams(this);
-        var settings = params.window_settings;
-        window.open($(this).attr('href'), 'openurl', settings);
-        return false;
-    });
-
-    // assign action to the openUrlEmbed link class
-    $('.openUrlEmbed a').click(function() {
-        embedOpenUrlLinks($(this));
-        return false;
-    });
-
-    $('.openUrlEmbed.openUrlEmbedAutoLoad a').trigger("click");
+  // assign action to the openUrlWindow link class
+  $('a.openUrlWindow').click(function(){
+    var params = extractClassParams(this);
+    var settings = params.window_settings;
+    window.open($(this).attr('href'), 'openurl', settings);
+    return false;
+  });
+
+  // assign action to the openUrlEmbed link class
+  $('.openUrlEmbed a').click(function() {
+    embedOpenUrlLinks($(this));
+    return false;
+  });
+
+  $('.openUrlEmbed.openUrlEmbedAutoLoad a').trigger("click");
 });
diff --git a/themes/bootstrap3/js/pubdate_vis.js b/themes/bootstrap3/js/pubdate_vis.js
index 370aa39e3120380d118ef7f49833ad71fd53d415..2d0915b062b6e038715d343d09b5588bce60addd 100644
--- a/themes/bootstrap3/js/pubdate_vis.js
+++ b/themes/bootstrap3/js/pubdate_vis.js
@@ -1,7 +1,6 @@
 /*global htmlEncode*/
 
-function PadDigits(n, totalDigits)
-{
+function PadDigits(n, totalDigits) {
   if (n <= 0){
     n= 1;
   }
diff --git a/themes/bootstrap3/js/record.js b/themes/bootstrap3/js/record.js
index 00d0af6c54dec461d7744d4032f55677883f1618..540c983fe7a8b55745714cbaae3052d920238c0c 100644
--- a/themes/bootstrap3/js/record.js
+++ b/themes/bootstrap3/js/record.js
@@ -1,23 +1,14 @@
-/*global checkSaveStatuses, deparam, extractClassParams, htmlEncode, Lightbox, path, syn_get_widget, userIsLoggedIn, vufindString */
+/*global checkSaveStatuses, deparam, extractClassParams, htmlEncode, Lightbox, syn_get_widget, userIsLoggedIn, VuFind */
 
 /**
  * Functions and event handlers specific to record pages.
  */
-function checkRequestIsValid(element, requestURL, requestType, blockedClass) {
-  var recordId = requestURL.match(/\/Record\/([^\/]+)\//)[1];
-  var vars = {}, hash;
-  var hashes = requestURL.slice(requestURL.indexOf('?') + 1).split('&');
-
-  for(var i = 0; i < hashes.length; i++)
-  {
-    hash = hashes[i].split('=');
-    var x = hash[0];
-    var y = hash[1];
-    vars[x] = y;
-  }
+function checkRequestIsValid(element, requestType, blockedClass) {
+  var recordId = element.href.match(/\/Record\/([^\/]+)\//)[1];
+  var vars = deparam(element.href);
   vars['id'] = recordId;
 
-  var url = path + '/AJAX/JSON?' + $.param({method:'checkRequestIsValid', id: recordId, requestType: requestType, data: vars});
+  var url = VuFind.getPath() + '/AJAX/JSON?' + $.param({method:'checkRequestIsValid', id: recordId, requestType: requestType, data: vars});
   $.ajax({
     dataType: 'json',
     cache: false,
@@ -40,53 +31,46 @@ function checkRequestIsValid(element, requestURL, requestType, blockedClass) {
 
 function setUpCheckRequest() {
   $('.checkRequest').each(function(i) {
-    if ($(this).hasClass('checkRequest')) {
-      var isValid = checkRequestIsValid(this, this.href, 'Hold', 'holdBlocked');
-    }
+    checkRequestIsValid(this, 'Hold', 'holdBlocked');
   });
   $('.checkStorageRetrievalRequest').each(function(i) {
-    if ($(this).hasClass('checkStorageRetrievalRequest')) {
-      var isValid = checkRequestIsValid(this, this.href, 'StorageRetrievalRequest',
-          'StorageRetrievalRequestBlocked');
-    }
+    checkRequestIsValid(this, 'StorageRetrievalRequest', 'StorageRetrievalRequestBlocked');
   });
   $('.checkILLRequest').each(function(i) {
-    if ($(this).hasClass('checkILLRequest')) {
-      var isValid = checkRequestIsValid(this, this.href, 'ILLRequest',
-          'ILLRequestBlocked');
-    }
+    checkRequestIsValid(this, 'ILLRequest', 'ILLRequestBlocked');
   });
 }
 
 function deleteRecordComment(element, recordId, recordSource, commentId) {
-  var url = path + '/AJAX/JSON?' + $.param({method:'deleteRecordComment',id:commentId});
+  var url = VuFind.getPath() + '/AJAX/JSON?' + $.param({method:'deleteRecordComment',id:commentId});
   $.ajax({
     dataType: 'json',
     url: url,
     success: function(response) {
       if (response.status == 'OK') {
-        $($(element).parents('.comment')[0]).remove();
+        $($(element).closest('.comment')[0]).remove();
       }
     }
   });
 }
 
-function refreshCommentList(recordId, recordSource) {
-  var url = path + '/AJAX/JSON?' + $.param({method:'getRecordCommentsAsHTML',id:recordId,'source':recordSource});
+function refreshCommentList($target, recordId, recordSource) {
+  var url = VuFind.getPath() + '/AJAX/JSON?' + $.param({method:'getRecordCommentsAsHTML',id:recordId,'source':recordSource});
   $.ajax({
     dataType: 'json',
     url: url,
     success: function(response) {
       // Update HTML
       if (response.status == 'OK') {
-        $('#commentList').empty();
-        $('#commentList').append(response.data);
-        $('input[type="submit"]').button('reset');
-        $('.delete').unbind('click').click(function() {
+        var $commentList = $target.find('.comment-list');
+        $commentList.empty();
+        $commentList.append(response.data);
+        $commentList.find('.delete').unbind('click').click(function() {
           var commentId = $(this).attr('id').substr('recordComment'.length);
           deleteRecordComment(this, recordId, recordSource, commentId);
           return false;
         });
+        $target.find('.comment-form input[type="submit"]').button('reset');
       }
     }
   });
@@ -94,11 +78,11 @@ function refreshCommentList(recordId, recordSource) {
 
 function registerAjaxCommentRecord() {
   // Form submission
-  $('form.comment').unbind('submit').submit(function(){
+  $('form.comment-form').unbind('submit').submit(function() {
     var form = this;
     var id = form.id.value;
     var recordSource = form.source.value;
-    var url = path + '/AJAX/JSON?' + $.param({method:'commentRecord'});
+    var url = VuFind.getPath() + '/AJAX/JSON?' + $.param({method:'commentRecord'});
     var data = {
       comment:form.comment.value,
       id:id,
@@ -111,7 +95,8 @@ function registerAjaxCommentRecord() {
       dataType: 'json',
       success: function(response) {
         if (response.status == 'OK') {
-          refreshCommentList(id, recordSource);
+          var $tab = $(form).closest('.tab-pane');
+          refreshCommentList($tab, id, recordSource);
           $(form).find('textarea[name="comment"]').val('');
           $(form).find('input[type="submit"]').button('loading');
         } else {
@@ -122,7 +107,11 @@ function registerAjaxCommentRecord() {
     return false;
   });
   // Delete links
-  $('.delete').click(function(){deleteRecordComment(this, $('.hiddenId').val(), $('.hiddenSource').val(), this.id.substr(13));return false;});
+  $('.delete').click(function() {
+    var commentId = this.id.substr('recordComment'.length);
+    deleteRecordComment(this, $('.hiddenId').val(), $('.hiddenSource').val(), commentId);
+    return false;
+  });
 }
 
 function registerTabEvents() {
@@ -146,25 +135,21 @@ function registerTabEvents() {
   });
 }
 
-function ajaxLoadTab(tabid, setHash) {
-  // if we're flagged to skip AJAX for this tab, just return true and let the
-  // browser handle it.
-  if(document.getElementById(tabid).parentNode.className.indexOf('noajax') > -1) {
-    return true;
-  }
-
+function ajaxLoadTab($newTab, tabid, setHash) {
   // Parse out the base URL for the current record:
   var urlParts = document.URL.split(/[?#]/);
   var urlWithoutFragment = urlParts[0];
-  if (path == '') {
+  var path = VuFind.getPath();
+  var urlroot = null;
+  if (path === '') {
     // special case -- VuFind installed at site root:
     var chunks = urlWithoutFragment.split('/');
-    var urlroot = '/' + chunks[3] + '/' + chunks[4];
+    urlroot = '/' + chunks[3] + '/' + chunks[4];
   } else {
     // standard case -- VuFind has its own path under site:
     var pathInUrl = urlWithoutFragment.indexOf(path);
-    var chunks = urlWithoutFragment.substring(pathInUrl + path.length + 1).split('/');
-    var urlroot = '/' + chunks[0] + '/' + chunks[1];
+    var parts = urlWithoutFragment.substring(pathInUrl + path.length + 1).split('/');
+    urlroot = '/' + parts[0] + '/' + parts[1];
   }
 
   // Request the tab via AJAX:
@@ -173,9 +158,7 @@ function ajaxLoadTab(tabid, setHash) {
     type: 'POST',
     data: {tab: tabid},
     success: function(data) {
-      $('#record-tabs .tab-pane.active').removeClass('active');
-      $('#'+tabid+'-tab').html(data).addClass('active');
-      $('#'+tabid).tab('show');
+      $newTab.html(data);
       registerTabEvents();
       if(typeof syn_get_widget === "function") {
         syn_get_widget();
@@ -188,24 +171,27 @@ function ajaxLoadTab(tabid, setHash) {
   return false;
 }
 
-function refreshTagList(loggedin) {
+function refreshTagList(target, loggedin) {
   loggedin = !!loggedin || userIsLoggedIn;
-  var recordId = $('#record_id').val();
-  var recordSource = $('.hiddenSource').val();
-  var tagList = $('#tagList');
-  if (tagList.length > 0) {
-    tagList.empty();
-    var url = path + '/AJAX/JSON?' + $.param({method:'getRecordTags',id:recordId,'source':recordSource});
+  if (typeof target === 'undefined') {
+    target = document;
+  }
+  var recordId = $(target).find('.hiddenId').val();
+  var recordSource = $(target).find('.hiddenSource').val();
+  var $tagList = $(target).find('.tagList');
+  if ($tagList.length > 0) {
+    $tagList.empty();
+    var url = VuFind.getPath() + '/AJAX/JSON?' + $.param({method:'getRecordTags',id:recordId,'source':recordSource});
     $.ajax({
       dataType: 'json',
       url: url,
       complete: function(response) {
         if(response.status == 200) {
-          tagList.replaceWith(response.responseText);
+          $tagList.replaceWith(response.responseText);
           if(loggedin) {
-            $('#tagList').addClass('loggedin');
+            $tagList.addClass('loggedin');
           } else {
-            $('#tagList').removeClass('loggedin');
+            $tagList.removeClass('loggedin');
           }
         }
       }
@@ -213,14 +199,18 @@ function refreshTagList(loggedin) {
   }
 }
 
-function ajaxTagUpdate(tag, remove) {
+function ajaxTagUpdate(link, tag, remove) {
+  if(typeof link === "undefined") {
+    link = document;
+  }
   if(typeof remove === "undefined") {
     remove = false;
   }
-  var recordId = $('#record_id').val();
-  var recordSource = $('.hiddenSource').val();
+  var $target = $(link).closest('.record');
+  var recordId = $target.find('.hiddenId').val();
+  var recordSource = $target.find('.hiddenSource').val();
   $.ajax({
-    url:path+'/AJAX/JSON?method=tagRecord',
+    url:VuFind.getPath() + '/AJAX/JSON?method=tagRecord',
     method:'POST',
     data:{
       tag:'"'+tag.replace(/\+/g, ' ')+'"',
@@ -228,80 +218,92 @@ function ajaxTagUpdate(tag, remove) {
       source:recordSource,
       remove:remove
     },
-    complete:refreshTagList
+    complete: function() {
+      refreshTagList($target, false);
+    }
   });
 }
 
-function applyRecordTabHash()
-{
-  var activeTab = $('ul.recordTabs li.active a').attr('id');
-  var initiallyActiveTab = $('ul.recordTabs li.initiallyActive a').attr('id');
+function applyRecordTabHash() {
+  var activeTab = $('.record-tabs li.active a').attr('class');
+  var $initiallyActiveTab = $('.record-tabs li.initiallyActive a');
   var newTab = typeof window.location.hash !== 'undefined'
     ? window.location.hash.toLowerCase() : '';
 
   // Open tag in url hash
   if (newTab.length == 0 || newTab == '#tabnav') {
-    $('#' + initiallyActiveTab).click();
+    $initiallyActiveTab.click();
   } else if (newTab.length > 0 && '#' + activeTab != newTab) {
-    $(newTab).click();
+    $('.'+newTab.substr(1)).click();
   }
 }
 
 $(window).on('hashchange', applyRecordTabHash);
 
-$(document).ready(function(){
-  var id = $('.hiddenId')[0].value;
-  registerTabEvents();
-
-  $('ul.recordTabs a').click(function (e) {
-    if($(this).parents('li.active').length > 0) {
-      return true;
-    }
-    var tabid = $(this).attr('id').toLowerCase();
-    if($('#'+tabid+'-tab').length > 0) {
-      $('#record-tabs .tab-pane.active').removeClass('active');
-      $('#'+tabid+'-tab').addClass('active');
-      $('#'+tabid).tab('show');
-      window.location.hash = tabid;
-      return false;
-    } else {
-      $('#record-tabs').append('<div class="tab-pane" id="'+tabid+'-tab"><i class="fa fa-spinner fa-spin"></i> '+vufindString['loading']+'...</div>');
-      $('#record-tabs .tab-pane.active').removeClass('active');
-      $('#'+tabid+'-tab').addClass('active');
-      return ajaxLoadTab(tabid);
-    }
-  });
-  applyRecordTabHash();
-
-  /* --- LIGHTBOX --- */
+function setupRecordToolbar(target) {
+  if (typeof target === 'undefined') {
+    target = document;
+  }
   // Cite lightbox
-  $('#cite-record').click(function() {
+  var $elem = $(target);
+  var id = $elem.find('.hiddenId').val();
+  $elem.find('.cite-record').click(function() {
     var params = extractClassParams(this);
     return Lightbox.get(params['controller'], 'Cite', {id:id});
   });
   // Mail lightbox
-  $('#mail-record').click(function() {
+  $elem.find('.mail-record').click(function() {
     var params = extractClassParams(this);
     return Lightbox.get(params['controller'], 'Email', {id:id});
   });
   // Save lightbox
-  $('#save-record').click(function() {
+  $elem.find('.save-record').click(function() {
     var params = extractClassParams(this);
     return Lightbox.get(params['controller'], 'Save', {id:id});
   });
   // SMS lightbox
-  $('#sms-record').click(function() {
+  $elem.find('.sms-record').click(function() {
     var params = extractClassParams(this);
     return Lightbox.get(params['controller'], 'SMS', {id:id});
   });
-  $('#tagRecord').click(function() {
-    var id = $('.hiddenId')[0].value;
+  $elem.find('.tag-record').click(function() {
     var parts = this.href.split('/');
     return Lightbox.get(parts[parts.length-3],'AddTag',{id:id});
   });
+}
+
+function recordDocReady() {
+  registerTabEvents();
+
+  $('.record-tabs .nav-tabs a').click(function (e) {
+    if ($(this.parentNode).hasClass('active')) {
+      return true;
+    }
+    var tabid = this.className;
+    var $top = $(this).closest('.record-tabs');
+    $top.find('.tab-pane.active').removeClass('active');
+    $(this).tab('show');
+    if ($top.find('.'+tabid+'-tab').length > 0) {
+      $top.find('.'+tabid+'-tab').addClass('active');
+      window.location.hash = tabid;
+      return false;
+    } else {
+      // if we're flagged to skip AJAX for this tab, just return true and let the browser handle it.
+      if ($(this.parentNode).hasClass('noajax')) {
+        return true;
+      }
+      var newTab = $('<div class="tab-pane active '+tabid+'-tab"><i class="fa fa-spinner fa-spin"></i> '+VuFind.translate('loading')+'...</div>');
+      $top.find('.tab-content').append(newTab);
+      return ajaxLoadTab(newTab, tabid, !$(this).parent().hasClass('initiallyActive'));
+    }
+  });
+  applyRecordTabHash();
+
+  /* --- LIGHTBOX --- */
+  setupRecordToolbar();
   // Form handlers
   Lightbox.addFormCallback('emailRecord', function(){
-    Lightbox.confirm(vufindString['bulk_email_success']);
+    Lightbox.confirm(VuFind.translate('bulk_email_success'));
   });
   Lightbox.addFormCallback('placeHold', function(html) {
     Lightbox.checkForError(html, function(html) {
@@ -312,22 +314,22 @@ $(document).ready(function(){
     });
   });
   Lightbox.addFormCallback('placeILLRequest', function() {
-    document.location.href = path+'/MyResearch/ILLRequests';
+    document.location.href = VuFind.getPath() + '/MyResearch/ILLRequests';
   });
   Lightbox.addFormCallback('placeStorageRetrievalRequest', function() {
-    document.location.href = path+'/MyResearch/StorageRetrievalRequests';
+    document.location.href = VuFind.getPath() + '/MyResearch/StorageRetrievalRequests';
   });
   Lightbox.addFormCallback('saveRecord', function() {
     checkSaveStatuses();
     refreshTagList();
-    Lightbox.confirm(vufindString['bulk_save_success']);
+    Lightbox.confirm(VuFind.translate('bulk_save_success'));
   });
   Lightbox.addFormCallback('smsRecord', function() {
-    Lightbox.confirm(vufindString['sms_success']);
+    Lightbox.confirm(VuFind.translate('sms_success'));
   });
   // Tag lightbox
   Lightbox.addFormCallback('tagRecord', function(html) {
     refreshTagList(true);
-    Lightbox.confirm(vufindString['add_tag_success']);
+    Lightbox.confirm(VuFind.translate('add_tag_success'));
   });
-});
+}
\ No newline at end of file
diff --git a/themes/bootstrap3/js/vendor/cookies.js b/themes/bootstrap3/js/vendor/cookies.js
index 871e9b803dade77dec9faad4268c74f1077ef076..e0d8a44404e6aa0d0ad943a943ea4b4fa04a190b 100644
--- a/themes/bootstrap3/js/vendor/cookies.js
+++ b/themes/bootstrap3/js/vendor/cookies.js
@@ -1,6 +1,31 @@
-/* --- COOKIE LIBRARY --- https://developer.mozilla.org/en-US/docs/Web/API/document.cookie ---*/
+// https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie/Simple_document.cookie_framework
+/*\
+|*|
+|*|  :: cookies.js ::
+|*|
+|*|  A complete cookies reader/writer framework with full unicode support.
+|*|
+|*|  Revision #1 - September 4, 2014
+|*|
+|*|  https://developer.mozilla.org/en-US/docs/Web/API/document.cookie
+|*|  https://developer.mozilla.org/User:fusionchess
+|*|
+|*|  This framework is released under the GNU Public License, version 3 or later.
+|*|  http://www.gnu.org/licenses/gpl-3.0-standalone.html
+|*|
+|*|  Syntaxes:
+|*|
+|*|  * Cookies.setItem(name, value[, end[, path[, domain[, secure]]]])
+|*|  * Cookies.getItem(name)
+|*|  * Cookies.removeItem(name[, path[, domain]])
+|*|  * Cookies.hasItem(name)
+|*|  * Cookies.keys()
+|*|
+\*/
+
 var Cookies = {
   getItem: function (sKey) {
+    if (!sKey) { return null; }
     return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
   },
   setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
@@ -21,19 +46,19 @@ var Cookies = {
     }
     document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
     return true;
-  },  
-  
+  },
   removeItem: function (sKey, sPath, sDomain) {
-    if (!sKey || !this.hasItem(sKey)) { return false; }
-    document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + ( sDomain ? "; domain=" + sDomain : "") + ( sPath ? "; path=" + sPath : "");
+    if (!this.hasItem(sKey)) { return false; }
+    document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "");
     return true;
   },
   hasItem: function (sKey) {
+    if (!sKey) { return false; }
     return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
   },
-  keys: /* optional method: you can safely remove it! */ function () {
+  keys: function () {
     var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
-    for (var nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }
+    for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }
     return aKeys;
   }
-};
+};
\ No newline at end of file
diff --git a/themes/bootstrap3/js/vendor/typeahead.js b/themes/bootstrap3/js/vendor/typeahead.js
deleted file mode 100644
index 3ee29ebcb3adca29cce280025375eb04a1b12f8e..0000000000000000000000000000000000000000
--- a/themes/bootstrap3/js/vendor/typeahead.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * typeahead.js 0.10.5
- * https://github.com/twitter/typeahead.js
- * Copyright 2013-2014 Twitter, Inc. and other contributors; Licensed MIT
- */
-
-!function(a){var b=function(){"use strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof a},isNumber:function(a){return"number"==typeof a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof a},toStr:function(a){return b.isUndefined(a)||null===a?"":a+""},bind:a.proxy,each:function(b,c){function d(a,b){return c(b,a)}a.each(b,d)},map:a.map,filter:a.grep,every:function(b,c){var d=!0;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 0:!1}),!!d):d},some:function(b,c){var d=!1;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 0}),!!d):d},mixin:a.extend,getUniqueId:function(){var a=0;return function(){return a++}}(),templatify:function(b){function c(){return String(b)}return a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var c,d,e,f,g,h;return g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},noop:function(){}}}(),c=function(){return{wrapper:'<span class="twitter-typeahead"></span>',dropdown:'<span class="tt-dropdown-menu"></span>',dataset:'<div class="tt-dataset-%CLASS%"></div>',suggestions:'<span class="tt-suggestions"></span>',suggestion:'<div class="tt-suggestion"></div>'}}(),d=function(){"use strict";var a={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return b.isMsie()&&b.mixin(a.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),b.isMsie()&&b.isMsie()<=7&&b.mixin(a.input,{marginTop:"-1px"}),a}(),e=function(){"use strict";function c(b){b&&b.el||a.error("EventBus initialized without el"),this.$el=a(b.el)}var d="typeahead:";return b.mixin(c.prototype,{trigger:function(a){var b=[].slice.call(arguments,1);this.$el.trigger(d+a,b)}}),c}(),f=function(){"use strict";function a(a,b,c,d){var e;if(!c)return this;for(b=b.split(i),c=d?h(c,d):c,this._callbacks=this._callbacks||{};e=b.shift();)this._callbacks[e]=this._callbacks[e]||{sync:[],async:[]},this._callbacks[e][a].push(c);return this}function b(b,c,d){return a.call(this,"async",b,c,d)}function c(b,c,d){return a.call(this,"sync",b,c,d)}function d(a){var b;if(!this._callbacks)return this;for(a=a.split(i);b=a.shift();)delete this._callbacks[b];return this}function e(a){var b,c,d,e,g;if(!this._callbacks)return this;for(a=a.split(i),d=[].slice.call(arguments,1);(b=a.shift())&&(c=this._callbacks[b]);)e=f(c.sync,this,[b].concat(d)),g=f(c.async,this,[b].concat(d)),e()&&j(g);return this}function f(a,b,c){function d(){for(var d,e=0,f=a.length;!d&&f>e;e+=1)d=a[e].apply(b,c)===!1;return!d}return d}function g(){var a;return a=window.setImmediate?function(a){setImmediate(function(){a()})}:function(a){setTimeout(function(){a()},0)}}function h(a,b){return a.bind?a.bind(b):function(){a.apply(b,[].slice.call(arguments,0))}}var i=/\s+/,j=g();return{onSync:c,onAsync:b,off:d,trigger:e}}(),g=function(a){"use strict";function c(a,c,d){for(var e,f=[],g=0,h=a.length;h>g;g++)f.push(b.escapeRegExChars(a[g]));return e=d?"\\b("+f.join("|")+")\\b":"("+f.join("|")+")",c?new RegExp(e):new RegExp(e,"i")}var d={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(e){function f(b){var c,d,f;return(c=h.exec(b.data))&&(f=a.createElement(e.tagName),e.className&&(f.className=e.className),d=b.splitText(c.index),d.splitText(c[0].length),f.appendChild(d.cloneNode(!0)),b.parentNode.replaceChild(f,d)),!!c}function g(a,b){for(var c,d=3,e=0;e<a.childNodes.length;e++)c=a.childNodes[e],c.nodeType===d?e+=b(c)?1:0:g(c,b)}var h;e=b.mixin({},d,e),e.node&&e.pattern&&(e.pattern=b.isArray(e.pattern)?e.pattern:[e.pattern],h=c(e.pattern,e.caseSensitive,e.wordsOnly),g(e.node,f))}}(window.document),h=function(){"use strict";function c(c){var e,f,g,i,j=this;c=c||{},c.input||a.error("input is missing"),e=b.bind(this._onBlur,this),f=b.bind(this._onFocus,this),g=b.bind(this._onKeydown,this),i=b.bind(this._onInput,this),this.$hint=a(c.hint),this.$input=a(c.input).on("blur.tt",e).on("focus.tt",f).on("keydown.tt",g),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=b.noop),b.isMsie()?this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",function(a){h[a.which||a.keyCode]||b.defer(b.bind(j._onInput,j,a))}):this.$input.on("input.tt",i),this.query=this.$input.val(),this.$overflowHelper=d(this.$input)}function d(b){return a('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:b.css("font-family"),fontSize:b.css("font-size"),fontStyle:b.css("font-style"),fontVariant:b.css("font-variant"),fontWeight:b.css("font-weight"),wordSpacing:b.css("word-spacing"),letterSpacing:b.css("letter-spacing"),textIndent:b.css("text-indent"),textRendering:b.css("text-rendering"),textTransform:b.css("text-transform")}).insertAfter(b)}function e(a,b){return c.normalizeQuery(a)===c.normalizeQuery(b)}function g(a){return a.altKey||a.ctrlKey||a.metaKey||a.shiftKey}var h;return h={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},c.normalizeQuery=function(a){return(a||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},b.mixin(c.prototype,f,{_onBlur:function(){this.resetInputValue(),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(a){var b=h[a.which||a.keyCode];this._managePreventDefault(b,a),b&&this._shouldTrigger(b,a)&&this.trigger(b+"Keyed",a)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(a,b){var c,d,e;switch(a){case"tab":d=this.getHint(),e=this.getInputValue(),c=d&&d!==e&&!g(b);break;case"up":case"down":c=!g(b);break;default:c=!1}c&&b.preventDefault()},_shouldTrigger:function(a,b){var c;switch(a){case"tab":c=!g(b);break;default:c=!0}return c},_checkInputValue:function(){var a,b,c;a=this.getInputValue(),b=e(a,this.query),c=b?this.query.length!==a.length:!1,this.query=a,b?c&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(a){this.query=a},getInputValue:function(){return this.$input.val()},setInputValue:function(a,b){this.$input.val(a),b?this.clearHint():this._checkInputValue()},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(a){this.$hint.val(a)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var a,b,c,d;a=this.getInputValue(),b=this.getHint(),c=a!==b&&0===b.indexOf(a),d=""!==a&&c&&!this.hasOverflow(),!d&&this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var a=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=a},isCursorAtEnd:function(){var a,c,d;return a=this.$input.val().length,c=this.$input[0].selectionStart,b.isNumber(c)?c===a:document.selection?(d=document.selection.createRange(),d.moveStart("character",-a),a===d.text.length):!0},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$hint=this.$input=this.$overflowHelper=null}}),c}(),i=function(){"use strict";function e(d){d=d||{},d.templates=d.templates||{},d.source||a.error("missing source"),d.name&&!j(d.name)&&a.error("invalid dataset name: "+d.name),this.query=null,this.highlight=!!d.highlight,this.name=d.name||b.getUniqueId(),this.source=d.source,this.displayFn=h(d.display||d.displayKey),this.templates=i(d.templates,this.displayFn),this.$el=a(c.dataset.replace("%CLASS%",this.name))}function h(a){function c(b){return b[a]}return a=a||"value",b.isFunction(a)?a:c}function i(a,c){function d(a){return"<p>"+c(a)+"</p>"}return{empty:a.empty&&b.templatify(a.empty),header:a.header&&b.templatify(a.header),footer:a.footer&&b.templatify(a.footer),suggestion:a.suggestion||d}}function j(a){return/^[_a-zA-Z0-9-]+$/.test(a)}var k="ttDataset",l="ttValue",m="ttDatum";return e.extractDatasetName=function(b){return a(b).data(k)},e.extractValue=function(b){return a(b).data(l)},e.extractDatum=function(b){return a(b).data(m)},b.mixin(e.prototype,f,{_render:function(e,f){function h(){return p.templates.empty({query:e,isEmpty:!0})}function i(){function h(b){var e;return e=a(c.suggestion).append(p.templates.suggestion(b)).data(k,p.name).data(l,p.displayFn(b)).data(m,b),e.children().each(function(){a(this).css(d.suggestionChild)}),e}var i,j;return i=a(c.suggestions).css(d.suggestions),j=b.map(f,h),i.append.apply(i,j),p.highlight&&g({className:"tt-highlight",node:i[0],pattern:e}),i}function j(){return p.templates.header({query:e,isEmpty:!o})}function n(){return p.templates.footer({query:e,isEmpty:!o})}if(this.$el){var o,p=this;this.$el.empty(),o=f&&f.length,!o&&this.templates.empty?this.$el.html(h()).prepend(p.templates.header?j():null).append(p.templates.footer?n():null):o&&this.$el.html(i()).prepend(p.templates.header?j():null).append(p.templates.footer?n():null),this.trigger("rendered")}},getRoot:function(){return this.$el},update:function(a){function b(b){c.canceled||a!==c.query||c._render(a,b)}var c=this;this.query=a,this.canceled=!1,this.source(a,b)},cancel:function(){this.canceled=!0},clear:function(){this.cancel(),this.$el.empty(),this.trigger("rendered")},isEmpty:function(){return this.$el.is(":empty")},destroy:function(){this.$el=null}}),e}(),j=function(){"use strict";function c(c){var d,f,g,h=this;c=c||{},c.menu||a.error("menu is required"),this.isOpen=!1,this.isEmpty=!0,this.datasets=b.map(c.datasets,e),d=b.bind(this._onSuggestionClick,this),f=b.bind(this._onSuggestionMouseEnter,this),g=b.bind(this._onSuggestionMouseLeave,this),this.$menu=a(c.menu).on("click.tt",".tt-suggestion",d).on("mouseenter.tt",".tt-suggestion",f).on("mouseleave.tt",".tt-suggestion",g),b.each(this.datasets,function(a){h.$menu.append(a.getRoot()),a.onSync("rendered",h._onRendered,h)})}function e(a){return new i(a)}return b.mixin(c.prototype,f,{_onSuggestionClick:function(b){this.trigger("suggestionClicked",a(b.currentTarget))},_onSuggestionMouseEnter:function(b){this._removeCursor(),this._setCursor(a(b.currentTarget),!0)},_onSuggestionMouseLeave:function(){this._removeCursor()},_onRendered:function(){function a(a){return a.isEmpty()}this.isEmpty=b.every(this.datasets,a),this.isEmpty?this._hide():this.isOpen&&this._show(),this.trigger("datasetRendered")},_hide:function(){this.$menu.hide()},_show:function(){this.$menu.css("display","block")},_getSuggestions:function(){return this.$menu.find(".tt-suggestion")},_getCursor:function(){return this.$menu.find(".tt-cursor").first()},_setCursor:function(a,b){a.first().addClass("tt-cursor"),!b&&this.trigger("cursorMoved")},_removeCursor:function(){this._getCursor().removeClass("tt-cursor")},_moveCursor:function(a){var b,c,d,e;if(this.isOpen){if(c=this._getCursor(),b=this._getSuggestions(),this._removeCursor(),d=b.index(c)+a,d=(d+1)%(b.length+1)-1,-1===d)return void this.trigger("cursorRemoved");-1>d&&(d=b.length-1),this._setCursor(e=b.eq(d)),this._ensureVisible(e)}},_ensureVisible:function(a){var b,c,d,e;b=a.position().top,c=b+a.outerHeight(!0),d=this.$menu.scrollTop(),e=this.$menu.height()+parseInt(this.$menu.css("paddingTop"),10)+parseInt(this.$menu.css("paddingBottom"),10),0>b?this.$menu.scrollTop(d+b):c>e&&this.$menu.scrollTop(d+(c-e))},close:function(){this.isOpen&&(this.isOpen=!1,this._removeCursor(),this._hide(),this.trigger("closed"))},open:function(){this.isOpen||(this.isOpen=!0,!this.isEmpty&&this._show(),this.trigger("opened"))},setLanguageDirection:function(a){this.$menu.css("ltr"===a?d.ltr:d.rtl)},moveCursorUp:function(){this._moveCursor(-1)},moveCursorDown:function(){this._moveCursor(1)},getDatumForSuggestion:function(a){var b=null;return a.length&&(b={raw:i.extractDatum(a),value:i.extractValue(a),datasetName:i.extractDatasetName(a)}),b},getDatumForCursor:function(){return this.getDatumForSuggestion(this._getCursor().first())},getDatumForTopSuggestion:function(){return this.getDatumForSuggestion(this._getSuggestions().first())},update:function(a){function c(b){b.update(a)}b.each(this.datasets,c)},empty:function(){function a(a){a.clear()}b.each(this.datasets,a),this.isEmpty=!0},isVisible:function(){return this.isOpen&&!this.isEmpty},destroy:function(){function a(a){a.destroy()}this.$menu.off(".tt"),this.$menu=null,b.each(this.datasets,a)}}),c}(),k=function(){"use strict";function f(c){var d,f,i;c=c||{},c.input||a.error("missing input"),this.isActivated=!1,this.autoselect=!!c.autoselect,this.minLength=b.isNumber(c.minLength)?c.minLength:1,this.$node=g(c.input,c.withHint),d=this.$node.find(".tt-dropdown-menu"),f=this.$node.find(".tt-input"),i=this.$node.find(".tt-hint"),f.on("blur.tt",function(a){var c,e,g;c=document.activeElement,e=d.is(c),g=d.has(c).length>0,b.isMsie()&&(e||g)&&(a.preventDefault(),a.stopImmediatePropagation(),b.defer(function(){f.focus()}))}),d.on("mousedown.tt",function(a){a.preventDefault()}),this.eventBus=c.eventBus||new e({el:f}),this.dropdown=new j({menu:d,datasets:c.datasets}).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=new h({input:f,hint:i}).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._setLanguageDirection()}function g(b,e){var f,g,h,j;f=a(b),g=a(c.wrapper).css(d.wrapper),h=a(c.dropdown).css(d.dropdown),j=f.clone().css(d.hint).css(i(f)),j.val("").removeData().addClass("tt-hint").removeAttr("id name placeholder required").prop("readonly",!0).attr({autocomplete:"off",spellcheck:"false",tabindex:-1}),f.data(l,{dir:f.attr("dir"),autocomplete:f.attr("autocomplete"),spellcheck:f.attr("spellcheck"),style:f.attr("style")}),f.addClass("tt-input").attr({autocomplete:"off",spellcheck:!1}).css(e?d.input:d.inputWithNoHint);try{!f.attr("dir")&&f.attr("dir","auto")}catch(k){}return f.wrap(g).parent().prepend(e?j:null).append(h)}function i(a){return{backgroundAttachment:a.css("background-attachment"),backgroundClip:a.css("background-clip"),backgroundColor:a.css("background-color"),backgroundImage:a.css("background-image"),backgroundOrigin:a.css("background-origin"),backgroundPosition:a.css("background-position"),backgroundRepeat:a.css("background-repeat"),backgroundSize:a.css("background-size")}}function k(a){var c=a.find(".tt-input");b.each(c.data(l),function(a,d){b.isUndefined(a)?c.removeAttr(d):c.attr(d,a)}),c.detach().removeData(l).removeClass("tt-input").insertAfter(a),a.remove()}var l="ttAttrs";return b.mixin(f.prototype,{_onSuggestionClicked:function(a,b){var c;(c=this.dropdown.getDatumForSuggestion(b))&&this._select(c)},_onCursorMoved:function(){var a=this.dropdown.getDatumForCursor();this.input.setInputValue(a.value,!0),this.eventBus.trigger("cursorchanged",a.raw,a.datasetName)},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint()},_onDatasetRendered:function(){this._updateHint()},_onOpened:function(){this._updateHint(),this.eventBus.trigger("opened")},_onClosed:function(){this.input.clearHint(),this.eventBus.trigger("closed")},_onFocused:function(){this.isActivated=!0,this.dropdown.open()},_onBlurred:function(){this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()},_onEnterKeyed:function(a,b){var c,d;c=this.dropdown.getDatumForCursor(),d=this.dropdown.getDatumForTopSuggestion(),c?(this._select(c),b.preventDefault()):this.autoselect&&d&&(this._select(d),b.preventDefault())},_onTabKeyed:function(a,b){var c;(c=this.dropdown.getDatumForCursor())?(this._select(c),b.preventDefault()):this._autocomplete(!0)},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var a=this.input.getQuery();this.dropdown.isEmpty&&a.length>=this.minLength?this.dropdown.update(a):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var a=this.input.getQuery();this.dropdown.isEmpty&&a.length>=this.minLength?this.dropdown.update(a):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){"rtl"===this.dir&&this._autocomplete()},_onRightKeyed:function(){"ltr"===this.dir&&this._autocomplete()},_onQueryChanged:function(a,b){this.input.clearHintIfInvalid(),b.length>=this.minLength?this.dropdown.update(b):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var a;this.dir!==(a=this.input.getLanguageDirection())&&(this.dir=a,this.$node.css("direction",a),this.dropdown.setLanguageDirection(a))},_updateHint:function(){var a,c,d,e,f,g;a=this.dropdown.getDatumForTopSuggestion(),a&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(c=this.input.getInputValue(),d=h.normalizeQuery(c),e=b.escapeRegExChars(d),f=new RegExp("^(?:"+e+")(.+$)","i"),g=f.exec(a.value),g?this.input.setHint(c+g[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(a){var b,c,d,e;b=this.input.getHint(),c=this.input.getQuery(),d=a||this.input.isCursorAtEnd(),b&&c!==b&&d&&(e=this.dropdown.getDatumForTopSuggestion(),e&&this.input.setInputValue(e.value),this.eventBus.trigger("autocompleted",e.raw,e.datasetName))},_select:function(a){this.input.setQuery(a.value),this.input.setInputValue(a.value,!0),this._setLanguageDirection(),this.eventBus.trigger("selected",a.raw,a.datasetName),this.dropdown.close(),b.defer(b.bind(this.dropdown.empty,this.dropdown))},open:function(){this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(a){a=b.toStr(a),this.isActivated?this.input.setInputValue(a):(this.input.setQuery(a),this.input.setInputValue(a,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){this.input.destroy(),this.dropdown.destroy(),k(this.$node),this.$node=null}}),f}();!function(){"use strict";var c,d,f;c=a.fn.typeahead,d="ttTypeahead",f={initialize:function(c,f){function g(){var g,h,i=a(this);b.each(f,function(a){a.highlight=!!c.highlight}),h=new k({input:i,eventBus:g=new e({el:i}),withHint:b.isUndefined(c.hint)?!0:!!c.hint,minLength:c.minLength,autoselect:c.autoselect,datasets:f}),i.data(d,h)}return f=b.isArray(f)?f:[].slice.call(arguments,1),c=c||{},this.each(g)},open:function(){function b(){var b,c=a(this);(b=c.data(d))&&b.open()}return this.each(b)},close:function(){function b(){var b,c=a(this);(b=c.data(d))&&b.close()}return this.each(b)},val:function(b){function c(){var c,e=a(this);(c=e.data(d))&&c.setVal(b)}function e(a){var b,c;return(b=a.data(d))&&(c=b.getVal()),c}return arguments.length?this.each(c):e(this.first())},destroy:function(){function b(){var b,c=a(this);(b=c.data(d))&&(b.destroy(),c.removeData(d))}return this.each(b)}},a.fn.typeahead=function(b){var c;return f[b]&&"initialize"!==b?(c=this.filter(function(){return!!a(this).data(d)}),f[b].apply(c,[].slice.call(arguments,1))):f.initialize.apply(this,arguments)},a.fn.typeahead.noConflict=function(){return a.fn.typeahead=c,this}}()}(window.jQuery);
\ No newline at end of file
diff --git a/themes/bootstrap3/js/vudl/record.js b/themes/bootstrap3/js/vudl/record.js
index 9876f328912ae3ae710d199b3f89aeea4a4d538b..3e40714ad6fdfad419a737e8b47682564b89e72c 100644
--- a/themes/bootstrap3/js/vudl/record.js
+++ b/themes/bootstrap3/js/vudl/record.js
@@ -50,7 +50,7 @@ function updateTechInfo(record) {
       if(typeof d.data.type !== "undefined") {
         $('#download-button .details').html(d.data.type+' ~ '+d.data.size);
       }
-      $('#file-download').attr('action', path+'/files/'+record.id+'/'+downloadSrc+'?download=true');
+      $('#file-download').attr('action', VuFind.getPath()+'/files/'+record.id+'/'+downloadSrc+'?download=true');
     },
     error:function(d,e) {
       console.log(d.responseText);
diff --git a/themes/bootstrap3/less/bootstrap.less b/themes/bootstrap3/less/bootstrap.less
index 0f64d8fcbe8edb907f7295f0fc461212110d9a5a..1a24f7a6e1e2647a5ac5e46005f6e6553cd34ed3 100644
--- a/themes/bootstrap3/less/bootstrap.less
+++ b/themes/bootstrap3/less/bootstrap.less
@@ -147,28 +147,31 @@ h3 {
 }
 
 /* --- Autocomplete --- */
-.twitter-typeahead {
-  vertical-align: top;
+.autocomplete-results {
+  margin-top: 2px;
+  border: 1px solid @list-group-border;
   background-color: #fff;
   border-radius: @border-radius-base;
-  @media (max-width: 767px) {width: 100%;}
-}
-.twitter-typeahead .tt-hint {display: none;}
-.tt-dropdown-menu {&:extend(.list-group);}
-.tt-suggestion {
-  &:extend(.list-group-item);
-  cursor: pointer;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  &.active {white-space: inherit;}
-  &.tt-cursor {
-    background-color: @brand-primary;
-    color: #fff;
-  }
+  overflow: hidden;
 
-  p {margin: 0;}
+  .item {
+    display: block;
+    padding-top: .75rem;
+    padding-right: 1rem;
+    padding-bottom: .75rem;
+    padding-left: 1.25rem;
+    border-bottom: 1px solid @list-group-border;
+    cursor: pointer;
+
+    &:last-child {border: 0;}
+    &.selected {
+      background-color: @brand-primary;
+      color: #fff;
+    }
+  }
 }
 
+
 /* --- Badges - blend the links in --- */
 .badge a {color: #fff;}
 
@@ -272,7 +275,7 @@ h3 {
   font-weight: bold;
   color: #000;
 }
-#tagList {
+.tagList {
   .tag {
     display: inline-block;
     margin: 0 1px 1px;
@@ -290,10 +293,10 @@ h3 {
     .button-size(@padding-base-vertical; @padding-base-vertical; @font-size-base; @line-height-base; @border-radius-base);
     .badge .fa {width: 12px;}
   }
+  button {border: 0;}
   .tag-form {display: inline;}
-  .tag-form button {border: 0;}
 }
-#tagList.loggedin .tag:not(.selected) .badge:hover {background-color: @brand-success;}
+.tagList.loggedin .tag:not(.selected) .badge:hover {background-color: @brand-success;}
 
 /* --- Search --- */
 .bulkActionButtons label {display: inline-block;}
diff --git a/themes/bootstrap3/templates/Recommend/EuropeanaResultsDeferred.phtml b/themes/bootstrap3/templates/Recommend/EuropeanaResultsDeferred.phtml
index 9e36fdf0f814a2b0ba84958a79c37be6265fab1d..626186af6ee6d0793bbc805e258001faa2268859 100644
--- a/themes/bootstrap3/templates/Recommend/EuropeanaResultsDeferred.phtml
+++ b/themes/bootstrap3/templates/Recommend/EuropeanaResultsDeferred.phtml
@@ -1,6 +1,6 @@
 <?
     // Set up Javascript for use below:
-    $loadJs = 'var url = path + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
+    $loadJs = 'var url = VuFind.getPath() + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
         . "\$('#EuropeanaDeferredRecommend').load(url);";
 ?>
 <div id="EuropeanaDeferredRecommend">
diff --git a/themes/bootstrap3/templates/Recommend/Libraryh3lp.phtml b/themes/bootstrap3/templates/Recommend/Libraryh3lp.phtml
index 623feb15aaf1d875fb56ff08dd6209df29f4eb94..8e6eb942647ecd1905c1b33e5a9b3292bf11f94b 100644
--- a/themes/bootstrap3/templates/Recommend/Libraryh3lp.phtml
+++ b/themes/bootstrap3/templates/Recommend/Libraryh3lp.phtml
@@ -1 +1 @@
-<iframe src="https://us.libraryh3lp.com/chat/<?=$this->escapeHtmlAttr($this->recommend->getChatId())?>?skin=<?=urlencode($this->recommend->getSkin())?>" frameborder="1" style="border: 2px inset black; width: 350px; height: 300px;"></iframe>
\ No newline at end of file
+<iframe src="https://us.libraryh3lp.com/chat/<?=$this->escapeHtmlAttr($this->recommend->getChatId())?>?skin=<?=urlencode($this->recommend->getSkin())?>"></iframe>
\ No newline at end of file
diff --git a/themes/bootstrap3/templates/Recommend/OpenLibrarySubjectsDeferred.phtml b/themes/bootstrap3/templates/Recommend/OpenLibrarySubjectsDeferred.phtml
index e3c0de443f1c9a42edca3f2b41bba42a15744889..abbddb3b7b532c59788fe4b7a7698c00d5cd3458 100644
--- a/themes/bootstrap3/templates/Recommend/OpenLibrarySubjectsDeferred.phtml
+++ b/themes/bootstrap3/templates/Recommend/OpenLibrarySubjectsDeferred.phtml
@@ -1,6 +1,6 @@
 <?
     // Set up Javascript for use below:
-    $loadJs = 'var url = path + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
+    $loadJs = 'var url = VuFind.getPath() + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
         . "\$('#openLibraryDeferredRecommend').load(url);";
 ?>
 <div id="openLibraryDeferredRecommend">
diff --git a/themes/bootstrap3/templates/Recommend/PubDateVisAjax.phtml b/themes/bootstrap3/templates/Recommend/PubDateVisAjax.phtml
index de51091a6658fe5cf344c2d0d652764de9a83bbd..fb19996e019d8a0187b4d197259c27c0ab4a6459 100644
--- a/themes/bootstrap3/templates/Recommend/PubDateVisAjax.phtml
+++ b/themes/bootstrap3/templates/Recommend/PubDateVisAjax.phtml
@@ -21,7 +21,7 @@
   <div id="dateVisColorSettings"><!-- do not delete! used for passing CSS to Javascript --></div>
   <?
     $js = "loadVis('" . $this->recommend->getFacetFields() . "', '"
-        . $this->recommend->getSearchParams() . "', path, "
+        . $this->recommend->getSearchParams() . "', VuFind.getPath(), "
         . $this->recommend->getZooming() . ");";
     echo $this->inlineScript(\Zend\View\Helper\HeadScript::SCRIPT, $js, 'SET');
   ?>
diff --git a/themes/bootstrap3/templates/Recommend/ResultGoogleMapAjax.phtml b/themes/bootstrap3/templates/Recommend/ResultGoogleMapAjax.phtml
index 542db2296537b9f4d20bdc931cdad489c13cfd72..341f452897c30552befa4d7459fcf8477589c02d 100644
--- a/themes/bootstrap3/templates/Recommend/ResultGoogleMapAjax.phtml
+++ b/themes/bootstrap3/templates/Recommend/ResultGoogleMapAjax.phtml
@@ -1,6 +1,6 @@
 <?
   $searchParams = $this->recommend->getSearchParams();
-  
+
   $this->headScript()->appendFile('https://maps.googleapis.com/maps/api/js?v=3.8&sensor=false&language='.$this->layout()->userLang);
   $this->headScript()->appendFile('https://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclustererplus/2.0.9/src/markerclusterer_packed.js');
 ?>
@@ -96,7 +96,7 @@ var myOptions;
 var map;
 var infowindow = new google.maps.InfoWindow({maxWidth: 480, minWidth: 480});
   function initialize() {
-    var url = path+'/AJAX/json?method=getMapData&<?=$searchParams ?>';
+    var url = VuFind.getPath()+'/AJAX/json?method=getMapData&<?=$searchParams ?>';
     //alert('go: ' + url);
     $.getJSON(url, function(data){
       //alert(data);
@@ -111,7 +111,7 @@ var infowindow = new google.maps.InfoWindow({maxWidth: 480, minWidth: 480});
         mapTypeControl: true,
         mapTypeControlOptions: {
             style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
-          },     
+          },
         mapTypeId: google.maps.MapTypeId.ROADMAP
       };
       map = new google.maps.Map(document.getElementById("map_canvas"),
@@ -171,7 +171,7 @@ var infowindow = new google.maps.InfoWindow({maxWidth: 480, minWidth: 480});
     else{// code for IE6, IE5
       xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
     }
-    var ajaxUrl = path+'/AJAX/ResultGoogleMapInfo?limit=5&filter[]=long_lat%3A"' + marker.loc_facet+'"&<?=$searchParams ?>';
+    var ajaxUrl = VuFind.getPath()+'/AJAX/ResultGoogleMapInfo?limit=5&filter[]=long_lat%3A"' + marker.loc_facet+'"&<?=$searchParams ?>';
     xmlhttp.open("GET", ajaxUrl, false);
     xmlhttp.send();
 
diff --git a/themes/bootstrap3/templates/Recommend/SummonBestBetsDeferred.phtml b/themes/bootstrap3/templates/Recommend/SummonBestBetsDeferred.phtml
index 4a009cc540382186e1ddcbb6a116018ce876428d..5a31f9811cc5efa3dfa09db356c9490c71d33f23 100644
--- a/themes/bootstrap3/templates/Recommend/SummonBestBetsDeferred.phtml
+++ b/themes/bootstrap3/templates/Recommend/SummonBestBetsDeferred.phtml
@@ -1,6 +1,6 @@
 <?
   // Set up Javascript for use below:
-  $loadJs = 'var url = path + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
+  $loadJs = 'var url = VuFind.getPath() + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
     . "\$('#SummonDeferredBestBets').load(url);";
 ?>
 <div id="SummonDeferredBestBets">
diff --git a/themes/bootstrap3/templates/Recommend/SummonDatabasesDeferred.phtml b/themes/bootstrap3/templates/Recommend/SummonDatabasesDeferred.phtml
index b174520d1816c3b60d15ab80dccb9307ba2e978f..454d5f42e805e2cfafcf89894ac558d125ffbff5 100644
--- a/themes/bootstrap3/templates/Recommend/SummonDatabasesDeferred.phtml
+++ b/themes/bootstrap3/templates/Recommend/SummonDatabasesDeferred.phtml
@@ -1,6 +1,6 @@
 <?
   // Set up Javascript for use below:
-  $loadJs = 'var url = path + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
+  $loadJs = 'var url = VuFind.getPath() + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
     . "\$('#SummonDeferredDatabases').load(url);";
 ?>
 <div id="SummonDeferredDatabases">
diff --git a/themes/bootstrap3/templates/Recommend/SummonResultsDeferred.phtml b/themes/bootstrap3/templates/Recommend/SummonResultsDeferred.phtml
index bfd83c9314684fec3c49da7a02133d2f78c83b2f..ed9b5d540068d96fa1310a27832172e45475f1ad 100644
--- a/themes/bootstrap3/templates/Recommend/SummonResultsDeferred.phtml
+++ b/themes/bootstrap3/templates/Recommend/SummonResultsDeferred.phtml
@@ -1,6 +1,6 @@
 <?
   // Set up Javascript for use below:
-  $loadJs = 'var url = path + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
+  $loadJs = 'var url = VuFind.getPath() + "/AJAX/Recommend?' . $this->recommend->getUrlParams() . '";'
     . "\$('#SummonDeferredRecommend').load(url);";
 ?>
 <div id="SummonDeferredRecommend">
diff --git a/themes/bootstrap3/templates/RecordDriver/EDS/core.phtml b/themes/bootstrap3/templates/RecordDriver/EDS/core.phtml
index 7c55930030919d1ef47a2d2c0a42ecc4a9aa2757..a5dfb0931484b7c6ac58f2e81047e5fd556f50f3 100644
--- a/themes/bootstrap3/templates/RecordDriver/EDS/core.phtml
+++ b/themes/bootstrap3/templates/RecordDriver/EDS/core.phtml
@@ -45,23 +45,6 @@
           </a>
         </span><br />
       <? endif; ?>
-      <? if (!empty($customLinks)): ?>
-        <span>
-          <div class="custom-links">
-            <? foreach ($customLinks as $customLink): ?>
-          <? $url = isset($customLink['Url']) ? $customLink['Url'] : '';
-              $mot = isset($customLink['MouseOverText'])? $customLink['MouseOverText'] : '';
-              $icon = isset ($customLink['Icon']) ? $customLink['Icon'] : '';
-              $name = isset($customLink['Name']) ? $customLink['Name'] : '';?>
-          <span>
-            <a href="<?=$this->escapeHtmlAttr($url)?>" target="_blank" title="<?=$mot?>" class="custom-link">
-              <? if ($icon): ?><img src="<?=$icon?>" /> <? endif; ?><?=$name?>
-            </a>
-          </span><br />
-            <? endforeach; ?>
-          </div>
-        </span>
-      <? endif; ?>
     </div>
   </div>
   <div class="col-sm-9">
@@ -104,5 +87,24 @@
         </tr>
       <? endif; ?>
     </table>
+
+    <div class="resultItemLine4 custom-links">
+
+    <? $customLinks = array_merge($this->driver->getFTCustomLinks(), $this->driver->getCustomLinks());
+    if (!empty($customLinks)): ?>
+      <? foreach ($customLinks as $customLink): ?>
+      <? $url = isset($customLink['Url']) ? $customLink['Url'] : '';
+          $mot = isset($customLink['MouseOverText'])? $customLink['MouseOverText'] : '';
+          $icon = isset ($customLink['Icon']) ? $customLink['Icon'] : '';
+          $name = isset($customLink['Text']) ? $customLink['Text'] : '';
+      ?>
+      <span>
+        <a href="<?=$this->escapeHtmlAttr($url)?>" target="_blank" title="<?=$this->escapeHtmlAttr($mot)?>" class="custom-link">
+          <? if ($icon): ?><img src="<?=$this->escapeHtmlAttr($icon)?>" /> <? endif; ?><?=$this->escapeHtml($name)?>
+        </a>
+      </span>
+      <? endforeach; ?>
+    <? endif; ?>
+    </div>
   </div>
 </div>
diff --git a/themes/bootstrap3/templates/RecordDriver/EDS/result-list.phtml b/themes/bootstrap3/templates/RecordDriver/EDS/result-list.phtml
index b805985f5adff28c1ed292d368bb7caab0a39cd6..8fe0ce63967346ca4752464fbcb5485e16bb7ce4 100644
--- a/themes/bootstrap3/templates/RecordDriver/EDS/result-list.phtml
+++ b/themes/bootstrap3/templates/RecordDriver/EDS/result-list.phtml
@@ -3,117 +3,118 @@
   $accessLevel = $this->driver->getAccessLevel();
   $restrictedView = empty($accessLevel) ? false : true;
 ?>
-<div class="source<?=$this->escapeHtmlAttr($this->driver->getResourceSource())?> recordId<?=$this->driver->supportsAjaxStatus()?' ajaxItemId':''?> col-xs-11">
-  <div class="row">
-    <div class="col-sm-2 col-xs-3 left">
-      <input type="hidden" value="<?=$this->escapeHtmlAttr($this->driver->getUniqueID())?>" class="hiddenId" />
-      <? if ($summThumb = $this->record($this->driver)->getThumbnail()): ?>
-          <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="_record_link">
-          <img src="<?=$this->escapeHtmlAttr($summThumb)?>" class="recordcover" alt="<?=$this->transEsc('Cover Image')?>"/>
-          </a>
-      <? else: ?>
-          <span class="recordcover pt-icon pt-<?=$this->driver->getPubTypeId()?>"></span>
-          <div><?=$this->transEsc($this->driver->getPubType())?></div>
-      <? endif; ?>
-    </div>
-    <div class="col-sm-7 col-xs-6 middle">
-      <?  $items  =  $this->driver->getItems();
-        if (isset($items) && !empty($items)) :
-          foreach ($items as $item):
-            if (!empty($item)): ?>
-              <div class="resultItemLine1">
-                <?if('Ti' == $item['Group']): ?>
-                  <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title _record_link" >
-                  <?=$item['Data']?> </a>
-                <?else:?>
+<div class="row col-xs-11 source<?=$this->escapeHtmlAttr($this->driver->getResourceSource())?> recordId<?=$this->driver->supportsAjaxStatus()?' ajaxItemId':''?>">
+  <input type="hidden" value="<?=$this->escapeHtmlAttr($this->driver->getUniqueID())?>" class="hiddenId" />
+  <div class="col-sm-2 left">
+    <? if ($summThumb = $this->record($this->driver)->getThumbnail()): ?>
+        <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="_record_link">
+        <img src="<?=$this->escapeHtmlAttr($summThumb)?>" class="recordcover" alt="<?=$this->transEsc('Cover Image')?>"/>
+        </a>
+    <? else: ?>
+        <span class="recordcover pt-icon pt-<?=$this->driver->getPubTypeId()?>"></span>
+        <div><?=$this->driver->getPubType()?></div>
+    <? endif; ?>
+  </div>
+  <div class="col-sm-7 middle">
+    <?  $items  =  $this->driver->getItems();
+      if (isset($items) && !empty($items)) :
+        foreach ($items as $item):
+          if (!empty($item)): ?>
+            <div class="resultItemLine1">
+              <?if('Ti' == $item['Group']): ?>
+                <a href="<?=$this->recordLink()->getUrl($this->driver)?>" class="title _record_link" >
+                <?=$item['Data']?> </a>
+              <?else:?>
                 <p>
                   <b><?=$this->transEsc($item['Label'])?>:</b>
                   <?=$item['Data']?>
                 </p>
-                <?endif;?>
-              </div>
-            <? endif;
-          endforeach;
-        elseif ($restrictedView): ?>
-          <div class="resultItemLine1">
-            <p>
-              <?=$this->transEsc('This result is not displayed to guests')?>
-              <br />
-              <a class="login" href="<?=$this->url('myresearch-home')?>">
-                <strong><?=$this->transEsc('Login for full access')?></strong>
-              </a>
-            </p>
-          </div>
-        <? endif; ?>
-      <? $customLinks = $this->driver->getCustomLinks();
-      if (!empty($customLinks)): ?>
-      <div class="resultItemLine4 custom-links">
-        <? foreach ($customLinks as $customLink): ?>
-        <? $url = isset($customLink['Url']) ? $customLink['Url'] : '';
-            $mot = isset($customLink['MouseOverText'])? $customLink['MouseOverText'] : '';
-            $icon = isset ($customLink['Icon']) ? $customLink['Icon'] : '';
-            $name = isset($customLink['Name']) ? $customLink['Name'] : '';?>
-        <span>
-          <a href="<?=$this->escapeHtmlAttr($url)?>" target="_blank" title="<?=$mot?>" class="custom-link">
-            <? if ($icon): ?><img src="<?=$icon?>" /> <? endif; ?><?=$name?>
-          </a>
-        </span>
-        <? endforeach; ?>
-      </div>
-      <? endif; ?>
-
-      <? if ($this->driver->hasHTMLFullTextAvailable()): ?>
-        <a href="<?= $this->recordLink()->getUrl($this->driver, 'fulltext') ?>#html" class="icon html fulltext _record_link">
-          <?=$this->transEsc('HTML Full Text')?>
-        </a>
-        &nbsp; &nbsp;
+              <?endif;?>
+            </div>
+          <? endif;
+        endforeach;
+      elseif ($restrictedView): ?>
+        <div class="resultItemLine1">
+          <p>
+            <?=$this->transEsc('This result is not displayed to guests')?>
+            <br />
+            <a class="login" href="<?=$this->url('myresearch-home')?>">
+              <strong><?=$this->transEsc('Login for full access')?></strong>
+            </a>
+          </p>
+        </div>
       <? endif; ?>
 
-      <? if ($this->driver->hasPdfAvailable()): ?>
-        <a href="<?= $this->recordLink()->getUrl($this->driver).'/PDF'; ?>" class="icon pdf fulltext">
-          <?=$this->transEsc('PDF Full Text')?>
+  <div class="resultItemLine4 custom-links">
+    <? $customLinks = array_merge($this->driver->getFTCustomLinks(), $this->driver->getCustomLinks());
+    if (!empty($customLinks)): ?>
+      <? foreach ($customLinks as $customLink): ?>
+      <? $url = isset($customLink['Url']) ? $customLink['Url'] : '';
+          $mot = isset($customLink['MouseOverText'])? $customLink['MouseOverText'] : '';
+          $icon = isset ($customLink['Icon']) ? $customLink['Icon'] : '';
+          $name = isset($customLink['Text']) ? $customLink['Text'] : '';
+      ?>
+      <span>
+        <a href="<?=$this->escapeHtmlAttr($url)?>" target="_blank" title="<?=$this->escapeHtmlAttr($mot)?>" class="custom-link">
+          <? if ($icon): ?><img src="<?=$this->escapeHtmlAttr($icon)?>" /> <? endif; ?><?=$this->escapeHtml($name)?>
         </a>
-      <? endif; ?>
+      </span>
+      <? endforeach; ?>
+    <? endif; ?>
     </div>
-    <div class="col-sm-3 right hidden-print">
-      <? /* Display qrcode if appropriate: */ ?>
-      <? if ($QRCode = $this->record($this->driver)->getQRCode("results")): ?>
-        <?
-          // Add JS Variables for QrCode
-          $this->jsTranslations()->addStrings(array('qrcode_hide' => 'qrcode_hide', 'qrcode_show' => 'qrcode_show'));
-        ?>
-        <span class="hidden-xs">
-          <i class="fa fa-fw fa-qrcode"></i> <a href="<?=$this->escapeHtmlAttr($QRCode);?>" class="qrcodeLink"><?=$this->transEsc('qrcode_show')?></a>
-          <div class="qrcode hidden">
-            <script type="text/template" class="qrCodeImgTag">
-              <img alt="<?=$this->transEsc('QR Code')?>" src="<?=$this->escapeHtmlAttr($QRCode);?>"/>
-            </script>
-          </div><br/>
-        </span>
-      <? endif; ?>
 
-      <? if ($this->userlist()->getMode() !== 'disabled'): ?>
-        <? /* Add to favorites */ ?>
-        <i class="fa fa-fw fa-star"></i> <a href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" class="save-record modal-link" id="<?=$this->driver->getUniqueId() ?>" title="<?=$this->transEsc('Add to favorites')?>"><?=$this->transEsc('Add to favorites')?></a><br/>
+    <? if ($this->driver->hasHTMLFullTextAvailable()): ?>
+      <a href="<?= $this->recordLink()->getUrl($this->driver, 'fulltext') ?>#html" class="icon html fulltext _record_link" target="_blank">
+        <?=$this->transEsc('HTML Full Text')?>
+      </a>
+      &nbsp; &nbsp;
+    <? endif; ?>
 
-        <? /* Saved lists */ ?>
-        <div class="savedLists alert alert-info hidden">
-          <strong><?=$this->transEsc("Saved in")?>:</strong>
-        </div>
-      <? endif; ?>
+    <? if ($this->driver->hasPdfAvailable()): ?>
+      <a href="<?= $this->recordLink()->getUrl($this->driver).'/PDF'; ?>" class="icon pdf fulltext" target="_blank">
+        <?=$this->transEsc('PDF Full Text')?>
+      </a>
+    <? endif; ?>
+  </div>
 
-      <? /* Hierarchy tree link */ ?>
-      <? $trees = $this->driver->tryMethod('getHierarchyTrees'); if (!empty($trees)): ?>
-        <? foreach ($trees as $hierarchyID => $hierarchyTitle): ?>
-          <div class="hierarchyTreeLink">
-            <input type="hidden" value="<?=$this->escapeHtmlAttr($hierarchyID)?>" class="hiddenHierarchyId" />
-            <i class="fa fa-fw fa-sitemap"></i>
-            <a class="hierarchyTreeLinkText modal-link" href="<?=$this->recordLink()->getTabUrl($this->driver, 'HierarchyTree')?>?hierarchy=<?=urlencode($hierarchyID)?>#tabnav" title="<?=$this->transEsc('hierarchy_tree')?>">
-              <?=$this->transEsc('hierarchy_view_context')?><? if (count($trees) > 1): ?>: <?=$this->escapeHtml($hierarchyTitle)?><? endif; ?>
-            </a>
-          </div>
-        <? endforeach; ?>
-      <? endif; ?>
-    </div>
+  <div class="col-sm-2 right hidden-print">
+    <? /* Display qrcode if appropriate: */ ?>
+    <? if ($QRCode = $this->record($this->driver)->getQRCode("results")): ?>
+      <?
+        // Add JS Variables for QrCode
+        $this->jsTranslations()->addStrings(array('qrcode_hide' => 'qrcode_hide', 'qrcode_show' => 'qrcode_show'));
+      ?>
+      <span class="hidden-xs">
+        <i class="fa fa-fw fa-qrcode"></i> <a href="<?=$this->escapeHtmlAttr($QRCode);?>" class="qrcodeLink"><?=$this->transEsc('qrcode_show')?></a>
+        <div class="qrcode hidden">
+          <script type="text/template" class="qrCodeImgTag">
+            <img alt="<?=$this->transEsc('QR Code')?>" src="<?=$this->escapeHtmlAttr($QRCode);?>"/>
+          </script>
+        </div><br/>
+      </span>
+    <? endif; ?>
+
+    <? if ($this->userlist()->getMode() !== 'disabled'): ?>
+      <? /* Add to favorites */ ?>
+      <i class="fa fa-fw fa-star"></i> <a href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" class="save-record modal-link" id="<?=$this->driver->getUniqueId() ?>" title="<?=$this->transEsc('Add to favorites')?>"><?=$this->transEsc('Add to favorites')?></a><br/>
+
+      <? /* Saved lists */ ?>
+      <div class="savedLists alert alert-info hidden">
+        <strong><?=$this->transEsc("Saved in")?>:</strong>
+      </div>
+    <? endif; ?>
+
+    <? /* Hierarchy tree link */ ?>
+    <? $trees = $this->driver->tryMethod('getHierarchyTrees'); if (!empty($trees)): ?>
+      <? foreach ($trees as $hierarchyID => $hierarchyTitle): ?>
+        <div class="hierarchyTreeLink">
+          <input type="hidden" value="<?=$this->escapeHtmlAttr($hierarchyID)?>" class="hiddenHierarchyId" />
+          <i class="fa fa-fw fa-sitemap"></i>
+          <a class="hierarchyTreeLinkText modal-link" href="<?=$this->recordLink()->getTabUrl($this->driver, 'HierarchyTree')?>?hierarchy=<?=urlencode($hierarchyID)?>#tabnav" title="<?=$this->transEsc('hierarchy_tree')?>">
+            <?=$this->transEsc('hierarchy_view_context')?><? if (count($trees) > 1): ?>: <?=$this->escapeHtml($hierarchyTitle)?><? endif; ?>
+          </a>
+        </div>
+      <? endforeach; ?>
+    <? endif; ?>
   </div>
 </div>
\ No newline at end of file
diff --git a/themes/bootstrap3/templates/RecordDriver/SolrDefault/core.phtml b/themes/bootstrap3/templates/RecordDriver/SolrDefault/core.phtml
index 2ab7f901b397cdd94834c88ddcabce447d937fb3..6bf943b6ed6ed27b41bb94e83f730fe49e176942 100644
--- a/themes/bootstrap3/templates/RecordDriver/SolrDefault/core.phtml
+++ b/themes/bootstrap3/templates/RecordDriver/SolrDefault/core.phtml
@@ -7,7 +7,7 @@
   }
 ?>
 <div class="row" vocab="http://schema.org/" resource="#record" typeof="<?=$this->driver->getSchemaOrgFormats()?> Product">
-  <? $QRCode = $this->record($this->driver)->getQRCode("core"); 
+  <? $QRCode = $this->record($this->driver)->getQRCode("core");
      $cover = $this->record($this->driver)->getCover('core', 'medium', $this->record($this->driver)->getThumbnail('large'));
      $preview = $this->record($this->driver)->getPreviews(); ?>
   <? if ($QRCode || $cover || $preview): ?>
@@ -51,7 +51,7 @@
 
     <? if ($this->userlist()->getMode() !== 'disabled'): ?>
       <? /* Display the lists that this record is saved to */ ?>
-      <div class="savedLists hidden alert alert-info" id="savedLists">
+      <div class="savedLists hidden alert alert-info">
         <strong><?=$this->transEsc("Saved in")?>:</strong>
       </div>
     <? endif; ?>
@@ -257,7 +257,7 @@
         <tr>
           <th><?=$this->transEsc('Tags')?>: </th>
           <td>
-            <a id="tagRecord" class="btn btn-link modal-link pull-right flip" href="<?=$this->recordLink()->getActionUrl($this->driver, 'AddTag')?>" title="<?=$this->transEsc('Add Tag')?>">
+            <a class="tag-record btn btn-link pull-right flip" href="<?=$this->recordLink()->getActionUrl($this->driver, 'AddTag')?>" title="<?=$this->transEsc('Add Tag')?>">
               <i class="fa fa-plus"></i> <?=$this->transEsc('Add Tag')?>
             </a>
             <?=$this->context($this)->renderInContext('record/taglist', array('tagList'=>$tagList, 'loggedin'=>$loggedin)) ?>
diff --git a/themes/bootstrap3/templates/RecordDriver/SolrDefault/result-list.phtml b/themes/bootstrap3/templates/RecordDriver/SolrDefault/result-list.phtml
index 120c3a1675658a957287b27a53976d8ff0689e50..0c0a1a5ded74a709c0b2feb3d63647ae88ad33a4 100644
--- a/themes/bootstrap3/templates/RecordDriver/SolrDefault/result-list.phtml
+++ b/themes/bootstrap3/templates/RecordDriver/SolrDefault/result-list.phtml
@@ -156,7 +156,7 @@
 
       <? if ($this->userlist()->getMode() !== 'disabled'): ?>
         <? /* Add to favorites */ ?>
-        <i class="fa fa-fw fa-star"></i> <a href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" class="save-record modal-link" id="<?=$this->driver->getUniqueId() ?>" title="<?=$this->transEsc('Add to favorites')?>"><?=$this->transEsc('Add to favorites')?></a><br/>
+        <i class="fa fa-fw fa-star"></i> <a href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" class="save-record modal-link" data-id="<?=$this->driver->getUniqueId() ?>" title="<?=$this->transEsc('Add to favorites')?>"><?=$this->transEsc('Add to favorites')?></a><br/>
 
         <? /* Saved lists */ ?>
         <div class="savedLists alert alert-info hidden">
diff --git a/themes/bootstrap3/templates/RecordDriver/SolrDefault/toolbar.phtml b/themes/bootstrap3/templates/RecordDriver/SolrDefault/toolbar.phtml
index 5045ca477e5e36702821c47c56f80b9e99623e24..4931a548f302f51c3d956a8738e7f9f6d0917911 100644
--- a/themes/bootstrap3/templates/RecordDriver/SolrDefault/toolbar.phtml
+++ b/themes/bootstrap3/templates/RecordDriver/SolrDefault/toolbar.phtml
@@ -12,10 +12,10 @@
 ?>
 <ul class="nav nav-pills hidden-print">
   <? if (count($this->driver->getCitationFormats()) > 0): ?>
-    <li><a id="cite-record" class="modal-link <?=$controllerClass?>" href="<?=$this->url('record-cite', array('id'=>$id)) ?>" title="<?=$this->transEsc('Cite this')?>" rel="nofollow"><i class="fa fa-asterisk"></i> <?=$this->transEsc('Cite this')?></a></li>
+    <li><a class="cite-record modal-link <?=$controllerClass?>" href="<?=$this->url('record-cite', array('id'=>$id)) ?>" title="<?=$this->transEsc('Cite this')?>" rel="nofollow"><i class="fa fa-asterisk"></i> <?=$this->transEsc('Cite this')?></a></li>
   <? endif; ?>
-  <li><a id="sms-record" class="modal-link <?=$controllerClass?>" href="<?=$this->url('record-sms', array('id'=>$id)) ?>" title="<?=$this->transEsc('Text this')?>" rel="nofollow"><i class="fa fa-mobile"></i> <?=$this->transEsc('Text this')?></a></li>
-  <li><a id="mail-record" class="modal-link <?=$controllerClass?>" href="<?=$this->url('record-email', array('id'=>$id)) ?>" title="<?=$this->transEsc('Email this')?>" rel="nofollow"><i class="fa fa-envelope"></i> <?=$this->transEsc('Email this')?></a></li>
+  <li><a class="sms-record modal-link <?=$controllerClass?>" href="<?=$this->url('record-sms', array('id'=>$id)) ?>" title="<?=$this->transEsc('Text this')?>" rel="nofollow"><i class="fa fa-mobile"></i> <?=$this->transEsc('Text this')?></a></li>
+  <li><a class="mail-record modal-link <?=$controllerClass?>" href="<?=$this->url('record-email', array('id'=>$id)) ?>" title="<?=$this->transEsc('Email this')?>" rel="nofollow"><i class="fa fa-envelope"></i> <?=$this->transEsc('Email this')?></a></li>
 
   <? $exportFormats = $this->export()->getFormatsForRecord($this->driver); ?>
   <? if(count($exportFormats) > 0): ?>
@@ -30,16 +30,16 @@
   <? endif; ?>
 
   <? if ($this->userlist()->getMode() !== 'disabled'): ?>
-    <li><a id="save-record" class="modal-link <?=$controllerClass?>" href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" title="<?=$this->transEsc('Add to favorites')?>" rel="nofollow"><i class="fa fa-star"></i> <?=$this->transEsc('Add to favorites')?></a></li>
+    <li><a class="save-record modal-link <?=$controllerClass?>" href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" title="<?=$this->transEsc('Add to favorites')?>" rel="nofollow"><i class="fa fa-star"></i> <?=$this->transEsc('Add to favorites')?></a></li>
   <? endif; ?>
   <? if (!empty($addThis)): ?>
     <li><a class="addThis addthis_button" href="https://www.addthis.com/bookmark.php?v=250&amp;pub=<?=urlencode($addThis)?>"><i class="fa fa-bookmark"></i> <?=$this->transEsc('Bookmark')?></a></li>
   <? endif; ?>
   <? if ($cart->isActive()): ?>
-    <li id="bookbag-menu">
-      <input id="cartId" type="hidden" name="ids[]" value="<?=$this->escapeHtmlAttr($cartId)?>" />
-      <a id="cart-add" class="<? if(!$cart->contains($cartId)): ?>correct <? endif ?>hidden" href="#"><i class="fa fa-plus"></i> <?=$this->transEsc('Add to Book Bag') ?></a>
-      <a id="cart-remove" class="<? if($cart->contains($cartId)): ?>correct <? endif ?>hidden" href="#"><i class="fa fa-minus-circle"></i> <?=$this->transEsc('Remove from Book Bag') ?></a>
+    <li class="bookbag-menu">
+      <input class="cartId" type="hidden" name="ids[]" value="<?=$this->escapeHtmlAttr($cartId)?>" />
+      <a class="cart-add hidden<? if(!$cart->contains($cartId)): ?> correct<? endif ?>" href="#"><i class="fa fa-plus"></i> <?=$this->transEsc('Add to Book Bag') ?></a>
+      <a class="cart-remove hidden<? if($cart->contains($cartId)): ?> correct<? endif ?>"href="#"><i class="fa fa-minus-circle"></i> <?=$this->transEsc('Remove from Book Bag') ?></a>
       <noscript>
         <form method="post" name="addForm" action="<?=$this->url('cart-home')?>">
           <input type="hidden" name="ids[]" value="<?=$this->escapeHtmlAttr($cartId)?>" />
diff --git a/themes/bootstrap3/templates/RecordTab/usercomments.phtml b/themes/bootstrap3/templates/RecordTab/usercomments.phtml
index 4ec13a48f4a99a6866867df707f3573e6a9da1b7..7157b9cbaa7b11f8faca5f48f9df877228810620 100644
--- a/themes/bootstrap3/templates/RecordTab/usercomments.phtml
+++ b/themes/bootstrap3/templates/RecordTab/usercomments.phtml
@@ -3,10 +3,10 @@
   $this->headTitle($this->translate('Comments') . ': ' . $this->driver->getBreadcrumb());
 ?>
 
-<div id="commentList">
+<div class="comment-list">
   <?=$this->render('record/comments-list.phtml')?>
 </div>
-<form class="comment" action="<?=$this->recordLink()->getActionUrl($this->driver, 'AddComment')?>" method="post">
+<form class="comment-form" action="<?=$this->recordLink()->getActionUrl($this->driver, 'AddComment')?>" method="post">
   <div class="row">
     <div class="col-sm-3 name">
       <input type="hidden" name="id" value="<?=$this->escapeHtmlAttr($this->driver->getUniqueId())?>"/>
@@ -16,10 +16,10 @@
     <div class="col-sm-9">
       <? $user = $this->auth()->isLoggedIn() ?>
       <? if($user): ?>
-        <textarea id="comment" name="comment" class="form-control" rows="3" required></textarea><br/>
+        <textarea name="comment" class="form-control" rows="3" required></textarea><br/>
         <input class="btn btn-primary" data-loading-text="<?=$this->transEsc('Submitting') ?>..." type="submit" value="<?=$this->transEsc("Add your comment")?>"/>
       <? else: ?>
-        <textarea id="comment" name="comment" class="form-control" rows="3" disabled></textarea><br/>
+        <textarea name="comment" class="form-control" rows="3" disabled></textarea><br/>
         <input onClick="Lightbox.get('MyResearch', 'UserLogin'); return false;" class="btn btn-primary" type="submit" value="<?=$this->transEsc("You must be logged in first")?>"/>
       <? endif; ?>
     </div>
diff --git a/themes/bootstrap3/templates/cart/cart.phtml b/themes/bootstrap3/templates/cart/cart.phtml
index 271a063cab1790f0eda8fc2f788eb9f06f2633ae..a6a1b0efc59b6b7f0c6359c9c21e4298cf3678ba 100644
--- a/themes/bootstrap3/templates/cart/cart.phtml
+++ b/themes/bootstrap3/templates/cart/cart.phtml
@@ -71,8 +71,8 @@
       return function() {location.reload()}
     }
   }
-  function submitCartForm(elem, data) {
-    var url = path+'/AJAX/JSON?method=getLightbox&submodule=Cart&subaction=Home';
+  function submitCartForm(elem, data) {
+    var url = VuFind.getPath() + '/AJAX/JSON?method=getLightbox&submodule=Cart&subaction=Home';
     $.post(url, data, determineCallback(elem));
   }
   function submitFormWithIds(elem, data) {
@@ -102,7 +102,7 @@
     var form = $(this).closest('form')[0];
     var checkboxes = form.querySelectorAll('[name="ids[]"]:checked');
     if(checkboxes.length == 0) {
-      Lightbox.displayError(vufindString['bulk_noitems_advice']);
+      Lightbox.displayError(VuFind.translate('bulk_noitems_advice'));
       return false;
     }
   });
diff --git a/themes/bootstrap3/templates/collection/view.phtml b/themes/bootstrap3/templates/collection/view.phtml
index fc75b7176a7b1e158ae0e95d11420ba036953894..eb032151297221cfb3a16a2ff0c4cc063d3bd17d 100644
--- a/themes/bootstrap3/templates/collection/view.phtml
+++ b/themes/bootstrap3/templates/collection/view.phtml
@@ -57,32 +57,38 @@
 
     <? if (count($this->tabs) > 0): ?>
       <a name="tabnav"></a>
-      <ul class="recordTabs nav nav-tabs">
-        <? foreach ($this->tabs as $tab => $obj): ?>
-        <? // add current tab to breadcrumbs if applicable:
-          $desc = $obj->getDescription();
-          $tab_classes = array();
-          if (0 === strcasecmp($this->activeTab, $tab)) {
-            $tab_classes[] = 'active';
-            $this->layout()->breadcrumbs .= ' <li class="active">' . $this->transEsc($desc) . '</li>';
-            $activeTabObj = $obj;
-          }
-          if (!$obj->isVisible()) { $tab_classes[] = 'hidden'; }
-          if (!$obj->supportsAjax()) { $tab_classes[] = 'noajax'; }
-        ?>
-        <li<?=count($tab_classes) > 0 ? ' class="' . implode(' ', $tab_classes) . '"' : ''?>>
-          <a id="<?=strtolower($tab) ?>" href="<?=$this->recordLink()->getTabUrl($this->driver, $tab)?>#tabnav"><?=$this->transEsc($desc)?></a>
-        </li>
-        <? endforeach; ?>
-      </ul>
-    <? endif; ?>
-
+      <div class="record-tabs">
+        <ul class="nav nav-tabs">
+          <? foreach ($this->tabs as $tab => $obj): ?>
+            <? // add current tab to breadcrumbs if applicable:
+              $desc = $obj->getDescription();
+              $tab_classes = array();
+              if (0 === strcasecmp($this->activeTab, $tab)) {
+                if (!$this->ajaxTabs || !$obj->supportsAjax()) {
+                  $tab_classes[] = 'active';
+                }
+                $tab_classes[] = 'initiallyActive';
+                $this->layout()->breadcrumbs .= '<li class="active">' . $this->transEsc($desc) . '</li>';
+                $activeTabObj = $obj;
+              }
+              if (!$obj->isVisible()) { $tab_classes[] = 'hidden'; }
+              if (!$obj->supportsAjax()) { $tab_classes[] = 'noajax'; }
+            ?>
+            <li<?=count($tab_classes) > 0 ? ' class="' . implode(' ', $tab_classes) . '"' : ''?>>
+              <a class="<?=strtolower($tab) ?>" href="<?=$this->recordLink()->getTabUrl($this->driver, $tab)?>#tabnav"><?=$this->transEsc($desc)?></a>
+            </li>
+          <? endforeach; ?>
+        </ul>
 
-    <div class="collectionDetails<?=$tree ? 'Tree' : ''?> tab-content" id="record-tabs">
-      <div class="tab-pane active" id="<?=$this->activeTab ?>-tab">
-        <?=isset($activeTabObj) ? $this->record($this->driver)->getTab($activeTabObj) : '' ?>
+        <div class="tab-content collectionDetails<?=$tree ? 'Tree' : ''?>">
+          <? if (!$this->ajaxTabs || !isset($activeTabObj) || !$activeTabObj->supportsAjax()): ?>
+            <div class="tab-pane active <?=$this->activeTab ?>-tab">
+              <?=isset($activeTabObj) ? $this->record($this->driver)->getTab($activeTabObj) : '' ?>
+            </div>
+          <? endif; ?>
+        </div>
       </div>
-    </div>
+    <? endif; ?>
 
     <?=$this->driver->supportsCoinsOpenURL()?'<span class="Z3988" title="'.$this->escapeHtmlAttr($this->driver->getCoinsOpenURL()).'"></span>':''?>
   </div>
@@ -95,3 +101,4 @@
     </div>
   <? endif; ?>
 </div>
+<?=$this->inlineScript(\Zend\View\Helper\HeadScript::SCRIPT, '$(document).ready(recordDocReady);', 'SET'); ?>
diff --git a/themes/bootstrap3/templates/feedback/home.phtml b/themes/bootstrap3/templates/feedback/home.phtml
index 42b3c6b88ec803828c3bd5db2801aa0081e3bf44..53109c28fd21ca0a00416681d6999865e5ba96b0 100644
--- a/themes/bootstrap3/templates/feedback/home.phtml
+++ b/themes/bootstrap3/templates/feedback/home.phtml
@@ -1,6 +1,6 @@
 <?
     // Set page title
-    $this->headTitle($this->translate('Feedback Email'));
+    $this->headTitle($this->translate('Feedback'));
     // Get rid of the feedback tab since this uses the same variables
     $this->layout()->feedbacktab = false;
 ?>
diff --git a/themes/bootstrap3/templates/layout/layout.phtml b/themes/bootstrap3/templates/layout/layout.phtml
index e9cb2e0784fd03d00b16646d92852e500449a13a..05f797740b384b9fa526a2de721395bbcb557c20 100644
--- a/themes/bootstrap3/templates/layout/layout.phtml
+++ b/themes/bootstrap3/templates/layout/layout.phtml
@@ -25,11 +25,8 @@
     <?=$this->headLink()?>
     <?=$this->headStyle()?>
     <?
-      // Set global path for Javascript code:
-      $this->headScript()->prependScript("path = '" . rtrim($this->url('home'), '/') . "';");
-
-      // Deal with cart stuff:
       if (!isset($this->renderingError)) {
+        // Add translation strings
         $this->jsTranslations()->addStrings(
           array(
             'add_tag_success' => 'add_tag_success',
@@ -37,6 +34,7 @@
             'bulk_noitems_advice' => 'bulk_noitems_advice',
             'bulk_save_success' => 'bulk_save_success',
             'close' => 'close',
+            'go_to_list' => 'go_to_list',
             'libphonenumber_invalid' => 'libphonenumber_invalid',
             'libphonenumber_invalidcountry' => 'libphonenumber_invalidcountry',
             'libphonenumber_invalidregion' => 'libphonenumber_invalidregion',
@@ -49,6 +47,19 @@
             'number_thousands_separator' => ['number_thousands_separator', null, ',']
           )
         );
+        // Add libphonenumber.js strings
+        $this->jsTranslations()->addStrings(
+          array(
+            "'Phone number invalid'" => 'libphonenumber_invalid',
+            "'Invalid country calling code'" => 'libphonenumber_invalidcountry',
+            "'Invalid region code'" => 'libphonenumber_invalidregion',
+            "'The string supplied did not seem to be a phone number'" => 'libphonenumber_notanumber',
+            "'The string supplied is too long to be a phone number'" => 'libphonenumber_toolong',
+            "'The string supplied is too short to be a phone number'" => 'libphonenumber_tooshort',
+            "'Phone number too short after IDD'" => 'libphonenumber_tooshortidd'
+          )
+        );
+        // Deal with cart stuff:
         $cart = $this->cart();
         if ($cart->isActive()) {
           $this->headScript()->appendFile("vendor/cookies.js");
@@ -72,7 +83,6 @@
             )
           );
         }
-        $this->headScript()->appendScript($this->jsTranslations()->getScript());
         $this->headScript()->appendScript(
           'var userIsLoggedIn = ' . ($this->auth()->isLoggedIn() ? 'true' : 'false') . ';'
         );
@@ -85,6 +95,13 @@
           $this->headScript()->appendFile("keep_alive.js");
       }
     ?>
+    <?
+      $root = rtrim($this->url('home'), '/');
+      $translations = $this->jsTranslations()->getJSON();
+      $dsb = DEFAULT_SEARCH_BACKEND;
+      $setupJS = "var VuFind = new VuFindNamespace('{$root}', {$translations}, '{$dsb}');";
+      $this->headScript()->appendScript($setupJS);
+    ?>
     <?=$this->headScript()?>
   </head>
   <body class="<?=$this->layoutClass('offcanvas-row')?><? if ($this->layout()->rtl): ?> rtl<? endif; ?>">
diff --git a/themes/bootstrap3/templates/myresearch/account.phtml b/themes/bootstrap3/templates/myresearch/account.phtml
index 22e742f9f2dc645ac81aac466b1c94d11b019a2a..dbd29f4ba831f87d4881cb4be485d79eaea5d45a 100644
--- a/themes/bootstrap3/templates/myresearch/account.phtml
+++ b/themes/bootstrap3/templates/myresearch/account.phtml
@@ -10,7 +10,13 @@
 
 <form method="post" name="accountForm" id="accountForm" class="form-horizontal" data-toggle="validator" role="form">
   <?=$this->auth()->getCreateFields()?>
-  <?=$this->recaptcha()->html($this->useRecaptcha) ?>
+  <? if ($this->useRecaptcha): ?>
+    <div class="form-group">
+      <div class="col-sm-9 col-sm-offset-3">
+        <?=$this->recaptcha()->html($this->useRecaptcha) ?>
+      </div>
+    </div>
+  <? endif; ?>
   <div class="form-group">
     <div class="col-sm-3">
       <a class="back-to-login btn btn-link" href="<?=$this->url('myresearch-userlogin') ?>"><i class="fa fa-chevron-left"></i> <?=$this->transEsc('Back')?></a>
diff --git a/themes/bootstrap3/templates/myresearch/checkedout.phtml b/themes/bootstrap3/templates/myresearch/checkedout.phtml
index 212a0225b371c7dda6da2b42e48980a0701c7b55..24b85895a3ec915203fa648d1df3127fc725aad6 100644
--- a/themes/bootstrap3/templates/myresearch/checkedout.phtml
+++ b/themes/bootstrap3/templates/myresearch/checkedout.phtml
@@ -17,8 +17,14 @@
       <? if ($this->renewForm): ?>
       <form name="renewals" method="post" id="renewals">
         <div class="toolbar">
-          <input type="submit" class="btn btn-default" name="renewSelected" value="<?=$this->transEsc("renew_selected")?>" />
-          <input type="submit" class="btn btn-default" name="renewAll" value="<?=$this->transEsc('renew_all')?>" />
+          <div class="checkbox">
+            <label>
+              <input type="checkbox" name="selectAll" class="checkbox-select-all"/>
+              <?=$this->transEsc('select_page')?> |
+            </label>
+            <input type="submit" class="btn btn-default" name="renewSelected" value="<?=$this->transEsc("renew_selected")?>" />
+            <input type="submit" class="btn btn-default" name="renewAll" value="<?=$this->transEsc('renew_all')?>" />
+          </div>
         </div>
       <? endif; ?>
 
@@ -55,7 +61,8 @@
           <? if ($this->renewForm): ?>
             <? if (isset($ilsDetails['renewable']) && $ilsDetails['renewable'] && isset($ilsDetails['renew_details'])): ?>
               <? $safeId = preg_replace('/[^a-zA-Z0-9]/', '', $ilsDetails['renew_details']); ?>
-              <input class="pull-left flip" type="checkbox" name="renewSelectedIDS[]" value="<?=$this->escapeHtmlAttr($ilsDetails['renew_details'])?>" id="checkbox_<?=$safeId?>" />
+              <input class="pull-left flip checkbox-select-item" type="checkbox" name="renewSelectedIDS[]" value="<?=$this->escapeHtmlAttr($ilsDetails['renew_details'])?>" id="checkbox_<?=$safeId?>" />
+              <input class="pull-left flip" type="hidden" name="selectAllIDS[]" value="<?=$this->escapeHtmlAttr($ilsDetails['renew_details'])?>" />
               <input class="pull-left flip" type="hidden" name="renewAllIDS[]" value="<?=$this->escapeHtmlAttr($ilsDetails['renew_details'])?>" />
             <? endif; ?>
           <? endif; ?>
diff --git a/themes/bootstrap3/templates/myresearch/menu.phtml b/themes/bootstrap3/templates/myresearch/menu.phtml
index d56da0d5d197ae45279b4b2c319eba3c1ad163af..14ebab3eb0f7449170c55946ecb18fe73f8cdb16 100644
--- a/themes/bootstrap3/templates/myresearch/menu.phtml
+++ b/themes/bootstrap3/templates/myresearch/menu.phtml
@@ -50,10 +50,12 @@
       </a>
     <? endif; ?>
   <? endif; ?>
-  <a href="<?=$this->url('search-history')?>?require_login" class="list-group-item<?=$this->active == 'history' ? ' active' : ''?>">
-    <?=$this->transEsc('history_saved_searches')?>
-    <span class="pull-right flip"><i class="fa fa-fw fa-search"></i></span>
-  </a>
+  <? if ($this->accountCapabilities()->getSavedSearchSetting() === 'enabled'): ?>
+    <a href="<?=$this->url('search-history')?>?require_login" class="list-group-item<?=$this->active == 'history' ? ' active' : ''?>">
+      <?=$this->transEsc('history_saved_searches')?>
+      <span class="pull-right flip"><i class="fa fa-fw fa-search"></i></span>
+    </a>
+  <? endif; ?>
   <? if ($user = $this->auth()->isLoggedIn()): ?>
     <a href="<?=$this->url('myresearch-logout')?>" class="list-group-item">
       <?=$this->transEsc("Log Out")?>
diff --git a/themes/bootstrap3/templates/record/taglist.phtml b/themes/bootstrap3/templates/record/taglist.phtml
index 1999468d381e7db5e07109fa8284d2bf2abee9aa..136e00d24f98424de690b6217a2ffec590738db1 100644
--- a/themes/bootstrap3/templates/record/taglist.phtml
+++ b/themes/bootstrap3/templates/record/taglist.phtml
@@ -1,4 +1,4 @@
-<div id="tagList"<?=$loggedin ? ' class="loggedin"' : ''?>>
+<div class="tagList<?=$loggedin ? ' loggedin' : ''?>">
   <? if (count($tagList) > 0): ?>
     <? foreach ($tagList as $tag): ?>
       <? $is_me = isset($tag['is_me']) && !is_null($tag['is_me']) ? $tag['is_me'] : false; ?>
@@ -7,7 +7,7 @@
         <? if($loggedin): ?>
           <form method="POST" action="<?=$this->recordLink()->getActionUrl($this->driver, $is_me ? 'DeleteTag' : 'AddTag') ?>" class="tag-form">
             <input type="hidden" name="tag" value="<?=$this->escapeHtmlAttr($tag['tag'])?>"/>
-            <button type="submit" class="badge" onClick="ajaxTagUpdate('<?=$this->escapeHtmlAttr($tag['tag'])?>', <?=$is_me ? 'true' : 'false' ?>);return false;"><?=$this->escapeHtml($tag['cnt']) ?>
+            <button type="submit" class="badge" onClick="ajaxTagUpdate(this, '<?=$this->escapeHtmlAttr($tag['tag'])?>', <?=$is_me ? 'true' : 'false' ?>);return false;"><?=$this->escapeHtml($tag['cnt']) ?>
             <? if($is_me): ?>
               <i class="fa fa-close"></i>
             <? else: ?>
diff --git a/themes/bootstrap3/templates/record/view.phtml b/themes/bootstrap3/templates/record/view.phtml
index 487dc44a715eb10f21f15a27e76c123db41ba50b..8a5c087c1745a7175cf08ceb06da18bfd2f6be99 100644
--- a/themes/bootstrap3/templates/record/view.phtml
+++ b/themes/bootstrap3/templates/record/view.phtml
@@ -42,8 +42,8 @@
 
 <div class="row">
   <div class="<?=$this->layoutClass('mainbody')?>">
-    <div class="record recordId source<?=$this->escapeHtmlAttr($this->driver->getResourceSource())?>" id="record">
-      <input type="hidden" value="<?=$this->escapeHtmlAttr($this->driver->getUniqueId())?>" class="hiddenId" id="record_id" />
+    <div class="record source<?=$this->escapeHtmlAttr($this->driver->getResourceSource())?>">
+      <input type="hidden" value="<?=$this->escapeHtmlAttr($this->driver->getUniqueId())?>" class="hiddenId" />
       <input type="hidden" value="<?=$this->escapeHtmlAttr($this->driver->getResourceSource()) ?>" class="hiddenSource" />
       <?=$this->flashmessages()?>
       <?=$this->record($this->driver)->getCoreMetadata()?>
@@ -51,32 +51,38 @@
 
     <? if (count($this->tabs) > 0): ?>
       <a name="tabnav"></a>
-      <ul class="recordTabs nav nav-tabs">
-        <? foreach ($this->tabs as $tab => $obj): ?>
-        <? // add current tab to breadcrumbs if applicable:
-          $desc = $obj->getDescription();
-          $tab_classes = array();
-          if (0 === strcasecmp($this->activeTab, $tab)) {
-            $tab_classes[] = 'active';
-            $tab_classes[] = 'initiallyActive';
-            $this->layout()->breadcrumbs .= '<li class="active">' . $this->transEsc($desc) . '</li>';
-            $activeTabObj = $obj;
-          }
-          if (!$obj->isVisible()) { $tab_classes[] = 'hidden'; }
-          if (!$obj->supportsAjax()) { $tab_classes[] = 'noajax'; }
-        ?>
-        <li<?=count($tab_classes) > 0 ? ' class="' . implode(' ', $tab_classes) . '"' : ''?>>
-          <a id="<?=strtolower($tab) ?>" href="<?=$this->recordLink()->getTabUrl($this->driver, $tab)?>#tabnav"><?=$this->transEsc($desc)?></a>
-        </li>
-        <? endforeach; ?>
-      </ul>
-    <? endif; ?>
+      <div class="record-tabs">
+        <ul class="nav nav-tabs">
+          <? foreach ($this->tabs as $tab => $obj): ?>
+            <? // add current tab to breadcrumbs if applicable:
+              $desc = $obj->getDescription();
+              $tab_classes = array();
+              if (0 === strcasecmp($this->activeTab, $tab)) {
+                if (!$this->ajaxTabs || !$obj->supportsAjax()) {
+                  $tab_classes[] = 'active';
+                }
+                $tab_classes[] = 'initiallyActive';
+                $this->layout()->breadcrumbs .= '<li class="active">' . $this->transEsc($desc) . '</li>';
+                $activeTabObj = $obj;
+              }
+              if (!$obj->isVisible()) { $tab_classes[] = 'hidden'; }
+              if (!$obj->supportsAjax()) { $tab_classes[] = 'noajax'; }
+            ?>
+            <li<?=count($tab_classes) > 0 ? ' class="' . implode(' ', $tab_classes) . '"' : ''?>>
+              <a class="<?=strtolower($tab) ?>" href="<?=$this->recordLink()->getTabUrl($this->driver, $tab)?>#tabnav"><?=$this->transEsc($desc)?></a>
+            </li>
+          <? endforeach; ?>
+        </ul>
 
-    <div class="tab-content" id="record-tabs">
-      <div class="tab-pane active" id="<?=$this->activeTab ?>-tab">
-        <?=isset($activeTabObj) ? $this->record($this->driver)->getTab($activeTabObj) : '' ?>
+        <div class="tab-content">
+          <? if (!$this->ajaxTabs || !isset($activeTabObj) || !$activeTabObj->supportsAjax()): ?>
+            <div class="tab-pane active <?=$this->activeTab ?>-tab">
+              <?=isset($activeTabObj) ? $this->record($this->driver)->getTab($activeTabObj) : '' ?>
+            </div>
+          <? endif; ?>
+        </div>
       </div>
-    </div>
+    <? endif; ?>
 
     <?=$this->driver->supportsCoinsOpenURL()?'<span class="Z3988" title="'.$this->escapeHtmlAttr($this->driver->getCoinsOpenURL()).'"></span>':''?>
   </div>
@@ -87,3 +93,4 @@
     <? endforeach; ?>
   </div>
 </div>
+<?=$this->inlineScript(\Zend\View\Helper\HeadScript::SCRIPT, '$(document).ready(recordDocReady);', 'SET'); ?>
diff --git a/themes/bootstrap3/templates/search/history-table.phtml b/themes/bootstrap3/templates/search/history-table.phtml
index 9a3fa5f18369342eb523f9abf9d7faffdd38388b..9daf184a3e2e8ae507d709d41cd5a6cb75077df2 100644
--- a/themes/bootstrap3/templates/search/history-table.phtml
+++ b/themes/bootstrap3/templates/search/history-table.phtml
@@ -1,10 +1,11 @@
+<? $saveSupported = $this->accountCapabilities()->getSavedSearchSetting() === 'enabled'; ?>
 <table class="table table-striped">
   <tr>
     <th width="20%"><?=$this->transEsc("history_time")?></th>
     <th><?=$this->transEsc("history_search")?></th>
     <th><?=$this->transEsc("history_limits")?></th>
     <th><?=$this->transEsc("history_results")?></th>
-    <th><?=$this->transEsc($this->showSaved ? "history_delete" : "history_save")?></th>
+    <? if ($saveSupported): ?><th><?=$this->transEsc($this->showSaved ? "history_delete" : "history_save")?></th><? endif; ?>
   </tr>
   <? foreach (($this->showSaved ? array_reverse($this->saved) : array_reverse($this->unsaved)) as $iteration => $info): ?>
     <tr class="<?=$iteration % 2 == 1 ? 'even' : 'odd'?>row">
@@ -25,13 +26,15 @@
         <? endforeach; ?>
       </td>
       <td><?=$this->escapeHtml($this->localizedNumber($info->getResultTotal()))?></td>
-      <td>
-        <? if ($this->showSaved): ?>
-          <a href="<?=$this->url('myresearch-savesearch')?>?delete=<?=urlencode($info->getSearchId())?>&amp;mode=history"><i class="fa fa-remove"></i> <?=$this->transEsc("history_delete_link")?></a>
-        <? else: ?>
-          <a href="<?=$this->url('myresearch-savesearch')?>?save=<?=urlencode($info->getSearchId())?>&amp;mode=history"><i class="fa fa-save"></i> <?=$this->transEsc("history_save_link")?></a>
-        <? endif; ?>
-      </td>
+      <? if ($saveSupported): ?>
+        <td>
+          <? if ($this->showSaved): ?>
+            <a href="<?=$this->url('myresearch-savesearch')?>?delete=<?=urlencode($info->getSearchId())?>&amp;mode=history"><i class="fa fa-remove"></i> <?=$this->transEsc("history_delete_link")?></a>
+          <? else: ?>
+            <a href="<?=$this->url('myresearch-savesearch')?>?save=<?=urlencode($info->getSearchId())?>&amp;mode=history"><i class="fa fa-save"></i> <?=$this->transEsc("history_save_link")?></a>
+          <? endif; ?>
+        </td>
+      <? endif; ?>
     </tr>
   <? endforeach; ?>
 </table>
diff --git a/themes/bootstrap3/templates/search/history.phtml b/themes/bootstrap3/templates/search/history.phtml
index efec1177841711b2ac190dab5c52e034e135243a..39f4e36a2090408ed2968cd14f2ca7e1d07e0614 100644
--- a/themes/bootstrap3/templates/search/history.phtml
+++ b/themes/bootstrap3/templates/search/history.phtml
@@ -5,11 +5,13 @@
   // Set up breadcrumbs:
   $this->layout()->breadcrumbs = '<li><a href="' .  $this->url('myresearch-home') . '">' . $this->transEsc('Your Account') . '</a></li>'
     . '<li class="active">' . $this->transEsc('History') . '</li>';
+
+  $saveSupported = $this->accountCapabilities()->getSavedSearchSetting() === 'enabled';
 ?>
 
 <div class="row">
   <div class="<?=$this->layoutClass('mainbody')?>">
-    <? if (!empty($this->saved)): ?>
+    <? if ($saveSupported && !empty($this->saved)): ?>
       <h2><?=$this->transEsc("history_saved_searches")?></h2>
       <?=$this->context()->renderInContext('search/history-table.phtml', array('showSaved' => true));?>
     <? endif; ?>
@@ -23,12 +25,14 @@
     <? endif; ?>
   </div>
 
-  <div class="<?=$this->layoutClass('sidebar')?>">
-    <?=$this->context($this)->renderInContext(
-        "myresearch/menu.phtml",
-        // Only activate search history in account menu if user is logged in.
-        $this->auth()->isLoggedIn() ? array('active' => 'history') : array()
-      );
-    ?>
-  </div>
+  <? if ($saveSupported): ?>
+    <div class="<?=$this->layoutClass('sidebar')?>">
+      <?=$this->context($this)->renderInContext(
+          "myresearch/menu.phtml",
+          // Only activate search history in account menu if user is logged in.
+          $this->auth()->isLoggedIn() ? array('active' => 'history') : array()
+       );
+       ?>
+    </div>
+  <? endif; ?>
 </div>
\ No newline at end of file
diff --git a/themes/bootstrap3/templates/search/results.phtml b/themes/bootstrap3/templates/search/results.phtml
index 1ed0fdced7d384e5620f1b5222bcddb5b996a6d8..97930e8618d8c6ea8752a20a8f09fe7550a11a82 100644
--- a/themes/bootstrap3/templates/search/results.phtml
+++ b/themes/bootstrap3/templates/search/results.phtml
@@ -111,7 +111,7 @@
         <a href="<?=$this->results->getUrlQuery()->setViewParam('rss')?>"><i class="fa fa-bell"></i> <?=$this->transEsc('Get RSS Feed')?></a>
         &mdash;
         <a href="<?=$this->url('search-email')?>" class="mailSearch modal-link" id="mailSearch<?=$this->escapeHtmlAttr($this->results->getSearchId())?>" title="<?=$this->transEsc('Email this Search')?>"><i class="fa fa-envelope"></i> <?=$this->transEsc('Email this Search')?></a>
-        <? if (($account = $this->auth()->getManager()) && $account->loginEnabled()): // hide save option if login disabled ?>
+        <? if ($this->accountCapabilities()->getSavedSearchSetting() === 'enabled'): ?>
           &mdash;
           <? if (is_numeric($this->results->getSearchId())): ?>
             <? if ($this->results->isSavedSearch()): ?>
diff --git a/themes/bootstrap3/templates/search/searchbox.phtml b/themes/bootstrap3/templates/search/searchbox.phtml
index d325db285ca6d71b435bd0c48d5cdf9c0475759d..987fc88fe152f95092b65878c4dbe88e376699a2 100644
--- a/themes/bootstrap3/templates/search/searchbox.phtml
+++ b/themes/bootstrap3/templates/search/searchbox.phtml
@@ -44,7 +44,7 @@
     <? endif; ?>
     <button type="submit" class="btn btn-primary"><i class="fa fa-search"></i> <?=$this->transEsc("Find")?></button>
     <? if ($advSearch): ?>
-      <a href="<?=$this->url($advSearch)?>" class="btn btn-link" rel="nofollow"><?=$this->transEsc("Advanced")?></a>
+      <a href="<?=$this->url($advSearch) . ((isset($this->searchId) && $this->searchId) ? '?edit=' . $this->escapeHtmlAttr($this->searchId) : '') ?>" class="btn btn-link" rel="nofollow"><?=$this->transEsc("Advanced")?></a>
     <? endif; ?>
 
     <? $shards = $options->getShards(); if ($options->showShardCheckboxes() && !empty($shards)): ?>
diff --git a/themes/bootstrap3/theme.config.php b/themes/bootstrap3/theme.config.php
index f6eeeb6817f0b857ff8c44f6bab882537d5c47c2..a8734d238915886123889915d39094df2887ce87 100644
--- a/themes/bootstrap3/theme.config.php
+++ b/themes/bootstrap3/theme.config.php
@@ -16,7 +16,7 @@ return array(
         'vendor/bootstrap.min.js',
         'vendor/bootstrap-accessibility.min.js',
         //'vendor/bootlint.min.js',
-        'vendor/typeahead.js',
+        'autocomplete.js',
         'vendor/validator.min.js',
         'vendor/rc4.js',
         'common.js',
diff --git a/themes/jquerymobile/templates/RecordDriver/EDS/core.phtml b/themes/jquerymobile/templates/RecordDriver/EDS/core.phtml
index f24c92407aa07629adc532782e7ccfdf239d178e..9ca1ac3f0520e67c3374f36a4b32153487d647b7 100644
--- a/themes/jquerymobile/templates/RecordDriver/EDS/core.phtml
+++ b/themes/jquerymobile/templates/RecordDriver/EDS/core.phtml
@@ -33,18 +33,21 @@
           <?=$this->transEsc('HTML Full Text')?>
         </a>
     <? endif; ?>
-    <? if (!empty($customLinks)): ?>
-      <div class="custom-links">
-        <? foreach ($customLinks as $customLink): ?>
-          <? $url = isset($customLink['Url']) ? $customLink['Url'] : '';
-              $mot = isset($customLink['MouseOverText'])? $customLink['MouseOverText'] : '';
-              $icon = isset ($customLink['Icon']) ? $customLink['Icon'] : '';
-              $name = isset($customLink['Name']) ? $customLink['Name'] : '';?>
-          <a href="<?=$this->escapeHtmlAttr($url)?>" target="_blank" title="<?=$mot?>" class="custom-link">
-            <? if ($icon): ?><img src="<?=$icon?>" /> <? endif; ?><?=$name?>
-          </a><br/>
-        <? endforeach; ?>
-      </div>
+
+    <? $customLinks = array_merge($this->driver->getFTCustomLinks(), $this->driver->getCustomLinks());
+    if (!empty($customLinks)): ?>
+      <? foreach ($customLinks as $customLink): ?>
+      <? $url = isset($customLink['Url']) ? $customLink['Url'] : '';
+          $mot = isset($customLink['MouseOverText'])? $customLink['MouseOverText'] : '';
+          $icon = isset ($customLink['Icon']) ? $customLink['Icon'] : '';
+          $name = isset($customLink['Text']) ? $customLink['Text'] : '';
+      ?>
+      <br /><span>
+        <a href="<?=$this->escapeHtmlAttr($url)?>" target="_blank" title="<?=$this->escapeHtmlAttr($mot)?>" class="custom-link">
+          <? if ($icon): ?><img src="<?=$this->escapeHtmlAttr($icon)?>" /> <? endif; ?><?=$this->escapeHtml($name)?>
+        </a>
+      </span>
+      <? endforeach; ?>
     <? endif; ?>
   </div>
 <? if ($largeThumb): ?></a><? endif; ?>
diff --git a/themes/jquerymobile/templates/RecordDriver/EDS/result-list.phtml b/themes/jquerymobile/templates/RecordDriver/EDS/result-list.phtml
index 394baed8891f6e32aa4bde32e0db7ea713166591..18b702ea55b7a504d02ad2c9936be9916e34cec6 100644
--- a/themes/jquerymobile/templates/RecordDriver/EDS/result-list.phtml
+++ b/themes/jquerymobile/templates/RecordDriver/EDS/result-list.phtml
@@ -7,13 +7,20 @@
   <div class="result source<?=$this->escapeHtmlAttr($this->driver->getResourceSource())?> recordId<?=$this->driver->supportsAjaxStatus()?' ajaxItemId':''?>">
     <input type="hidden" value="<?=$this->escapeHtmlAttr($this->driver->getUniqueID())?>" class="hiddenId" />
     <? $items =  $this->driver->getItems();
+
+    $titlePrinted=false;
+    if ($this->driver->getTitle()!="") {
+      echo '<h3 class="ui-li-heading">'.$this->escapeHtml($this->driver->getTitle()).'</h3>';
+      $titlePrinted=true;
+    }
+
     if (isset($items) && !empty($items)) :
       foreach ($items as $item):
         if (!empty($item)): ?>
-          <? if('Ti' == $item['Group']): ?>
-            <h3 class="ui-li-heading"><?=$item['Data']?></h3>
-          <? else: ?>
-            <p class="ui-li-desc"><strong><?=$this->transEsc($item['Label'])?></strong>: <?=$item['Data']?></p>
+          <? if( ('Ti' == $item['Group']) && ($titlePrinted==false) ): ?>
+            <h3 class="ui-li-heading"><?=strip_tags($item['Data'])?></h3>
+          <? elseif ('Ti' != $item['Group']): ?>
+            <p class="ui-li-desc"><strong><?=$this->transEsc($item['Label'])?></strong>: <?=strip_tags($item['Data'])?></p>
           <? endif; ?>
         <? endif;
       endforeach;
@@ -22,26 +29,5 @@
         <strong><?=$this->transEsc('Login for full access')?></strong>
       </a><br/>
     <? endif; ?>
-    <div style="padding-left:1em">
-      <? $customLinks = $this->driver->getCustomLinks();
-      if (!empty($customLinks)): ?>
-        <? foreach ($customLinks as $customLink): ?>
-          <? $url  = isset($customLink['Url'])  ? $customLink['Url']  : '';
-             $mot  = isset($customLink['MouseOverText']) ? $customLink['MouseOverText'] : '';
-             $icon = isset($customLink['Icon']) ? $customLink['Icon'] : '';
-             $name = isset($customLink['Name']) ? $customLink['Name'] : '';?>
-            <p class="ui-li-desc"><? if ($icon): ?><img src="<?=$icon?>" /> <? endif; ?><?=$name?></p>
-        <? endforeach; ?>
-      <? endif; ?>
-
-      <? if ($this->driver->hasHTMLFullTextAvailable()): ?>
-        <p class="ui-li-desc"><?=$this->transEsc('HTML Full Text')?></p>
-        &nbsp; &nbsp;
-      <? endif; ?>
-
-      <? if ($this->driver->hasPdfAvailable()): ?>
-        <p class="ui-li-desc"><?=$this->transEsc('PDF Full Text')?></p>
-      <? endif; ?>
-    </div>
   </div>
 </a>
\ No newline at end of file
diff --git a/themes/jquerymobile/templates/search/header-navbar.phtml b/themes/jquerymobile/templates/search/header-navbar.phtml
index eb7daaad86cae7d632ce6264996102865101a52f..6bb71b162e2d3a2078a283ea10b23f5ec95614a6 100644
--- a/themes/jquerymobile/templates/search/header-navbar.phtml
+++ b/themes/jquerymobile/templates/search/header-navbar.phtml
@@ -4,7 +4,7 @@
   <div data-role="navbar">
     <ul>
       <li><a href="#Search-narrow" data-rel="dialog" data-transition="flip"><?=$this->transEsc('Narrow Search')?></a></li>
-      <? if (($account = $this->auth()->getManager()) && $account->loginEnabled()): // hide save option if login disabled ?>
+      <? if ($this->accountCapabilities()->getSavedSearchSetting() === 'enabled'): ?>
         <li>
           <? if (isset($this->results) && is_numeric($this->results->getSearchId())): ?>
             <? if ($this->results->isSavedSearch()): ?>
diff --git a/themes/jquerymobile/templates/search/history-table.phtml b/themes/jquerymobile/templates/search/history-table.phtml
index 24b1f3925602d17d99fa16f95addae8960355f52..c43cabf5643df5824d5ef8f76311318a7e319e56 100644
--- a/themes/jquerymobile/templates/search/history-table.phtml
+++ b/themes/jquerymobile/templates/search/history-table.phtml
@@ -1,3 +1,4 @@
+<? $saveSupported = $this->accountCapabilities()->getSavedSearchSetting() === 'enabled'; ?>
 <? foreach (($this->showSaved ? array_reverse($this->saved) : array_reverse($this->unsaved)) as $iteration => $info): ?>
   <li>
     <a rel="external" href="<?=$this->url($info->getOptions()->getSearchAction()) . $info->getUrlQuery()->getParams()?>">
@@ -16,10 +17,12 @@
     <? endforeach; ?>
     </div>
     </a>
-    <? if ($this->showSaved): ?>
-      <a rel="external" href="<?=$this->url('myresearch-savesearch')?>?delete=<?=urlencode($info->getSearchId())?>&amp;mode=history" class="delete"><?=$this->transEsc("history_delete_link")?></a>
-    <? else: ?>
-      <a rel="external" href="<?=$this->url('myresearch-savesearch')?>?save=<?=urlencode($info->getSearchId())?>&amp;mode=history" class="add"><?=$this->transEsc("history_save_link")?></a>
+    <? if ($saveSupported): ?>
+      <? if ($this->showSaved): ?>
+        <a rel="external" href="<?=$this->url('myresearch-savesearch')?>?delete=<?=urlencode($info->getSearchId())?>&amp;mode=history" class="delete"><?=$this->transEsc("history_delete_link")?></a>
+      <? else: ?>
+        <a rel="external" href="<?=$this->url('myresearch-savesearch')?>?save=<?=urlencode($info->getSearchId())?>&amp;mode=history" class="add"><?=$this->transEsc("history_save_link")?></a>
+      <? endif; ?>
     <? endif; ?>
   </li>
 <? endforeach; ?>
\ No newline at end of file
diff --git a/themes/jquerymobile/templates/search/history.phtml b/themes/jquerymobile/templates/search/history.phtml
index e9e9ea37a3f165940428e4be0c3fb779f6e64839..66d3f206bbbabbe676dba43103fb329131007110 100644
--- a/themes/jquerymobile/templates/search/history.phtml
+++ b/themes/jquerymobile/templates/search/history.phtml
@@ -1,6 +1,11 @@
 <?
     // Set page title.
     $this->headTitle($this->translate('Search History'));
+
+    $saveSupported = $this->accountCapabilities()->getSavedSearchSetting() === 'enabled';
+    if (!$saveSupported) {
+        $this->saved = [];
+    }
 ?>
 <div data-role="page" id="Search-history">
   <?=$this->mobileMenu()->header()?>
diff --git a/themes/root/theme.config.php b/themes/root/theme.config.php
index 16488fec1f1871deeb6a10a61e7e5b7ddf118a58..41041b6f7f4c31f33f6c5577a0c277846f58a9c3 100644
--- a/themes/root/theme.config.php
+++ b/themes/root/theme.config.php
@@ -3,6 +3,7 @@ return array(
     'extends' => false,
     'helpers' => array(
         'factories' => array(
+            'accountcapabilities' => 'VuFind\View\Helper\Root\Factory::getAccountCapabilities',
             'addthis' => 'VuFind\View\Helper\Root\Factory::getAddThis',
             'alphabrowse' => 'VuFind\View\Helper\Root\Factory::getAlphaBrowse',
             'auth' => 'VuFind\View\Helper\Root\Factory::getAuth',
diff --git a/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetectPage.cs b/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetectPage.cs
new file mode 100755
index 0000000000000000000000000000000000000000..581b428bedbbe3de3af6cfab010fa4d2994aac4f
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetectPage.cs	
@@ -0,0 +1,1632 @@
+/* *******************************************
+// Copyright 2010-2015, Anthony Hand
+//
+//
+// File version 2015.05.13 (May 13, 2015)
+// Updates:
+//	- Moved MobileESP to GitHub. https://github.com/ahand/mobileesp
+//	- Opera Mobile/Mini browser has the same UA string on multiple platforms and doesn't differentiate phone vs. tablet. 
+//		- Removed DetectOperaAndroidPhone(). This method is no longer reliable. 
+//		- Removed DetectOperaAndroidTablet(). This method is no longer reliable. 
+//	- Added support for Windows Phone 10: variable and DetectWindowsPhone10()
+//	- Updated DetectWindowsPhone() to include WP10. 
+//	- Added support for Firefox OS.  
+//		- A variable plus DetectFirefoxOS(), DetectFirefoxOSPhone(), DetectFirefoxOSTablet()
+//		- NOTE: Firefox doesn't add UA tokens to definitively identify Firefox OS vs. their browsers on other mobile platforms.
+//	- Added support for Sailfish OS. Not enough info to add a tablet detection method at this time. 
+//		- A variable plus DetectSailfish(), DetectSailfishPhone()
+//	- Added support for Ubuntu Mobile OS. 
+//		- DetectUbuntu(), DetectUbuntuPhone(), DetectUbuntuTablet()
+//	- Added support for 2 smart TV OSes. They lack browsers but do have WebViews for use by HTML apps. 
+//		- One variable for Samsung Tizen TVs, plus DetectTizenTV()
+//		- One variable for LG WebOS TVs, plus DetectWebOSTV()
+//	- Added DetectTizen(). Tests for “mobile” to disambiguate from Samsung Smart TVs.
+//	- Removed variables for obsolete devices: deviceHtcFlyer, deviceXoom.
+//	- Updated DetectAndroid(). No longer has a special test case for the HTC Flyer tablet. 
+//	- Updated DetectAndroidPhone(). 
+//		- Updated internal detection code for Android. 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android and reports here if relevant. 
+//	- Updated DetectAndroidTablet(). 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android to exclude it from here.
+//	- DetectMeego(): Changed definition for this method. Now detects any Meego OS device, not just phones. 
+//	- DetectMeegoPhone(): NEW. For Meego phones. Ought to detect Opera browsers on Meego, as well.  
+//	- DetectTierIphone(): Added support for phones running Sailfish, Ubuntu and Firefox Mobile. 
+//	- DetectTierTablet(): Added support for tablets running Ubuntu and Firefox Mobile. 
+//	- DetectSmartphone(): Added support for Meego phones. 
+//	- Caught this library up to the PHP, JavaScript and Java versions. Updates include: 
+//		- Added support for Bada: a variable and DetectBada(). This detects any Bada OS device, but (almost) all are phones.
+//		- Refactored the Windows Phone delegate-related properties and features. Now fires for any Windows Phone, not just WP7. 
+//			- The event fires now when DetectWindowsPhone() is true. 
+//		- Added support for Windows Phone 8: DetectWindowsPhone8().
+//		- Updated DetectWindowsMobile(). Excludes any Windows Phone device, not just WP7. 
+//		- Added support for BlackBerry 10 OS phones: DetectBlackBerry10Phone().
+//		- Updated DetectSonyMylo().
+//		- Updated DetectSmartphone() to sync with the other libraries. 
+//		- Updated DetectTierIphone() to sync with the other libraries.
+//		- OnInit(EventArgs e): Fixed the user agent and httpaccept init logic.
+//	- Refactored the detection logic in DetectMobileQuick() and DetectMobileLong().
+//		- Moved a few detection tests for older browsers to Long. 
+//
+//
+//
+// LICENSE INFORMATION
+// 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. 
+//
+//
+// ABOUT THIS PROJECT
+//   Project Owner: Anthony Hand
+//   Email: anthony.hand@gmail.com
+//   Web Site: http://www.mobileesp.com
+//   Source Files: https://github.com/ahand/mobileesp
+//   
+//   Versions of this code are available for:
+//      PHP, JavaScript, Java, ASP.NET (C#), and Ruby
+//
+// *******************************************
+*/
+
+
+using System;
+using System.Collections.Generic;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+/// <summary>
+/// Subclass this page to inherit the built-in mobile device detection.
+/// </summary>
+public class MDetectPage : System.Web.UI.Page
+{
+
+    private string useragent = "";
+    private string httpaccept = "";
+
+    #region Fields - Detection Argument Values
+
+    //standardized values for detection arguments.
+    private const string dargsIphone = "iphone";
+    private const string dargsIpod = "ipod";
+    private const string dargsIpad = "ipad";
+    private const string dargsIphoneOrIpod = "iphoneoripod";
+    private const string dargsIos = "ios";
+    private const string dargsAndroid = "android";
+    private const string dargsAndroidPhone = "androidphone";
+    private const string dargsAndroidTablet = "androidtablet";
+    private const string dargsGoogleTV = "googletv";
+    private const string dargsWebKit = "webkit";
+    private const string dargsSymbianOS = "symbianos";
+    private const string dargsS60 = "series60";
+    private const string dargsWindowsPhone = "windowsphone";
+    private const string dargsWindowsMobile = "windowsmobile";
+    private const string dargsBlackBerry = "blackberry";
+    private const string dargsBlackBerryWebkit = "blackberrywebkit";
+    private const string dargsPalmOS = "palmos";
+    private const string dargsPalmWebOS = "webos";
+    private const string dargsWebOSTablet = "webostablet";
+    private const string dargsSmartphone = "smartphone";
+    private const string dargsBrewDevice = "brew";
+    private const string dargsDangerHiptop = "dangerhiptop";
+    private const string dargsOperaMobile = "operamobile";
+    private const string dargsWapWml = "wapwml";
+    private const string dargsKindle = "kindle";
+    private const string dargsMobileQuick = "mobilequick";
+    private const string dargsTierTablet = "tiertablet";
+    private const string dargsTierIphone = "tieriphone";
+    private const string dargsTierRichCss = "tierrichcss";
+    private const string dargsTierOtherPhones = "tierotherphones";
+
+    #endregion Fields - Detection Argument Values
+
+    #region Fields - User Agent Keyword Values
+
+    private const string engineWebKit = "WEBKIT";
+    private const string deviceIphone = "IPHONE";
+    private const string deviceIpod = "IPOD";
+    private const string deviceIpad = "IPAD";
+    private const string deviceMacPpc = "MACINTOSH"; //Used for disambiguation
+
+    private const string deviceAndroid = "ANDROID";
+    private const string deviceGoogleTV = "GOOGLETV";
+
+    private const string deviceNuvifone = "NUVIFONE";  //Garmin Nuvifone
+    private const string deviceBada = "BADA";  //Samsung's Bada OS    
+    private const string deviceTizen = "TIZEN";  //Tizen OS    
+    private const string deviceMeego = "MEEGO";  //Meego OS    
+    private const string deviceSailfish = "SAILFISH";  //Sailfish OS
+    private const string deviceUbuntu = "UBUNTU";  //Ubuntu Mobile OS
+
+    private const string deviceSymbian = "SYMBIAN";
+    private const string deviceS60 = "SERIES60";
+    private const string deviceS70 = "SERIES70";
+    private const string deviceS80 = "SERIES80";
+    private const string deviceS90 = "SERIES90";
+
+    private const string deviceWinPhone7 = "WINDOWS PHONE OS 7";
+    private const string deviceWinPhone8 = "WINDOWS PHONE 8";
+    private const string deviceWinPhone10 = "WINDOWS PHONE 10";
+    private const string deviceWinMob = "WINDOWS CE";
+    private const string deviceWindows = "WINDOWS";
+    private const string deviceIeMob = "IEMOBILE";
+    private const string devicePpc = "PPC"; //Stands for PocketPC
+    private const string enginePie = "WM5 PIE"; //An old Windows Mobile browser
+
+    private const string deviceBB = "BLACKBERRY";
+    private const string deviceBB10 = "BB10"; //For the new BB 10 OS
+    private const string vndRIM = "VND.RIM"; //Detectable when BB devices emulate IE or Firefox
+    private const string deviceBBStorm = "BLACKBERRY95"; //Storm 1 and 2
+    private const string deviceBBBold = "BLACKBERRY97"; //Bold 97x0 (non-touch)
+    private const string deviceBBBoldTouch = "BLACKBERRY 99"; //Bold 99x0 (touchscreen)
+    private const string deviceBBTour = "BLACKBERRY96"; //Tour
+    private const string deviceBBCurve = "BLACKBERRY89"; //Curve2
+    private const string deviceBBCurveTouch = "BLACKBERRY 938"; //Curve Touch 9380
+    private const string deviceBBTorch = "BLACKBERRY 98"; //Torch
+    private const string deviceBBPlaybook = "PLAYBOOK"; //PlayBook tablet
+
+    private const string devicePalm = "PALM";
+    private const string deviceWebOS = "WEBOS"; //For Palm devices
+    private const string deviceWebOStv = "WEB0S"; //For LG TVs
+    private const string deviceWebOShp = "HPWOS"; //For HP's line of WebOS devices
+
+    private const string engineBlazer = "BLAZER"; //Old Palm
+    private const string engineXiino = "XIINO"; //Another old Palm
+
+    private const string deviceKindle = "KINDLE";  //Amazon Kindle, eInk one
+    private const string engineSilk = "SILK";  //Amazon's accelerated Silk browser for Kindle Fire
+
+    //Initialize private strings for mobile-specific content.
+    private const string vndwap = "VND.WAP";
+    private const string wml = "WML";
+
+    //Initialize private strings for other random devices and mobile browsers.
+    private const string deviceTablet = "TABLET"; //Generic term for slate and tablet devices
+    private const string deviceBrew = "BREW";
+    private const string deviceDanger = "DANGER";
+    private const string deviceHiptop = "HIPTOP";
+    private const string devicePlaystation = "PLAYSTATION";
+    private const string devicePlaystationVita = "VITA";
+    private const string deviceNintendoDs = "NITRO";
+    private const string deviceNintendo = "NINTENDO";
+    private const string deviceWii = "WII";
+    private const string deviceXbox = "XBOX";
+    private const string deviceArchos = "ARCHOS";
+
+    private const string engineFirefox = "FIREFOX"; //For Firefox OS
+    private const string engineOpera = "OPERA"; //Popular browser
+    private const string engineNetfront = "NETFRONT"; //Common embedded OS browser
+    private const string engineUpBrowser = "UP.BROWSER"; //common on some phones
+    private const string engineOpenWeb = "OPENWEB"; //Transcoding by OpenWave server
+    private const string deviceMidp = "MIDP"; //a mobile Java technology
+    private const string uplink = "UP.LINK";
+    private const string engineTelecaQ = "TELECA Q"; //a modern feature phone browser
+
+    private const string devicePda = "PDA"; //some devices report themselves as PDAs
+    private const string mini = "MINI";  //Some mobile browsers put "mini" in their names.
+    private const string mobile = "MOBILE"; //Some mobile browsers put "mobile" in their user agent private strings.
+    private const string mobi = "MOBI"; //Some mobile browsers put "mobi" in their user agent private strings.
+
+    //Smart TV strings
+    private const string smartTV1 = "SMART-TV"; //Samsung Tizen smart TVs
+    private const string smartTV2 = "SMARTTV"; //LG WebOS smart TVs
+
+    //Use Maemo, Tablet, and Linux to test for Nokia"s Internet Tablets.
+    private const string maemo = "MAEMO";
+    private const string linux = "LINUX";
+    private const string qtembedded = "QT EMBEDDED"; //for Sony Mylo
+    private const string mylocom2 = "COM2"; //for Sony Mylo also
+
+    //In some UserAgents, the only clue is the manufacturer.
+    private const string manuSonyEricsson = "SONYERICSSON";
+    private const string manuericsson = "ERICSSON";
+    private const string manuSamsung1 = "SEC-SGH";
+    private const string manuSony = "SONY";
+    private const string manuHtc = "HTC"; //Popular Android and WinMo manufacturer
+
+    //In some UserAgents, the only clue is the operator.
+    private const string svcDocomo = "DOCOMO";
+    private const string svcKddi = "KDDI";
+    private const string svcVodafone = "VODAFONE";
+
+    //Disambiguation strings.
+    private const string disUpdate = "UPDATE"; //pda vs. update
+
+    #endregion Fields - User Agent Keyword Values
+
+    /// <summary>
+    /// To instantiate a WebPage sub-class with built-in
+    /// mobile device detection delegates and events.
+    /// </summary>
+    public MDetectPage()
+    {
+
+    }
+
+    /// <summary>
+    /// To run the device detection methods andd fire 
+    /// any existing OnDetectXXX events. 
+    /// </summary>
+    public void FireEvents()
+    {
+        if (useragent == "" && httpaccept == "")
+        {
+            useragent = (Request.ServerVariables["HTTP_USER_AGENT"] ?? "").ToUpper();
+            httpaccept = (Request.ServerVariables["HTTP_ACCEPT"] ?? "").ToUpper();
+        }
+
+        #region Event Fire Methods
+
+        MDetectArgs mda = null;
+        if (this.DetectIpod())
+        {
+            mda = new MDetectArgs(dargsIpod);
+            if (this.OnDetectIpod != null)
+            {
+                this.OnDetectIpod(this, mda);
+            }
+        }
+        if (this.DetectIpad())
+        {
+            mda = new MDetectArgs(dargsIpad);
+            if (this.OnDetectIpad != null)
+            {
+                this.OnDetectIpad(this, mda);
+            }
+        }
+        if (this.DetectIphone())
+        {
+            mda = new MDetectArgs(dargsIphone);
+            if (this.OnDetectIphone != null)
+            {
+                this.OnDetectIphone(this, mda);
+            }
+        }
+        if (this.DetectIphoneOrIpod())
+        {
+            mda = new MDetectArgs(dargsIphoneOrIpod);
+            if (this.OnDetectDetectIPhoneOrIpod != null)
+            {
+                this.OnDetectDetectIPhoneOrIpod(this, mda);
+            }
+        }
+        if (this.DetectIos())
+        {
+            mda = new MDetectArgs(dargsIos);
+            if (this.OnDetectIos != null)
+            {
+                this.OnDetectIos(this, mda);
+            }
+        }
+        if (this.DetectAndroid())
+        {
+            mda = new MDetectArgs(dargsAndroid);
+            if (this.OnDetectAndroid != null)
+            {
+                this.OnDetectAndroid(this, mda);
+            }
+        }
+        if (this.DetectAndroidPhone())
+        {
+            mda = new MDetectArgs(dargsAndroidPhone);
+            if (this.OnDetectAndroidPhone != null)
+            {
+                this.OnDetectAndroidPhone(this, mda);
+            }
+        }
+        if (this.DetectAndroidTablet())
+        {
+            mda = new MDetectArgs(dargsAndroidTablet);
+            if (this.OnDetectAndroidTablet != null)
+            {
+                this.OnDetectAndroidTablet(this, mda);
+            }
+        }
+        if (this.DetectGoogleTV())
+        {
+            mda = new MDetectArgs(dargsGoogleTV);
+            if (this.OnDetectGoogleTV != null)
+            {
+                this.OnDetectGoogleTV(this, mda);
+            }
+        }
+        if (this.DetectWebkit())
+        {
+            mda = new MDetectArgs(dargsWebKit);
+            if (this.OnDetectWebkit != null)
+            {
+                this.OnDetectWebkit(this, mda);
+            }
+        }
+        if (this.DetectS60OssBrowser())
+        {
+            mda = new MDetectArgs(dargsS60);
+            if (this.OnDetectS60OssBrowser != null)
+            {
+                this.OnDetectS60OssBrowser(this, mda);
+            }
+        }
+        if (this.DetectSymbianOS())
+        {
+            mda = new MDetectArgs(dargsSymbianOS);
+            if (this.OnDetectSymbianOS != null)
+            {
+                this.OnDetectSymbianOS(this, mda);
+            }
+        }
+        if (this.DetectWindowsPhone())
+        {
+            mda = new MDetectArgs(dargsWindowsPhone);
+            if (this.OnDetectWindowsPhone != null)
+            {
+                this.OnDetectWindowsPhone(this, mda);
+            }
+        }
+        if (this.DetectWindowsMobile())
+        {
+            mda = new MDetectArgs(dargsWindowsMobile);
+            if (this.OnDetectWindowsMobile != null)
+            {
+                this.OnDetectWindowsMobile(this, mda);
+            }
+        }
+        if (this.DetectBlackBerry())
+        {
+            mda = new MDetectArgs(dargsBlackBerryWebkit);
+            if (this.OnDetectBlackBerry != null)
+            {
+                this.OnDetectBlackBerry(this, mda);
+            }
+        }
+        if (this.DetectBlackBerryWebKit())
+        {
+            mda = new MDetectArgs(dargsBlackBerryWebkit);
+            if (this.OnDetectBlackBerryWebkit != null)
+            {
+                this.OnDetectBlackBerryWebkit(this, mda);
+            }
+        }
+        if (this.DetectPalmOS())
+        {
+            mda = new MDetectArgs(dargsPalmOS);
+            if (this.OnDetectPalmOS != null)
+            {
+                this.OnDetectPalmOS(this, mda);
+            }
+        }
+        if (this.DetectPalmWebOS())
+        {
+            mda = new MDetectArgs(dargsPalmWebOS);
+            if (this.OnDetectPalmWebOS != null)
+            {
+                this.OnDetectPalmWebOS(this, mda);
+            }
+        }
+        if (this.DetectWebOSTablet())
+        {
+            mda = new MDetectArgs(dargsWebOSTablet);
+            if (this.OnDetectWebOSTablet != null)
+            {
+                this.OnDetectWebOSTablet(this, mda);
+            }
+        }
+        if (this.DetectSmartphone())
+        {
+            mda = new MDetectArgs(dargsSmartphone);
+            if (this.OnDetectSmartphone != null)
+            {
+                this.OnDetectSmartphone(this, mda);
+            }
+        }
+        if (this.DetectBrewDevice())
+        {
+            mda = new MDetectArgs(dargsBrewDevice);
+            if (this.OnDetectBrewDevice != null)
+            {
+                this.OnDetectBrewDevice(this, mda);
+            }
+        }
+        if (this.DetectDangerHiptop())
+        {
+            mda = new MDetectArgs(dargsDangerHiptop);
+            if (this.OnDetectDangerHiptop != null)
+            {
+                this.OnDetectDangerHiptop(this, mda);
+            }
+        }
+        if (this.DetectOperaMobile())
+        {
+            mda = new MDetectArgs(dargsOperaMobile);
+            if (this.OnDetectOperaMobile != null)
+            {
+                this.OnDetectOperaMobile(this, mda);
+            }
+        }
+        if (this.DetectWapWml())
+        {
+            mda = new MDetectArgs(dargsWapWml);
+            if (this.OnDetectWapWml != null)
+            {
+                this.OnDetectWapWml(this, mda);
+            }
+        }
+        if (this.DetectKindle())
+        {
+            mda = new MDetectArgs(dargsKindle);
+            if (this.OnDetectKindle != null)
+            {
+                this.OnDetectKindle(this, mda);
+            }
+        }
+        if (this.DetectMobileQuick())
+        {
+            mda = new MDetectArgs(dargsMobileQuick);
+            if (this.OnDetectMobileQuick != null)
+            {
+                this.OnDetectMobileQuick(this, mda);
+            }
+        }
+        if (this.DetectTierTablet())
+        {
+            mda = new MDetectArgs(dargsTierTablet);
+            if (this.OnDetectTierTablet != null)
+            {
+                this.OnDetectTierTablet(this, mda);
+            }
+        }
+        if (this.DetectTierIphone())
+        {
+            mda = new MDetectArgs(dargsTierIphone);
+            if (this.OnDetectTierIphone != null)
+            {
+                this.OnDetectTierIphone(this, mda);
+            }
+        }
+        if (this.DetectTierRichCss())
+        {
+            mda = new MDetectArgs(dargsTierRichCss);
+            if (this.OnDetectTierRichCss != null)
+            {
+                this.OnDetectTierRichCss(this, mda);
+            }
+        }
+        if (this.DetectTierOtherPhones())
+        {
+            mda = new MDetectArgs(dargsTierOtherPhones);
+            if (this.OnDetectTierOtherPhones != null)
+            {
+                this.OnDetectTierOtherPhones(this, mda);
+            }
+        }
+
+        #endregion Event Fire Methods
+
+    }
+
+    public class MDetectArgs : EventArgs
+    {
+        public MDetectArgs(string type)
+        {
+            this.Type = type;
+        }
+
+        public readonly string Type;
+    }
+
+    #region Mobile Device Detection Methods 
+
+    //**************************
+    // Detects if the current device is an iPod Touch.
+    public bool DetectIpod()
+    {
+        if (useragent.IndexOf(deviceIpod)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //Ipod delegate
+    public delegate void DetectIpodHandler(object page, MDetectArgs args);
+    public event DetectIpodHandler OnDetectIpod;
+
+
+    //**************************
+    // Detects if the current device is an iPad tablet.
+    public bool DetectIpad()
+    {
+        if (useragent.IndexOf(deviceIpad) != -1 && DetectWebkit())
+            return true;
+        else
+            return false;
+    }
+
+    //Ipod delegate
+    public delegate void DetectIpadHandler(object page, MDetectArgs args);
+    public event DetectIpadHandler OnDetectIpad;
+
+
+    //**************************
+    // Detects if the current device is an iPhone.
+    public bool DetectIphone()
+    {
+        if (useragent.IndexOf(deviceIphone)!= -1)
+        {
+            //The iPad and iPod touch say they're an iPhone! So let's disambiguate.
+            if (DetectIpad() || DetectIpod())
+            {
+                return false;
+            }
+            else
+                return true;
+        }
+        else
+            return false;
+    }
+    //IPhone delegate
+    public delegate void DetectIphoneHandler(object page, MDetectArgs args);
+    public event DetectIphoneHandler OnDetectIphone;
+
+    //**************************
+    // Detects if the current device is an iPhone or iPod Touch.
+    public bool DetectIphoneOrIpod()
+    {
+        //We repeat the searches here because some iPods may report themselves as an iPhone, which would be okay.
+        if (useragent.IndexOf(deviceIphone)!= -1 ||
+            useragent.IndexOf(deviceIpod)!= -1)
+            return true;
+        else
+            return false;
+    }
+    //IPhoneOrIpod delegate
+    public delegate void DetectIPhoneOrIpodHandler(object page, MDetectArgs args);
+    public event DetectIPhoneOrIpodHandler OnDetectDetectIPhoneOrIpod;
+
+    //**************************
+    // Detects *any* iOS device: iPhone, iPod Touch, iPad.
+    public bool DetectIos()
+    {
+        if (DetectIphoneOrIpod() || DetectIpad())
+            return true;
+        else
+            return false;
+    }
+
+    //Ios delegate
+    public delegate void DetectIosHandler(object page, MDetectArgs args);
+    public event DetectIosHandler OnDetectIos;
+
+
+    //**************************
+    // Detects *any* Android OS-based device: phone, tablet, and multi-media player.
+    // Also detects Google TV.
+    public bool DetectAndroid()
+    {
+        if ((useragent.IndexOf(deviceAndroid) != -1) ||
+            DetectGoogleTV())
+            return true;
+        
+        return false;
+    }
+    //Android delegate
+    public delegate void DetectAndroidHandler(object page, MDetectArgs args);
+    public event DetectAndroidHandler OnDetectAndroid;
+
+    //**************************
+    // Detects if the current device is a (small-ish) Android OS-based device
+    // used for calling and/or multi-media (like a Samsung Galaxy Player).
+    // Google says these devices will have 'Android' AND 'mobile' in user agent.
+    // Ignores tablets (Honeycomb and later).
+    public bool DetectAndroidPhone()
+    {
+        //First, let's make sure we're on an Android device.
+        if (!DetectAndroid())
+            return false;
+
+        //If it's Android and has 'mobile' in it, Google says it's a phone.
+        if (useragent.IndexOf(mobile) != -1)
+            return true;
+
+        //Special check for Android devices with Opera Mobile/Mini. They should report here.
+        if (DetectOperaMobile())
+            return true;
+        
+        return false;
+    }
+
+    //Android Phone delegate
+    public delegate void DetectAndroidPhoneHandler(object page, MDetectArgs args);
+    public event DetectAndroidPhoneHandler OnDetectAndroidPhone;
+
+    //**************************
+    // Detects if the current device is a (self-reported) Android tablet.
+    // Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
+    public bool DetectAndroidTablet()
+    {
+        //First, let's make sure we're on an Android device.
+        if (!DetectAndroid())
+            return false;
+
+        //Special check for Android devices with Opera Mobile/Mini. They should NOT report here.
+        if (DetectOperaMobile())
+            return false;
+
+        //Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
+        if (useragent.IndexOf(mobile) > -1)
+            return false;
+        else
+            return true;
+    }
+    
+    //Android Tablet delegate
+    public delegate void DetectAndroidTabletHandler(object page, MDetectArgs args);
+    public event DetectAndroidTabletHandler OnDetectAndroidTablet;
+
+    //**************************
+    // Detects if the current device is a GoogleTV device.
+    public bool DetectGoogleTV()
+    {
+        if (useragent.IndexOf(deviceGoogleTV) != -1)
+            return true;
+        else
+            return false;
+    }
+    //GoogleTV delegate
+    public delegate void DetectGoogleTVHandler(object page, MDetectArgs args);
+    public event DetectGoogleTVHandler OnDetectGoogleTV;
+
+    //**************************
+    // Detects if the current device is an Android OS-based device and
+    //   the browser is based on WebKit.
+    public bool DetectAndroidWebKit()
+    {
+        if (DetectAndroid() && DetectWebkit())
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is based on WebKit.
+    public bool DetectWebkit()
+    {
+        if (useragent.IndexOf(engineWebKit)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //Webkit delegate
+    public delegate void DetectWebkitHandler(object page, MDetectArgs args);
+    public event DetectWebkitHandler OnDetectWebkit;
+
+    //**************************
+    // Detects if the current browser is the Nokia S60 Open Source Browser.
+    public bool DetectS60OssBrowser()
+    {
+        //First, test for WebKit, then make sure it's either Symbian or S60.
+        if (DetectWebkit())
+        {
+            if (useragent.IndexOf(deviceSymbian)!= -1 ||
+                useragent.IndexOf(deviceS60)!= -1)
+            {
+                return true;
+            }
+            else
+                return false;
+        }
+        else
+            return false;
+    }
+
+    //S60OssBrowser delegate
+    public delegate void DetectS60OssBrowserHandler(object page, MDetectArgs args);
+    public event DetectS60OssBrowserHandler OnDetectS60OssBrowser;
+
+    //**************************
+    // Detects if the current device is any Symbian OS-based device,
+    //   including older S60, Series 70, Series 80, Series 90, and UIQ, 
+    //   or other browsers running on these devices.
+    public bool DetectSymbianOS()
+    {
+        if (useragent.IndexOf(deviceSymbian)!= -1 ||
+            useragent.IndexOf(deviceS60)!= -1 ||
+            useragent.IndexOf(deviceS70)!= -1 ||
+            useragent.IndexOf(deviceS80)!= -1 ||
+            useragent.IndexOf(deviceS90)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //SymbianOS delegate
+    public delegate void DetectSymbianOSHandler(object page, MDetectArgs args);
+    public event DetectSymbianOSHandler OnDetectSymbianOS;
+
+    //**************************
+    // Detects if the current browser is a 
+    // Windows Phone 7, 8, or 10 device.
+    public bool DetectWindowsPhone()
+    {
+        if (DetectWindowsPhone7() || 
+        	DetectWindowsPhone8() ||
+        	DetectWindowsPhone10())
+            return true;
+        
+        return false;
+    }
+
+    //WindowsPhone delegate
+    public delegate void DetectWindowsPhoneHandler(object page, MDetectArgs args);
+    public event DetectWindowsPhoneHandler OnDetectWindowsPhone;
+
+    //**************************
+    // Detects if the current browser is a 
+    // Windows Phone 7 device.
+    public bool DetectWindowsPhone7()
+    {
+        if (useragent.IndexOf(deviceWinPhone7) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a 
+    // Windows Phone 8 device.
+    public bool DetectWindowsPhone8()
+    {
+        if (useragent.IndexOf(deviceWinPhone8) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a 
+    // Windows Phone 10 device.
+    public bool DetectWindowsPhone10()
+    {
+        if (useragent.IndexOf(deviceWinPhone10) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a Windows Mobile device.
+    // Excludes Windows Phone devices. 
+    // Focuses on Windows Mobile 6.xx and earlier.
+    public bool DetectWindowsMobile()
+    {
+        //Exclude new Windows Phone.
+        if (DetectWindowsPhone())
+            return false;
+        //Most devices use 'Windows CE', but some report 'iemobile' 
+        //  and some older ones report as 'PIE' for Pocket IE. 
+        if (useragent.IndexOf(deviceWinMob)!= -1 ||
+            useragent.IndexOf(deviceIeMob)!= -1 ||
+            useragent.IndexOf(enginePie) != -1)
+            return true;
+        //Test for Windows Mobile PPC but not old Macintosh PowerPC.
+        if (useragent.IndexOf(devicePpc) != -1 &&
+            !(useragent.IndexOf(deviceMacPpc) != -1))
+            return true;
+        //Test for certain Windwos Mobile-based HTC devices.
+        if (useragent.IndexOf(manuHtc) != -1 &&
+            useragent.IndexOf(deviceWindows) != -1)
+            return true;
+        if (DetectWapWml() == true &&
+            useragent.IndexOf(deviceWindows)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //WindowsMobile delegate
+    public delegate void DetectWindowsMobileHandler(object page, MDetectArgs args);
+    public event DetectWindowsMobileHandler OnDetectWindowsMobile;
+
+    //**************************
+    // Detects if the current browser is any BlackBerry device.
+    // Includes the PlayBook.
+    public bool DetectBlackBerry()
+    {
+        if ((useragent.IndexOf(deviceBB)!= -1) ||
+            (httpaccept.IndexOf(vndRIM)!= -1))
+            return true;
+        else
+            return false;
+    }
+    //BlackBerry delegate
+    public delegate void DetectBlackBerryHandler(object page, MDetectArgs args);
+    public event DetectBlackBerryHandler OnDetectBlackBerry;
+
+
+    //**************************
+    // Detects if the current browser is a BlackBerry 10 OS phone.
+   	// Excludes tablets.
+    public bool DetectBlackBerry10Phone()
+    {
+        if (useragent.IndexOf(deviceBB10) != -1 &&
+            useragent.IndexOf(mobile) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is on a BlackBerry tablet device.
+    //    Example: PlayBook
+    public bool DetectBlackBerryTablet()
+    {
+        if (useragent.IndexOf(deviceBBPlaybook) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a BlackBerry device AND uses a
+    //    WebKit-based browser. These are signatures for the new BlackBerry OS 6.
+    //    Examples: Torch. Includes the Playbook.
+    public bool DetectBlackBerryWebKit()
+    {
+        if (DetectBlackBerry() && DetectWebkit())
+            return true;
+        else
+            return false;
+    }
+    //BlackBerry Webkit delegate
+    public delegate void DetectBlackBerryWebkitHandler(object page, MDetectArgs args);
+    public event DetectBlackBerryWebkitHandler OnDetectBlackBerryWebkit;
+
+
+    //**************************
+    // Detects if the current browser is a BlackBerry Touch
+    //    device, such as the Storm, Torch, and Bold Touch. Excludes the Playbook.
+    public bool DetectBlackBerryTouch()
+    {
+        if (DetectBlackBerry() && 
+            (useragent.IndexOf(deviceBBStorm) != -1 ||
+            useragent.IndexOf(deviceBBTorch) != -1 ||
+            useragent.IndexOf(deviceBBBoldTouch) != -1 ||
+            useragent.IndexOf(deviceBBCurveTouch) != -1))
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a BlackBerry device AND
+    //    has a more capable recent browser. Excludes the Playbook.
+    //    Examples, Storm, Bold, Tour, Curve2
+    //    Excludes the new BlackBerry OS 6 and 7 browser!!
+    public bool DetectBlackBerryHigh()
+    {
+        //Disambiguate for BlackBerry OS 6 or 7 (WebKit) browser
+        if (DetectBlackBerryWebKit())
+            return false;
+        if (DetectBlackBerry())
+        {
+            if (DetectBlackBerryTouch() ||
+                useragent.IndexOf(deviceBBBold) != -1 ||
+                useragent.IndexOf(deviceBBTour) != -1 ||
+                useragent.IndexOf(deviceBBCurve) != -1)
+                return true;
+            else
+                return false;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a BlackBerry device AND
+    //    has an older, less capable browser. 
+    //    Examples: Pearl, 8800, Curve1.
+    public bool DetectBlackBerryLow()
+    {
+        if (DetectBlackBerry())
+        {
+            //Assume that if it's not in the High tier, then it's Low.
+            if (DetectBlackBerryHigh() || DetectBlackBerryWebKit())
+                return false;
+            else
+                return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is on a PalmOS device.
+    public bool DetectPalmOS()
+    {
+        //Most devices nowadays report as 'Palm', but some older ones reported as Blazer or Xiino.
+        if (useragent.IndexOf(devicePalm) != -1 ||
+            useragent.IndexOf(engineBlazer) != -1 ||
+            useragent.IndexOf(engineXiino) != -1)
+        {
+            //Make sure it's not WebOS first
+            if (DetectPalmWebOS() == true)
+                return false;
+            else
+                return true;
+        }
+        else
+            return false;
+    }
+    //PalmOS delegate
+    public delegate void DetectPalmOSHandler(object page, MDetectArgs args);
+    public event DetectPalmOSHandler OnDetectPalmOS;
+
+
+    //**************************
+    // Detects if the current browser is on a Palm device
+    //    running the new WebOS.
+    public bool DetectPalmWebOS()
+    {
+        if (useragent.IndexOf(deviceWebOS) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //PalmWebOS delegate
+    public delegate void DetectPalmWebOSHandler(object page, MDetectArgs args);
+    public event DetectPalmWebOSHandler OnDetectPalmWebOS;
+
+
+    //**************************
+    // Detects if the current browser is on an HP tablet running WebOS.
+    public bool DetectWebOSTablet()
+    {
+        if (useragent.IndexOf(deviceWebOShp) != -1 &&
+            useragent.IndexOf(deviceTablet) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+    //WebOS tablet delegate
+    public delegate void DetectWebOSTabletHandler(object page, MDetectArgs args);
+    public event DetectWebOSTabletHandler OnDetectWebOSTablet;
+
+
+    //**************************
+    // Detects if the current browser is on a WebOS smart TV.
+    public bool DetectWebOSTV()
+    {
+        if (useragent.IndexOf(deviceWebOStv) != -1 &&
+            useragent.IndexOf(smartTV2) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is Opera Mobile or Mini.
+    public bool DetectOperaMobile()
+    {
+        if (useragent.IndexOf(engineOpera)!= -1)
+        {
+            if ((useragent.IndexOf(mini)!= -1) ||
+             (useragent.IndexOf(mobi)!= -1))
+            {
+                return true;
+            }
+            else
+                return false;
+        }
+        else
+            return false;
+    }
+
+    //Opera Mobile delegate
+    public delegate void DetectOperaMobileHandler(object page, MDetectArgs args);
+    public event DetectOperaMobileHandler OnDetectOperaMobile;
+
+    //**************************
+    // Detects if the current browser is a
+    //    Garmin Nuvifone.
+    public bool DetectGarminNuvifone()
+    {
+        if (useragent.IndexOf(deviceNuvifone) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a device running the Bada OS from Samsung.
+    public bool DetectBada()
+    {
+        if (useragent.IndexOf(deviceBada) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a device running the Tizen smartphone OS.
+    public bool DetectTizen()
+    {
+        if (useragent.IndexOf(deviceTizen) != -1 &&
+            useragent.IndexOf(mobile) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is on a Tizen smart TV.
+    public bool DetectTizenTV()
+    {
+        if (useragent.IndexOf(deviceTizen) != -1 &&
+            useragent.IndexOf(smartTV1) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a device running the Meego OS.
+    public bool DetectMeego()
+    {
+        if (useragent.IndexOf(deviceMeego) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a phone running the Meego OS.
+    public bool DetectMeegoPhone()
+    {
+        if (useragent.IndexOf(deviceMeego) != -1 &&
+            useragent.IndexOf(mobile) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a mobile device (probably) running the Firefox OS.
+    public bool DetectFirefoxOS()
+    {
+        if (DetectFirefoxOSPhone() || DetectFirefoxOSTablet())
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a phone (probably) running the Firefox OS.
+    public bool DetectFirefoxOSPhone()
+    {
+        //First, let's make sure we're NOT on another major mobile OS.
+        if (DetectIos() || 
+        	DetectAndroid() ||
+        	DetectSailfish())
+            return false;        
+        
+        if ((useragent.IndexOf(engineFirefox) != -1) &&
+            (useragent.IndexOf(mobile) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a tablet (probably) running the Firefox OS.
+    public bool DetectFirefoxOSTablet()
+    {
+        //First, let's make sure we're NOT on another major mobile OS.
+        if (DetectIos() || 
+        	DetectAndroid() ||
+        	DetectSailfish())
+            return false;        
+        
+        if ((useragent.IndexOf(engineFirefox) != -1) &&
+            (useragent.IndexOf(deviceTablet) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a device running the Sailfish OS.
+    public bool DetectSailfish()
+    {
+        if (useragent.IndexOf(deviceSailfish) != -1)
+            return true;
+        else
+            return false;
+    }
+    
+    //**************************
+    // Detects a phone running the Sailfish OS.
+    public bool DetectSailfishPhone()
+    {
+        if (DetectSailfish() &&
+            (useragent.IndexOf(mobile) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a mobile device running the Ubuntu Mobile OS.
+    public bool DetectUbuntu()
+    {
+        if (DetectUbuntuPhone() || DetectUbuntuTablet())
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a phone running the Ubuntu Mobile OS.
+    public bool DetectUbuntuPhone()
+    {
+        if ((useragent.IndexOf(deviceUbuntu) != -1) &&
+            (useragent.IndexOf(mobile) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a tablet running the Ubuntu Mobile OS.
+    public bool DetectUbuntuTablet()
+    {
+        if ((useragent.IndexOf(deviceUbuntu) != -1) &&
+            (useragent.IndexOf(deviceTablet) != -1))
+            return true;
+        
+        return false;
+    }
+
+
+    //**************************
+    // Detects whether the device is a Brew-powered device.
+    public bool DetectBrewDevice()
+    {
+        if (useragent.IndexOf(deviceBrew)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //BrewDevice delegate
+    public delegate void DetectBrewDeviceHandler(object page, MDetectArgs args);
+    public event DetectBrewDeviceHandler OnDetectBrewDevice;
+
+    //**************************
+    // Detects the Danger Hiptop device.
+    public bool DetectDangerHiptop()
+    {
+        if (useragent.IndexOf(deviceDanger)!= -1 ||
+            useragent.IndexOf(deviceHiptop)!= -1)
+            return true;
+        else
+            return false;
+    }
+    //DangerHiptop delegate
+    public delegate void DetectDangerHiptopHandler(object page, MDetectArgs args);
+    public event DetectDangerHiptopHandler OnDetectDangerHiptop;
+
+    //**************************
+    // Detects whether the device supports WAP or WML.
+    public bool DetectWapWml()
+    {
+        if (httpaccept.IndexOf(vndwap)!= -1 ||
+            httpaccept.IndexOf(wml)!= -1)
+            return true;
+        else
+            return false;
+    }
+    //WapWml delegate
+    public delegate void DetectWapWmlHandler(object page, MDetectArgs args);
+    public event DetectWapWmlHandler OnDetectWapWml;
+
+
+    //**************************
+    // Detects if the current device is an Amazon Kindle (eInk devices only).
+    // Note: For the Kindle Fire, use the normal Android methods. 
+    public bool DetectKindle()
+    {
+        if (useragent.IndexOf(deviceKindle) != -1 &&
+            !DetectAndroid())
+            return true;
+        else
+            return false;
+    }
+
+    //Kindle delegate
+    public delegate void DetectKindleHandler(object page, MDetectArgs args);
+    public event DetectKindleHandler OnDetectKindle;
+
+
+    //**************************
+    // Detects if the current Amazon device is using the Silk Browser.
+    // Note: Typically used by the the Kindle Fire.
+    public bool DetectAmazonSilk()
+    {
+        if (useragent.IndexOf(engineSilk) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is a Sony Playstation.
+    public bool DetectSonyPlaystation()
+    {
+        if (useragent.IndexOf(devicePlaystation)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is a handheld gaming device with
+    // a touchscreen and modern iPhone-class browser. Includes the Playstation Vita.
+    public bool DetectGamingHandheld()
+    {
+        if (useragent.IndexOf(devicePlaystation)!= -1 &&
+             useragent.IndexOf(devicePlaystationVita)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is a Nintendo game device.
+    public bool DetectNintendo()
+    {
+        if (useragent.IndexOf(deviceNintendo)!= -1 ||
+             useragent.IndexOf(deviceWii)!= -1 ||
+             useragent.IndexOf(deviceNintendoDs)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is a Microsoft Xbox.
+    public bool DetectXbox()
+    {
+        if (useragent.IndexOf(deviceXbox)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is an Internet-capable game console.
+    public bool DetectGameConsole()
+    {
+        if (DetectSonyPlaystation())
+            return true;
+        else if (DetectNintendo())
+            return true;
+        else if (DetectXbox())
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device supports MIDP, a mobile Java technology.
+    public bool DetectMidpCapable()
+    {
+        if (useragent.IndexOf(deviceMidp)!= -1 ||
+            httpaccept.IndexOf(deviceMidp)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is on one of the Maemo-based Nokia Internet Tablets.
+    public bool DetectMaemoTablet()
+    {
+        if (useragent.IndexOf(maemo)!= -1)
+            return true;
+        //For Nokia N810, must be Linux + Tablet, or else it could be something else. 
+        else if (useragent.IndexOf(linux)!= -1 &&
+            useragent.IndexOf(deviceTablet) != -1 &&
+            !DetectWebOSTablet() &&
+            !DetectAndroid())
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is an Archos media player/Internet tablet.
+    public bool DetectArchos()
+    {
+        if (useragent.IndexOf(deviceArchos)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a Sony Mylo device.
+    public bool DetectSonyMylo()
+    {
+        if ((useragent.IndexOf(manuSony)!= -1) &&
+        	((useragent.IndexOf(qtembedded)!= -1) ||
+             (useragent.IndexOf(mylocom2)!= -1)))
+			return true;        
+        
+        return false;
+    }
+
+	//*****************************
+	// Device Classes
+	//*****************************
+   
+    //**************************
+    // Check to see whether the device is any device
+    //   in the 'smartphone' category.
+    // Note: It's better to use DetectTierIphone() for modern touchscreen devices. 
+    public bool DetectSmartphone()
+    {
+        if (DetectTierIphone() ||
+            DetectS60OssBrowser() ||
+            DetectSymbianOS() ||
+            DetectWindowsMobile() ||
+            DetectBlackBerry() ||
+            DetectMeegoPhone() ||
+            DetectPalmOS())
+            return true;
+        else
+            return false;
+    }
+
+    //DetectSmartphone delegate
+    public delegate void DetectSmartphoneHandler(object page, MDetectArgs args);
+    public event DetectSmartphoneHandler OnDetectSmartphone;
+
+    //**************************
+    //   Detects if the current device is a mobile device.
+    //   This method catches most of the popular modern devices.
+    //   Excludes Apple iPads and other modern tablets.
+    public bool DetectMobileQuick()
+    {
+        //Let's exclude tablets
+        if (DetectTierTablet())
+            return false;
+
+        //Most mobile browsing is done on smartphones
+        if (DetectSmartphone())
+            return true;
+
+        //Catch-all for many mobile devices
+        if (useragent.IndexOf(mobile) != -1)
+            return true;
+
+        if (DetectOperaMobile())
+            return true;
+        
+        //We also look for Kindle devices
+        if (DetectKindle() ||
+            DetectAmazonSilk())
+            return true;
+        
+        if (DetectWapWml() ||
+            DetectMidpCapable() ||
+            DetectBrewDevice())
+            return true;
+
+        if ((useragent.IndexOf(engineNetfront) != -1) ||
+            (useragent.IndexOf(engineUpBrowser) != -1))
+            return true;
+
+        return false;
+    }
+
+    //DetectMobileQuick delegate
+    public delegate void DetectMobileQuickHandler(object page, MDetectArgs args);
+    public event DetectMobileQuickHandler OnDetectMobileQuick;
+
+
+    //**************************
+    // The longer and more thorough way to detect for a mobile device.
+    //   Will probably detect most feature phones,
+    //   smartphone-class devices, Internet Tablets, 
+    //   Internet-enabled game consoles, etc.
+    //   This ought to catch a lot of the more obscure and older devices, also --
+    //   but no promises on thoroughness!
+    public bool DetectMobileLong()
+    {
+        if (DetectMobileQuick())
+            return true;
+            
+        if (DetectGameConsole())
+            return true;
+
+        if (DetectDangerHiptop() ||
+            DetectMaemoTablet() ||
+            DetectSonyMylo() ||
+            DetectArchos())
+            return true;
+
+        if ((useragent.IndexOf(devicePda) != -1) &&
+            (useragent.IndexOf(disUpdate) != -1))
+            return true;
+
+        //Detect older phones from certain manufacturers and operators. 
+        if ((useragent.IndexOf(uplink) != -1)  ||
+            (useragent.IndexOf(engineOpenWeb) != -1) ||
+            (useragent.IndexOf(manuSamsung1) != -1) ||
+            (useragent.IndexOf(manuSonyEricsson) != -1) ||
+            (useragent.IndexOf(manuericsson) != -1) ||
+            (useragent.IndexOf(svcDocomo) != -1) ||
+            (useragent.IndexOf(svcKddi) != -1) ||
+            (useragent.IndexOf(svcVodafone) != -1))
+            return true;
+
+        return false;
+    }
+
+
+
+    //*****************************
+    // For Mobile Web Site Design
+    //*****************************
+
+    //**************************
+    // The quick way to detect for a tier of devices.
+    //   This method detects for the new generation of
+    //   HTML 5 capable, larger screen tablets.
+    //   Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
+    public bool DetectTierTablet()
+    {
+        if (DetectIpad()
+            || DetectAndroidTablet()
+            || DetectBlackBerryTablet()
+            || DetectFirefoxOSTablet()
+            || DetectUbuntuTablet()
+            || DetectWebOSTablet())
+            return true;
+        else
+            return false;
+    }
+
+    //DetectTierTablet delegate
+    public delegate void DetectTierTabletHandler(object page, MDetectArgs args);
+    public event DetectTierTabletHandler OnDetectTierTablet;
+
+
+    //**************************
+    // The quick way to detect for a tier of devices.
+    //   This method detects for devices which can 
+    //   display iPhone-optimized web content.
+    //   Includes iPhone, iPod Touch, Android, Windows Phone, BB10, Playstation Vita, etc.
+    public bool DetectTierIphone()
+    {
+        if (DetectIphoneOrIpod() ||
+            DetectAndroidPhone() ||
+            DetectWindowsPhone() ||
+            DetectBlackBerry10Phone() ||
+            DetectPalmWebOS() ||
+            DetectBada() ||
+            DetectTizen() ||
+            DetectFirefoxOSPhone() ||
+            DetectSailfishPhone() ||
+            DetectUbuntuPhone() ||
+			DetectGamingHandheld())
+            return true;
+        else
+            return false;
+    }
+
+    //DetectTierIphone delegate
+    public delegate void DetectTierIphoneHandler(object page, MDetectArgs args);
+    public event DetectTierIphoneHandler OnDetectTierIphone;
+
+
+    //**************************
+    // The quick way to detect for a tier of devices.
+    //   This method detects for devices which are likely to be capable 
+    //   of viewing CSS content optimized for the iPhone, 
+    //   but may not necessarily support JavaScript.
+    //   Excludes all iPhone Tier devices.
+    public bool DetectTierRichCss()
+    {
+        if (DetectMobileQuick())
+        {
+            //Exclude iPhone Tier and e-Ink Kindle devices
+            if (DetectTierIphone() || DetectKindle())
+                return false;
+
+            if (DetectWebkit() ||
+                DetectS60OssBrowser())
+                return true;
+
+            //Note: 'High' BlackBerry devices ONLY
+            if (DetectBlackBerryHigh() == true)
+                return true;
+
+            //Older Windows 'Mobile' isn't good enough for iPhone Tier.
+            if (DetectWindowsMobile() == true)
+                return true;
+            if (useragent.IndexOf(engineTelecaQ) != -1)
+                return true;
+
+            else
+                return false;
+        }
+        else
+            return false;
+    }
+
+    //DetectTierRichCss delegate
+    public delegate void DetectTierRichCssHandler(object page, MDetectArgs args);
+    public event DetectTierRichCssHandler OnDetectTierRichCss;
+
+
+    //**************************
+    // The quick way to detect for a tier of devices.
+    //   This method detects for all other types of phones,
+    //   but excludes the iPhone and Smartphone Tier devices.
+    public bool DetectTierOtherPhones()
+    {
+        if (DetectMobileLong() == true)
+        {
+            //Exclude devices in the other 2 categories
+            if (DetectTierIphone() ||
+                DetectTierRichCss())
+                return false;
+            else
+                return true;
+        }
+        else
+            return false;
+    }
+
+    //DetectTierOtherPhones delegate
+    public delegate void DetectTierOtherPhonesHandler(object page, MDetectArgs args);
+    public event DetectTierOtherPhonesHandler OnDetectTierOtherPhones;
+
+    //***************************************************************
+    #endregion
+
+    //Instead of overriding OnInit(), you can override InitializeCulture()
+    //  so that detection can happen earlier in page's lifecycle, if necessary. 
+    protected override void OnInit(EventArgs e)
+    {
+        base.OnInit(e);
+        
+        if (useragent == "" && httpaccept == "")
+        {
+            useragent = (Request.ServerVariables["HTTP_USER_AGENT"] ?? "").ToUpper();
+            httpaccept = (Request.ServerVariables["HTTP_ACCEPT"] ?? "").ToUpper();
+        }
+    }
+}
diff --git a/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetect_Test.aspx b/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetect_Test.aspx
new file mode 100755
index 0000000000000000000000000000000000000000..e33e4b200ccd4e3a832a610614f5933926526886
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetect_Test.aspx	
@@ -0,0 +1,16 @@
+<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MDetect_Test.aspx.cs" Inherits="MDetect_Test" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head runat="server">
+    <title></title>
+</head>
+<body>
+    <form id="form1" runat="server">
+    <div>
+    
+    </div>
+    </form>
+</body>
+</html>
diff --git a/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetect_Test.aspx.cs b/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetect_Test.aspx.cs
new file mode 100755
index 0000000000000000000000000000000000000000..bb18dc25fa9586dccf993520d0e61a66a9c3a8af
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/Sub-Classed Page Technique/MDetect_Test.aspx.cs	
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+public partial class MDetect_Test : MDetectPage
+{
+    protected void Page_Load(object sender, EventArgs e)
+    {
+        this.FireEvents();
+    }
+
+    protected override void OnInit(EventArgs e)
+    {
+        base.OnInit(e);
+
+        //As a test, let's listen for any WebKit-based device. 
+        OnDetectWebkit += new DetectWebkitHandler(MDetect_Test_OnDetectWebkit);
+    }
+
+    void MDetect_Test_OnDetectWebkit(object page, MDetectPage.MDetectArgs args)
+    {
+        //Write the Type value from the argument to the web page. 
+        Response.Write("<b>This browser is " + args.Type + "</b>");
+    }
+
+}
diff --git a/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MDetectControl.cs b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MDetectControl.cs
new file mode 100755
index 0000000000000000000000000000000000000000..edc93b4f41ff66148f6f105752f875f2ad3c2a60
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MDetectControl.cs	
@@ -0,0 +1,1647 @@
+/* *******************************************
+// Copyright 2010-2015, Anthony Hand
+//
+//
+// File version 2015.05.13 (May 13, 2015)
+// Updates:
+//	- Moved MobileESP to GitHub. https://github.com/ahand/mobileesp
+//	- Opera Mobile/Mini browser has the same UA string on multiple platforms and doesn't differentiate phone vs. tablet. 
+//		- Removed DetectOperaAndroidPhone(). This method is no longer reliable. 
+//		- Removed DetectOperaAndroidTablet(). This method is no longer reliable. 
+//	- Added support for Windows Phone 10: variable and DetectWindowsPhone10()
+//	- Updated DetectWindowsPhone() to include WP10. 
+//	- Added support for Firefox OS.  
+//		- A variable plus DetectFirefoxOS(), DetectFirefoxOSPhone(), DetectFirefoxOSTablet()
+//		- NOTE: Firefox doesn't add UA tokens to definitively identify Firefox OS vs. their browsers on other mobile platforms.
+//	- Added support for Sailfish OS. Not enough info to add a tablet detection method at this time. 
+//		- A variable plus DetectSailfish(), DetectSailfishPhone()
+//	- Added support for Ubuntu Mobile OS. 
+//		- DetectUbuntu(), DetectUbuntuPhone(), DetectUbuntuTablet()
+//	- Added support for 2 smart TV OSes. They lack browsers but do have WebViews for use by HTML apps. 
+//		- One variable for Samsung Tizen TVs, plus DetectTizenTV()
+//		- One variable for LG WebOS TVs, plus DetectWebOSTV()
+//	- Added DetectTizen(). Tests for “mobile” to disambiguate from Samsung Smart TVs.
+//	- Removed variables for obsolete devices: deviceHtcFlyer, deviceXoom.
+//	- Updated DetectAndroid(). No longer has a special test case for the HTC Flyer tablet. 
+//	- Updated DetectAndroidPhone(). 
+//		- Updated internal detection code for Android. 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android and reports here if relevant. 
+//	- Updated DetectAndroidTablet(). 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android to exclude it from here.
+//	- DetectMeego(): Changed definition for this method. Now detects any Meego OS device, not just phones. 
+//	- DetectMeegoPhone(): NEW. For Meego phones. Ought to detect Opera browsers on Meego, as well.  
+//	- DetectTierIphone(): Added support for phones running Sailfish, Ubuntu and Firefox Mobile. 
+//	- DetectTierTablet(): Added support for tablets running Ubuntu and Firefox Mobile. 
+//	- DetectSmartphone(): Added support for Meego phones. 
+//	- Caught this library up to the PHP, JavaScript and Java versions. Updates include: 
+//		- Added support for Bada: a variable and DetectBada(). This detects any Bada OS device, but (almost) all are phones.
+//		- Refactored the Windows Phone delegate-related properties and features. Now fires for any Windows Phone, not just WP7. 
+//			- The event fires now when DetectWindowsPhone() is true. 
+//		- Added support for Windows Phone 8: DetectWindowsPhone8().
+//		- Updated DetectWindowsMobile(). Excludes any Windows Phone device, not just WP7. 
+//		- Added support for BlackBerry 10 OS phones: DetectBlackBerry10Phone().
+//		- Updated DetectSonyMylo().
+//		- Updated DetectSmartphone() to sync with the other libraries. 
+//		- Updated DetectTierIphone() to sync with the other libraries.
+//		- OnInit(EventArgs e): Fixed the user agent and httpaccept init logic.
+//	- Refactored the detection logic in DetectMobileQuick() and DetectMobileLong().
+//		- Moved a few detection tests for older browsers to Long. 
+//
+//
+//
+// LICENSE INFORMATION
+// 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. 
+//
+//
+// ABOUT THIS PROJECT
+//   Project Owner: Anthony Hand
+//   Email: anthony.hand@gmail.com
+//   Web Site: http://www.mobileesp.com
+//   Source Files: https://github.com/ahand/mobileesp
+//   
+//   Versions of this code are available for:
+//      PHP, JavaScript, Java, ASP.NET (C#), and Ruby
+//
+// *******************************************
+*/
+
+
+using System;
+using System.Collections.Generic;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+/// <summary>
+/// Subclass this control to inherit the built-in mobile device detection.
+/// </summary>
+public class MDetectControl : System.Web.UI.UserControl
+{
+
+    private string useragent = "";
+    private string httpaccept = "";
+
+    #region Fields - Detection Argument Values
+
+    //standardized values for detection arguments.
+    private const string dargsIphone = "iphone";
+    private const string dargsIpod = "ipod";
+    private const string dargsIpad = "ipad";
+    private const string dargsIphoneOrIpod = "iphoneoripod";
+    private const string dargsIos = "ios";
+    private const string dargsAndroid = "android";
+    private const string dargsAndroidPhone = "androidphone";
+    private const string dargsAndroidTablet = "androidtablet";
+    private const string dargsGoogleTV = "googletv";
+    private const string dargsWebKit = "webkit";
+    private const string dargsSymbianOS = "symbianos";
+    private const string dargsS60 = "series60";
+    private const string dargsWindowsPhone = "windowsphone";
+    private const string dargsWindowsMobile = "windowsmobile";
+    private const string dargsBlackBerry = "blackberry";
+    private const string dargsBlackBerryWebkit = "blackberrywebkit";
+    private const string dargsPalmOS = "palmos";
+    private const string dargsPalmWebOS = "webos";
+    private const string dargsWebOSTablet = "webostablet";
+    private const string dargsSmartphone = "smartphone";
+    private const string dargsBrewDevice = "brew";
+    private const string dargsDangerHiptop = "dangerhiptop";
+    private const string dargsOperaMobile = "operamobile";
+    private const string dargsWapWml = "wapwml";
+    private const string dargsKindle = "kindle";
+    private const string dargsMobileQuick = "mobilequick";
+    private const string dargsTierTablet = "tiertablet";
+    private const string dargsTierIphone = "tieriphone";
+    private const string dargsTierRichCss = "tierrichcss";
+    private const string dargsTierOtherPhones = "tierotherphones";
+
+    #endregion Fields - Detection Argument Values
+
+    #region Fields - User Agent Keyword Values
+
+    private const string engineWebKit = "WEBKIT";
+    private const string deviceIphone = "IPHONE";
+    private const string deviceIpod = "IPOD";
+    private const string deviceIpad = "IPAD";
+    private const string deviceMacPpc = "MACINTOSH"; //Used for disambiguation
+
+    private const string deviceAndroid = "ANDROID";
+    private const string deviceGoogleTV = "GOOGLETV";
+
+    private const string deviceNuvifone = "NUVIFONE";  //Garmin Nuvifone
+    private const string deviceBada = "BADA";  //Samsung's Bada OS    
+    private const string deviceTizen = "TIZEN";  //Tizen OS    
+    private const string deviceMeego = "MEEGO";  //Meego OS    
+    private const string deviceSailfish = "SAILFISH";  //Sailfish OS
+    private const string deviceUbuntu = "UBUNTU";  //Ubuntu Mobile OS
+
+    private const string deviceSymbian = "SYMBIAN";
+    private const string deviceS60 = "SERIES60";
+    private const string deviceS70 = "SERIES70";
+    private const string deviceS80 = "SERIES80";
+    private const string deviceS90 = "SERIES90";
+
+    private const string deviceWinPhone7 = "WINDOWS PHONE OS 7";
+    private const string deviceWinPhone8 = "WINDOWS PHONE 8";
+    private const string deviceWinPhone10 = "WINDOWS PHONE 10";
+    private const string deviceWinMob = "WINDOWS CE";
+    private const string deviceWindows = "WINDOWS";
+    private const string deviceIeMob = "IEMOBILE";
+    private const string devicePpc = "PPC"; //Stands for PocketPC
+    private const string enginePie = "WM5 PIE"; //An old Windows Mobile browser
+
+    private const string deviceBB = "BLACKBERRY";
+    private const string deviceBB10 = "BB10"; //For the new BB 10 OS
+    private const string vndRIM = "VND.RIM"; //Detectable when BB devices emulate IE or Firefox
+    private const string deviceBBStorm = "BLACKBERRY95"; //Storm 1 and 2
+    private const string deviceBBBold = "BLACKBERRY97"; //Bold 97x0 (non-touch)
+    private const string deviceBBBoldTouch = "BLACKBERRY 99"; //Bold 99x0 (touchscreen)
+    private const string deviceBBTour = "BLACKBERRY96"; //Tour
+    private const string deviceBBCurve = "BLACKBERRY89"; //Curve2
+    private const string deviceBBCurveTouch = "BLACKBERRY 938"; //Curve Touch 9380
+    private const string deviceBBTorch = "BLACKBERRY 98"; //Torch
+    private const string deviceBBPlaybook = "PLAYBOOK"; //PlayBook tablet
+
+    private const string devicePalm = "PALM";
+    private const string deviceWebOS = "WEBOS"; //For Palm devices
+    private const string deviceWebOStv = "WEB0S"; //For LG TVs
+    private const string deviceWebOShp = "HPWOS"; //For HP's line of WebOS devices
+
+    private const string engineBlazer = "BLAZER"; //Old Palm
+    private const string engineXiino = "XIINO"; //Another old Palm
+
+    private const string deviceKindle = "KINDLE";  //Amazon Kindle, eInk one
+    private const string engineSilk = "SILK";  //Amazon's accelerated Silk browser for Kindle Fire
+
+    //Initialize private strings for mobile-specific content.
+    private const string vndwap = "VND.WAP";
+    private const string wml = "WML";
+
+    //Initialize private strings for other random devices and mobile browsers.
+    private const string deviceTablet = "TABLET"; //Generic term for slate and tablet devices
+    private const string deviceBrew = "BREW";
+    private const string deviceDanger = "DANGER";
+    private const string deviceHiptop = "HIPTOP";
+    private const string devicePlaystation = "PLAYSTATION";
+    private const string devicePlaystationVita = "VITA";
+    private const string deviceNintendoDs = "NITRO";
+    private const string deviceNintendo = "NINTENDO";
+    private const string deviceWii = "WII";
+    private const string deviceXbox = "XBOX";
+    private const string deviceArchos = "ARCHOS";
+
+    private const string engineFirefox = "FIREFOX"; //For Firefox OS
+    private const string engineOpera = "OPERA"; //Popular browser
+    private const string engineNetfront = "NETFRONT"; //Common embedded OS browser
+    private const string engineUpBrowser = "UP.BROWSER"; //common on some phones
+    private const string engineOpenWeb = "OPENWEB"; //Transcoding by OpenWave server
+    private const string deviceMidp = "MIDP"; //a mobile Java technology
+    private const string uplink = "UP.LINK";
+    private const string engineTelecaQ = "TELECA Q"; //a modern feature phone browser
+
+    private const string devicePda = "PDA"; //some devices report themselves as PDAs
+    private const string mini = "MINI";  //Some mobile browsers put "mini" in their names.
+    private const string mobile = "MOBILE"; //Some mobile browsers put "mobile" in their user agent private strings.
+    private const string mobi = "MOBI"; //Some mobile browsers put "mobi" in their user agent private strings.
+
+    //Smart TV strings
+    private const string smartTV1 = "SMART-TV"; //Samsung Tizen smart TVs
+    private const string smartTV2 = "SMARTTV"; //LG WebOS smart TVs
+
+    //Use Maemo, Tablet, and Linux to test for Nokia"s Internet Tablets.
+    private const string maemo = "MAEMO";
+    private const string linux = "LINUX";
+    private const string qtembedded = "QT EMBEDDED"; //for Sony Mylo
+    private const string mylocom2 = "COM2"; //for Sony Mylo also
+
+    //In some UserAgents, the only clue is the manufacturer.
+    private const string manuSonyEricsson = "SONYERICSSON";
+    private const string manuericsson = "ERICSSON";
+    private const string manuSamsung1 = "SEC-SGH";
+    private const string manuSony = "SONY";
+    private const string manuHtc = "HTC"; //Popular Android and WinMo manufacturer
+
+    //In some UserAgents, the only clue is the operator.
+    private const string svcDocomo = "DOCOMO";
+    private const string svcKddi = "KDDI";
+    private const string svcVodafone = "VODAFONE";
+
+    //Disambiguation strings.
+    private const string disUpdate = "UPDATE"; //pda vs. update
+
+    #endregion Fields - User Agent Keyword Values
+
+
+    /// <summary>
+    /// To instantiate a WebPage sub-class with built-in
+    /// mobile device detection delegates and events.
+    /// </summary>
+    public MDetectControl()
+    {
+
+    }
+
+    /// <summary>
+    /// To run the device detection methods andd fire 
+    /// any existing OnDetectXXX events. 
+    /// </summary>
+    public void FireEvents()
+    {
+        if (useragent == "" && httpaccept == "")
+        {
+            useragent = (Request.ServerVariables["HTTP_USER_AGENT"] ?? "").ToUpper();
+            httpaccept = (Request.ServerVariables["HTTP_ACCEPT"] ?? "").ToUpper();
+        }
+
+        #region Event Fire Methods
+
+        MDetectArgs mda = null;
+        if (this.DetectIpod())
+        {
+            mda = new MDetectArgs(dargsIpod);
+            if (this.OnDetectIpod != null)
+            {
+                this.OnDetectIpod(this, mda);
+            }
+        }
+        if (this.DetectIpad())
+        {
+            mda = new MDetectArgs(dargsIpad);
+            if (this.OnDetectIpad != null)
+            {
+                this.OnDetectIpad(this, mda);
+            }
+        }
+        if (this.DetectIphone())
+        {
+            mda = new MDetectArgs(dargsIphone);
+            if (this.OnDetectIphone != null)
+            {
+                this.OnDetectIphone(this, mda);
+            }
+        }
+        if (this.DetectIphoneOrIpod())
+        {
+            mda = new MDetectArgs(dargsIphoneOrIpod);
+            if (this.OnDetectDetectIPhoneOrIpod != null)
+            {
+                this.OnDetectDetectIPhoneOrIpod(this, mda);
+            }
+        }
+        if (this.DetectIos())
+        {
+            mda = new MDetectArgs(dargsIos);
+            if (this.OnDetectIos != null)
+            {
+                this.OnDetectIos(this, mda);
+            }
+        }
+        if (this.DetectAndroid())
+        {
+            mda = new MDetectArgs(dargsAndroid);
+            if (this.OnDetectAndroid != null)
+            {
+                this.OnDetectAndroid(this, mda);
+            }
+        }
+        if (this.DetectAndroidPhone())
+        {
+            mda = new MDetectArgs(dargsAndroidPhone);
+            if (this.OnDetectAndroidPhone != null)
+            {
+                this.OnDetectAndroidPhone(this, mda);
+            }
+        }
+        if (this.DetectAndroidTablet())
+        {
+            mda = new MDetectArgs(dargsAndroidTablet);
+            if (this.OnDetectAndroidTablet != null)
+            {
+                this.OnDetectAndroidTablet(this, mda);
+            }
+        }
+        if (this.DetectGoogleTV())
+        {
+            mda = new MDetectArgs(dargsGoogleTV);
+            if (this.OnDetectGoogleTV != null)
+            {
+                this.OnDetectGoogleTV(this, mda);
+            }
+        }
+        if (this.DetectWebkit())
+        {
+            mda = new MDetectArgs(dargsWebKit);
+            if (this.OnDetectWebkit != null)
+            {
+                this.OnDetectWebkit(this, mda);
+            }
+        }
+        if (this.DetectS60OssBrowser())
+        {
+            mda = new MDetectArgs(dargsS60);
+            if (this.OnDetectS60OssBrowser != null)
+            {
+                this.OnDetectS60OssBrowser(this, mda);
+            }
+        }
+        if (this.DetectSymbianOS())
+        {
+            mda = new MDetectArgs(dargsSymbianOS);
+            if (this.OnDetectSymbianOS != null)
+            {
+                this.OnDetectSymbianOS(this, mda);
+            }
+        }
+        if (this.DetectWindowsPhone())
+        {
+            mda = new MDetectArgs(dargsWindowsPhone);
+            if (this.OnDetectWindowsPhone != null)
+            {
+                this.OnDetectWindowsPhone(this, mda);
+            }
+        }
+        if (this.DetectWindowsMobile())
+        {
+            mda = new MDetectArgs(dargsWindowsMobile);
+            if (this.OnDetectWindowsMobile != null)
+            {
+                this.OnDetectWindowsMobile(this, mda);
+            }
+        }
+        if (this.DetectBlackBerry())
+        {
+            mda = new MDetectArgs(dargsBlackBerry);
+            if (this.OnDetectBlackBerry != null)
+            {
+                this.OnDetectBlackBerry(this, mda);
+            }
+        }
+        if (this.DetectBlackBerryWebKit())
+        {
+            mda = new MDetectArgs(dargsBlackBerryWebkit);
+            if (this.OnDetectBlackBerryWebkit != null)
+            {
+                this.OnDetectBlackBerryWebkit(this, mda);
+            }
+        }
+        if (this.DetectPalmOS())
+        {
+            mda = new MDetectArgs(dargsPalmOS);
+            if (this.OnDetectPalmOS != null)
+            {
+                this.OnDetectPalmOS(this, mda);
+            }
+        }
+        if (this.DetectPalmWebOS())
+        {
+            mda = new MDetectArgs(dargsPalmWebOS);
+            if (this.OnDetectPalmWebOS != null)
+            {
+                this.OnDetectPalmWebOS(this, mda);
+            }
+        }
+        if (this.DetectWebOSTablet())
+        {
+            mda = new MDetectArgs(dargsWebOSTablet);
+            if (this.OnDetectWebOSTablet != null)
+            {
+                this.OnDetectWebOSTablet(this, mda);
+            }
+        }
+        if (this.DetectSmartphone())
+        {
+            mda = new MDetectArgs(dargsSmartphone);
+            if (this.OnDetectSmartphone != null)
+            {
+                this.OnDetectSmartphone(this, mda);
+            }
+        }
+        if (this.DetectBrewDevice())
+        {
+            mda = new MDetectArgs(dargsBrewDevice);
+            if (this.OnDetectBrewDevice != null)
+            {
+                this.OnDetectBrewDevice(this, mda);
+            }
+        }
+        if (this.DetectDangerHiptop())
+        {
+            mda = new MDetectArgs(dargsDangerHiptop);
+            if (this.OnDetectDangerHiptop != null)
+            {
+                this.OnDetectDangerHiptop(this, mda);
+            }
+        }
+        if (this.DetectOperaMobile())
+        {
+            mda = new MDetectArgs(dargsOperaMobile);
+            if (this.OnDetectOperaMobile != null)
+            {
+                this.OnDetectOperaMobile(this, mda);
+            }
+        }
+        if (this.DetectWapWml())
+        {
+            mda = new MDetectArgs(dargsWapWml);
+            if (this.OnDetectWapWml != null)
+            {
+                this.OnDetectWapWml(this, mda);
+            }
+        }
+        if (this.DetectKindle())
+        {
+            mda = new MDetectArgs(dargsKindle);
+            if (this.OnDetectKindle != null)
+            {
+                this.OnDetectKindle(this, mda);
+            }
+        }
+        if (this.DetectMobileQuick())
+        {
+            mda = new MDetectArgs(dargsMobileQuick);
+            if (this.OnDetectMobileQuick != null)
+            {
+                this.OnDetectMobileQuick(this, mda);
+            }
+        }
+        if (this.DetectTierTablet())
+        {
+            mda = new MDetectArgs(dargsTierTablet);
+            if (this.OnDetectTierTablet != null)
+            {
+                this.OnDetectTierTablet(this, mda);
+            }
+        }
+        if (this.DetectTierIphone())
+        {
+            mda = new MDetectArgs(dargsTierIphone);
+            if (this.OnDetectTierIphone != null)
+            {
+                this.OnDetectTierIphone(this, mda);
+            }
+        }
+        if (this.DetectTierRichCss())
+        {
+            mda = new MDetectArgs(dargsTierRichCss);
+            if (this.OnDetectTierRichCss != null)
+            {
+                this.OnDetectTierRichCss(this, mda);
+            }
+        }
+        if (this.DetectTierOtherPhones())
+        {
+            mda = new MDetectArgs(dargsTierOtherPhones);
+            if (this.OnDetectTierOtherPhones != null)
+            {
+                this.OnDetectTierOtherPhones(this, mda);
+            }
+        }
+
+        #endregion Event Fire Methods
+
+    }
+
+    public class MDetectArgs : EventArgs
+    {
+        public MDetectArgs(string type)
+        {
+            this.Type = type;
+        }
+
+        public readonly string Type;
+    }
+
+    #region Mobile Device Detection Methods 
+    
+    
+	//*****************************
+	// Start device detection
+	//*****************************
+
+    //**************************
+    // Detects if the current device is an iPhone.
+    public bool DetectIphone()
+    {
+        if (useragent.IndexOf(deviceIphone)!= -1)
+        {
+            //The iPad and iPod touch say they're an iPhone! So let's disambiguate.
+            if (DetectIpad() || DetectIpod())
+            {
+                return false;
+            }
+            else
+                return true;
+        }
+        else
+            return false;
+    }
+    //IPhone delegate
+    public delegate void DetectIphoneHandler(object page, MDetectArgs args);
+    public event DetectIphoneHandler OnDetectIphone;
+
+
+    //**************************
+    // Detects if the current device is an iPod Touch.
+    public bool DetectIpod()
+    {
+        if (useragent.IndexOf(deviceIpod)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //Ipod delegate
+    public delegate void DetectIpodHandler(object page, MDetectArgs args);
+    public event DetectIpodHandler OnDetectIpod;
+
+
+    //**************************
+    // Detects if the current device is an iPad tablet.
+    public bool DetectIpad()
+    {
+        if (useragent.IndexOf(deviceIpad) != -1 && DetectWebkit())
+            return true;
+        else
+            return false;
+    }
+
+    //Ipod delegate
+    public delegate void DetectIpadHandler(object page, MDetectArgs args);
+    public event DetectIpadHandler OnDetectIpad;
+
+
+    //**************************
+    // Detects if the current device is an iPhone or iPod Touch.
+    public bool DetectIphoneOrIpod()
+    {
+        //We repeat the searches here because some iPods may report themselves as an iPhone, which would be okay.
+        if (useragent.IndexOf(deviceIphone)!= -1 ||
+            useragent.IndexOf(deviceIpod)!= -1)
+            return true;
+        else
+            return false;
+    }
+    //IPhoneOrIpod delegate
+    public delegate void DetectIPhoneOrIpodHandler(object page, MDetectArgs args);
+    public event DetectIPhoneOrIpodHandler OnDetectDetectIPhoneOrIpod;
+
+    //**************************
+    // Detects *any* iOS device: iPhone, iPod Touch, iPad.
+    public bool DetectIos()
+    {
+        if (DetectIphoneOrIpod() || DetectIpad())
+            return true;
+        else
+            return false;
+    }
+
+    //Ios delegate
+    public delegate void DetectIosHandler(object page, MDetectArgs args);
+    public event DetectIosHandler OnDetectIos;
+
+
+    //**************************
+    // Detects *any* Android OS-based device: phone, tablet, and multi-media player.
+    // Also detects Google TV.
+    public bool DetectAndroid()
+    {
+        if ((useragent.IndexOf(deviceAndroid) != -1) ||
+            DetectGoogleTV())
+            return true;
+        
+        return false;
+    }
+    //Android delegate
+    public delegate void DetectAndroidHandler(object page, MDetectArgs args);
+    public event DetectAndroidHandler OnDetectAndroid;
+
+    //**************************
+    // Detects if the current device is a (small-ish) Android OS-based device
+    // used for calling and/or multi-media (like a Samsung Galaxy Player).
+    // Google says these devices will have 'Android' AND 'mobile' in user agent.
+    // Ignores tablets (Honeycomb and later).
+    public bool DetectAndroidPhone()
+    {
+        //First, let's make sure we're on an Android device.
+        if (!DetectAndroid())
+            return false;
+
+        //If it's Android and has 'mobile' in it, Google says it's a phone.
+        if (useragent.IndexOf(mobile) != -1)
+            return true;
+
+        //Special check for Android devices with Opera Mobile/Mini. They should report here.
+        if (DetectOperaMobile())
+            return true;
+        
+        return false;
+    }
+
+    //Android Phone delegate
+    public delegate void DetectAndroidPhoneHandler(object page, MDetectArgs args);
+    public event DetectAndroidPhoneHandler OnDetectAndroidPhone;
+
+    //**************************
+    // Detects if the current device is a (self-reported) Android tablet.
+    // Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
+    public bool DetectAndroidTablet()
+    {
+        //First, let's make sure we're on an Android device.
+        if (!DetectAndroid())
+            return false;
+
+        //Special check for Android devices with Opera Mobile/Mini. They should NOT report here.
+        if (DetectOperaMobile())
+            return false;
+
+        //Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
+        if (useragent.IndexOf(mobile) > -1)
+            return false;
+        else
+            return true;
+    }
+    
+    //Android Tablet delegate
+    public delegate void DetectAndroidTabletHandler(object page, MDetectArgs args);
+    public event DetectAndroidTabletHandler OnDetectAndroidTablet;
+
+    //**************************
+    // Detects if the current device is a GoogleTV device.
+    public bool DetectGoogleTV()
+    {
+        if (useragent.IndexOf(deviceGoogleTV) != -1)
+            return true;
+        else
+            return false;
+    }
+    
+    //GoogleTV delegate
+    public delegate void DetectGoogleTVHandler(object page, MDetectArgs args);
+    public event DetectGoogleTVHandler OnDetectGoogleTV;
+
+    //**************************
+    // Detects if the current device is an Android OS-based device and
+    //   the browser is based on WebKit.
+    public bool DetectAndroidWebKit()
+    {
+        if (DetectAndroid() && DetectWebkit())
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is based on WebKit.
+    public bool DetectWebkit()
+    {
+        if (useragent.IndexOf(engineWebKit)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //Webkit delegate
+    public delegate void DetectWebkitHandler(object page, MDetectArgs args);
+    public event DetectWebkitHandler OnDetectWebkit;
+
+    //**************************
+    // Detects if the current browser is the Nokia S60 Open Source Browser.
+    public bool DetectS60OssBrowser()
+    {
+        //First, test for WebKit, then make sure it's either Symbian or S60.
+        if (DetectWebkit())
+        {
+            if (useragent.IndexOf(deviceSymbian)!= -1 ||
+                useragent.IndexOf(deviceS60)!= -1)
+            {
+                return true;
+            }
+            else
+                return false;
+        }
+        else
+            return false;
+    }
+
+    //S60OssBrowser delegate
+    public delegate void DetectS60OssBrowserHandler(object page, MDetectArgs args);
+    public event DetectS60OssBrowserHandler OnDetectS60OssBrowser;
+
+    //**************************
+    // Detects if the current device is any Symbian OS-based device,
+    //   including older S60, Series 70, Series 80, Series 90, and UIQ, 
+    //   or other browsers running on these devices.
+    public bool DetectSymbianOS()
+    {
+        if (useragent.IndexOf(deviceSymbian)!= -1 ||
+            useragent.IndexOf(deviceS60)!= -1 ||
+            useragent.IndexOf(deviceS70)!= -1 ||
+            useragent.IndexOf(deviceS80)!= -1 ||
+            useragent.IndexOf(deviceS90)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //SymbianOS delegate
+    public delegate void DetectSymbianOSHandler(object page, MDetectArgs args);
+    public event DetectSymbianOSHandler OnDetectSymbianOS;
+    
+
+    //**************************
+    // Detects if the current browser is a 
+    // Windows Phone 7, 8, or 10 device.
+    public bool DetectWindowsPhone()
+    {
+        if (DetectWindowsPhone7() || 
+        	DetectWindowsPhone8() ||
+        	DetectWindowsPhone10())
+            return true;
+        
+        return false;
+    }
+
+    //WindowsPhone delegate
+    public delegate void DetectWindowsPhoneHandler(object page, MDetectArgs args);
+    public event DetectWindowsPhoneHandler OnDetectWindowsPhone;
+
+    //**************************
+    // Detects if the current browser is a 
+    // Windows Phone 7 device.
+    public bool DetectWindowsPhone7()
+    {
+        if (useragent.IndexOf(deviceWinPhone7) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a 
+    // Windows Phone 8 device.
+    public bool DetectWindowsPhone8()
+    {
+        if (useragent.IndexOf(deviceWinPhone8) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a 
+    // Windows Phone 10 device.
+    public bool DetectWindowsPhone10()
+    {
+        if (useragent.IndexOf(deviceWinPhone10) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a Windows Mobile device.
+    // Excludes Windows Phone devices. 
+    // Focuses on Windows Mobile 6.xx and earlier.
+    public bool DetectWindowsMobile()
+    {
+        //Exclude new Windows Phone.
+        if (DetectWindowsPhone())
+            return false;
+        //Most devices use 'Windows CE', but some report 'iemobile' 
+        //  and some older ones report as 'PIE' for Pocket IE. 
+        if (useragent.IndexOf(deviceWinMob)!= -1 ||
+            useragent.IndexOf(deviceIeMob)!= -1 ||
+            useragent.IndexOf(enginePie) != -1)
+            return true;
+        //Test for Windows Mobile PPC but not old Macintosh PowerPC.
+        if (useragent.IndexOf(devicePpc) != -1 &&
+            !(useragent.IndexOf(deviceMacPpc) != -1))
+            return true;
+        //Test for certain Windwos Mobile-based HTC devices.
+        if (useragent.IndexOf(manuHtc) != -1 &&
+            useragent.IndexOf(deviceWindows) != -1)
+            return true;
+        if (DetectWapWml() == true &&
+            useragent.IndexOf(deviceWindows)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //WindowsMobile delegate
+    public delegate void DetectWindowsMobileHandler(object page, MDetectArgs args);
+    public event DetectWindowsMobileHandler OnDetectWindowsMobile;
+
+    //**************************
+    // Detects if the current browser is any BlackBerry device.
+    // Includes the PlayBook.
+    public bool DetectBlackBerry()
+    {
+        if (useragent.IndexOf(deviceBB)!= -1)
+            return true;
+        if (httpaccept.IndexOf(vndRIM)!= -1)
+            return true;
+        else
+            return false;
+    }
+    //BlackBerry delegate
+    public delegate void DetectBlackBerryHandler(object page, MDetectArgs args);
+    public event DetectBlackBerryHandler OnDetectBlackBerry;
+
+    //**************************
+    // Detects if the current browser is a BlackBerry 10 OS phone.
+   	// Excludes tablets.
+    public bool DetectBlackBerry10Phone()
+    {
+        if (useragent.IndexOf(deviceBB10) != -1 &&
+            useragent.IndexOf(mobile) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is on a BlackBerry tablet device.
+    //    Example: PlayBook
+    public bool DetectBlackBerryTablet()
+    {
+        if (useragent.IndexOf(deviceBBPlaybook) != -1)
+            return true;
+        else
+            return false;
+    }
+
+
+    //**************************
+    // Detects if the current browser is a BlackBerry device AND uses a
+    //    WebKit-based browser. These are signatures for the new BlackBerry OS 6.
+    //    Examples: Torch. Includes the Playbook.
+    public bool DetectBlackBerryWebKit()
+    {
+        if (DetectBlackBerry() && DetectWebkit())
+            return true;
+        else
+            return false;
+    }
+    //BlackBerry Webkit delegate
+    public delegate void DetectBlackBerryWebkitHandler(object page, MDetectArgs args);
+    public event DetectBlackBerryWebkitHandler OnDetectBlackBerryWebkit;
+
+
+    //**************************
+    // Detects if the current browser is a BlackBerry Touch
+    //    device, such as the Storm, Torch, and Bold Touch. Excludes the Playbook.
+    public bool DetectBlackBerryTouch()
+    {
+        if (DetectBlackBerry() && 
+            (useragent.IndexOf(deviceBBStorm) != -1 ||
+            useragent.IndexOf(deviceBBTorch) != -1 ||
+            useragent.IndexOf(deviceBBBoldTouch) != -1 ||
+            useragent.IndexOf(deviceBBCurveTouch) != -1))
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a BlackBerry device AND
+    //    has a more capable recent browser. Excludes the Playbook.
+    //    Excludes the new BlackBerry OS 6 and 7 browser!!
+    public bool DetectBlackBerryHigh()
+    {
+        //Disambiguate for BlackBerry OS 6 or 7 (WebKit) browser
+        if (DetectBlackBerryWebKit())
+            return false;
+        if (DetectBlackBerry())
+        {
+            if (DetectBlackBerryTouch() ||
+                useragent.IndexOf(deviceBBBold) != -1 ||
+                useragent.IndexOf(deviceBBTour) != -1 ||
+                useragent.IndexOf(deviceBBCurve) != -1)
+                return true;
+            else
+                return false;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a BlackBerry device AND
+    //    has an older, less capable browser. 
+    //    Examples: Pearl, 8800, Curve1.
+    public bool DetectBlackBerryLow()
+    {
+        if (DetectBlackBerry())
+        {
+            //Assume that if it's not in the High tier, then it's Low.
+            if (DetectBlackBerryHigh() || DetectBlackBerryWebKit())
+                return false;
+            else
+                return true;
+        }
+        else
+            return false;
+    }
+
+
+    //**************************
+    // Detects if the current browser is on a PalmOS device.
+    public bool DetectPalmOS()
+    {
+        //Most devices nowadays report as 'Palm', but some older ones reported as Blazer or Xiino.
+        if (useragent.IndexOf(devicePalm) != -1 ||
+            useragent.IndexOf(engineBlazer) != -1 ||
+            useragent.IndexOf(engineXiino) != -1)
+        {
+            //Make sure it's not WebOS first
+            if (DetectPalmWebOS() == true)
+                return false;
+            else
+                return true;
+        }
+        else
+            return false;
+    }
+    //PalmOS delegate
+    public delegate void DetectPalmOSHandler(object page, MDetectArgs args);
+    public event DetectPalmOSHandler OnDetectPalmOS;
+
+
+    //**************************
+    // Detects if the current browser is on a Palm device
+    //    running the new WebOS.
+    public bool DetectPalmWebOS()
+    {
+        if (useragent.IndexOf(deviceWebOS) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //PalmWebOS delegate
+    public delegate void DetectPalmWebOSHandler(object page, MDetectArgs args);
+    public event DetectPalmWebOSHandler OnDetectPalmWebOS;
+
+
+    //**************************
+    // Detects if the current browser is on an HP tablet running WebOS.
+    public bool DetectWebOSTablet()
+    {
+        if (useragent.IndexOf(deviceWebOShp) != -1 &&
+            useragent.IndexOf(deviceTablet) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+    //WebOS tablet delegate
+    public delegate void DetectWebOSTabletHandler(object page, MDetectArgs args);
+    public event DetectWebOSTabletHandler OnDetectWebOSTablet;
+
+
+    //**************************
+    // Detects if the current browser is on a WebOS smart TV.
+    public bool DetectWebOSTV()
+    {
+        if (useragent.IndexOf(deviceWebOStv) != -1 &&
+            useragent.IndexOf(smartTV2) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is Opera Mobile or Mini.
+    public bool DetectOperaMobile()
+    {
+        if (useragent.IndexOf(engineOpera)!= -1)
+        {
+            if ((useragent.IndexOf(mini)!= -1) ||
+             (useragent.IndexOf(mobi)!= -1))
+            {
+                return true;
+            }
+            else
+                return false;
+        }
+        else
+            return false;
+    }
+
+    //Opera Mobile delegate
+    public delegate void DetectOperaMobileHandler(object page, MDetectArgs args);
+    public event DetectOperaMobileHandler OnDetectOperaMobile;
+
+
+    //**************************
+    // Detects if the current browser is a
+    //    Garmin Nuvifone.
+    public bool DetectGarminNuvifone()
+    {
+        if (useragent.IndexOf(deviceNuvifone) != -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a device running the Bada OS from Samsung.
+    public bool DetectBada()
+    {
+        if (useragent.IndexOf(deviceBada) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a device running the Tizen smartphone OS.
+    public bool DetectTizen()
+    {
+        if (useragent.IndexOf(deviceTizen) != -1 &&
+            useragent.IndexOf(mobile) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is on a Tizen smart TV.
+    public bool DetectTizenTV()
+    {
+        if (useragent.IndexOf(deviceTizen) != -1 &&
+            useragent.IndexOf(smartTV1) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a device running the Meego OS.
+    public bool DetectMeego()
+    {
+        if (useragent.IndexOf(deviceMeego) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a phone running the Meego OS.
+    public bool DetectMeegoPhone()
+    {
+        if (useragent.IndexOf(deviceMeego) != -1 &&
+            useragent.IndexOf(mobile) != -1)
+        {
+            return true;
+        }
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects a mobile device (probably) running the Firefox OS.
+    public bool DetectFirefoxOS()
+    {
+        if (DetectFirefoxOSPhone() || DetectFirefoxOSTablet())
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a phone (probably) running the Firefox OS.
+    public bool DetectFirefoxOSPhone()
+    {
+        //First, let's make sure we're NOT on another major mobile OS.
+        if (DetectIos() || 
+        	DetectAndroid() ||
+        	DetectSailfish())
+            return false;        
+        
+        if ((useragent.IndexOf(engineFirefox) != -1) &&
+            (useragent.IndexOf(mobile) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a tablet (probably) running the Firefox OS.
+    public bool DetectFirefoxOSTablet()
+    {
+        //First, let's make sure we're NOT on another major mobile OS.
+        if (DetectIos() || 
+        	DetectAndroid() ||
+        	DetectSailfish())
+            return false;        
+        
+        if ((useragent.IndexOf(engineFirefox) != -1) &&
+            (useragent.IndexOf(deviceTablet) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a device running the Sailfish OS.
+    public bool DetectSailfish()
+    {
+        if (useragent.IndexOf(deviceSailfish) != -1)
+            return true;
+        else
+            return false;
+    }
+    
+    //**************************
+    // Detects a phone running the Sailfish OS.
+    public bool DetectSailfishPhone()
+    {
+        if (DetectSailfish() &&
+            (useragent.IndexOf(mobile) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a mobile device running the Ubuntu Mobile OS.
+    public bool DetectUbuntu()
+    {
+        if (DetectUbuntuPhone() || DetectUbuntuTablet())
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a phone running the Ubuntu Mobile OS.
+    public bool DetectUbuntuPhone()
+    {
+        if ((useragent.IndexOf(deviceUbuntu) != -1) &&
+            (useragent.IndexOf(mobile) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects a tablet running the Ubuntu Mobile OS.
+    public bool DetectUbuntuTablet()
+    {
+        if ((useragent.IndexOf(deviceUbuntu) != -1) &&
+            (useragent.IndexOf(deviceTablet) != -1))
+            return true;
+        
+        return false;
+    }
+
+    //**************************
+    // Detects whether the device is a Brew-powered device.
+    public bool DetectBrewDevice()
+    {
+        if (useragent.IndexOf(deviceBrew)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //BrewDevice delegate
+    public delegate void DetectBrewDeviceHandler(object page, MDetectArgs args);
+    public event DetectBrewDeviceHandler OnDetectBrewDevice;
+
+    //**************************
+    // Detects the Danger Hiptop device.
+    public bool DetectDangerHiptop()
+    {
+        if (useragent.IndexOf(deviceDanger)!= -1 ||
+            useragent.IndexOf(deviceHiptop)!= -1)
+            return true;
+        else
+            return false;
+    }
+    //DangerHiptop delegate
+    public delegate void DetectDangerHiptopHandler(object page, MDetectArgs args);
+    public event DetectDangerHiptopHandler OnDetectDangerHiptop;
+
+    //**************************
+    // Detects whether the device supports WAP or WML.
+    public bool DetectWapWml()
+    {
+        if (httpaccept.IndexOf(vndwap)!= -1 ||
+            httpaccept.IndexOf(wml)!= -1)
+            return true;
+        else
+            return false;
+    }
+    //WapWml delegate
+    public delegate void DetectWapWmlHandler(object page, MDetectArgs args);
+    public event DetectWapWmlHandler OnDetectWapWml;
+
+
+    //**************************
+    // Detects if the current device is an Amazon Kindle (eInk devices only).
+    // Note: For the Kindle Fire, use the normal Android methods.
+    public bool DetectKindle()
+    {
+        if (useragent.IndexOf(deviceKindle) != -1 &&
+            !DetectAndroid())
+            return true;
+        else
+            return false;
+    }
+
+    //Kindle delegate
+    public delegate void DetectKindleHandler(object page, MDetectArgs args);
+    public event DetectKindleHandler OnDetectKindle;
+
+
+    //**************************
+    // Detects if the current Amazon device is using the Silk Browser.
+    // Note: Typically used by the the Kindle Fire.
+    public bool DetectAmazonSilk()
+    {
+        if (useragent.IndexOf(engineSilk) != -1)
+            return true;
+        else
+            return false;
+    }
+
+
+    //**************************
+    // Detects if the current device is a Sony Playstation.
+    public bool DetectSonyPlaystation()
+    {
+        if (useragent.IndexOf(devicePlaystation)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is a handheld gaming device with
+    // a touchscreen and modern iPhone-class browser. Includes the Playstation Vita.
+    public bool DetectGamingHandheld()
+    {
+        if (useragent.IndexOf(devicePlaystation)!= -1 &&
+             useragent.IndexOf(devicePlaystationVita)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is a Nintendo game device.
+    public bool DetectNintendo()
+    {
+        if (useragent.IndexOf(deviceNintendo)!= -1 ||
+             useragent.IndexOf(deviceWii)!= -1 ||
+             useragent.IndexOf(deviceNintendoDs)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is a Microsoft Xbox.
+    public bool DetectXbox()
+    {
+        if (useragent.IndexOf(deviceXbox)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is an Internet-capable game console.
+    public bool DetectGameConsole()
+    {
+        if (DetectSonyPlaystation())
+            return true;
+        else if (DetectNintendo())
+            return true;
+        else if (DetectXbox())
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device supports MIDP, a mobile Java technology.
+    public bool DetectMidpCapable()
+    {
+        if (useragent.IndexOf(deviceMidp)!= -1 ||
+            httpaccept.IndexOf(deviceMidp)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is on one of the Maemo-based Nokia Internet Tablets.
+    public bool DetectMaemoTablet()
+    {
+        if (useragent.IndexOf(maemo) != -1)
+            return true;
+        //For Nokia N810, must be Linux + Tablet, or else it could be something else. 
+        else if (useragent.IndexOf(linux) != -1 &&
+            useragent.IndexOf(deviceTablet) != -1 &&
+            !DetectWebOSTablet() &&
+            !DetectAndroid())
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current device is an Archos media player/Internet tablet.
+    public bool DetectArchos()
+    {
+        if (useragent.IndexOf(deviceArchos)!= -1)
+            return true;
+        else
+            return false;
+    }
+
+    //**************************
+    // Detects if the current browser is a Sony Mylo device.
+    public bool DetectSonyMylo()
+    {
+        if ((useragent.IndexOf(manuSony)!= -1) &&
+        	((useragent.IndexOf(qtembedded)!= -1) ||
+             (useragent.IndexOf(mylocom2)!= -1)))
+			return true;        
+        
+        return false;
+    }
+
+
+
+	//*****************************
+	// Device Classes
+	//*****************************
+   
+    //**************************
+    // Check to see whether the device is any device
+    //   in the 'smartphone' category.
+    // Note: It's better to use DetectTierIphone() for modern touchscreen devices. 
+    public bool DetectSmartphone()
+    {
+        if (DetectTierIphone() ||
+            DetectS60OssBrowser() ||
+            DetectSymbianOS() ||
+            DetectWindowsMobile() ||
+            DetectBlackBerry() ||
+            DetectMeegoPhone() ||
+            DetectPalmOS())
+            return true;
+        else
+            return false;
+    }
+
+    //DetectSmartphone delegate
+    public delegate void DetectSmartphoneHandler(object page, MDetectArgs args);
+    public event DetectSmartphoneHandler OnDetectSmartphone;
+
+    //**************************
+    //   Detects if the current device is a mobile device.
+    //   This method catches most of the popular modern devices.
+    //   Excludes Apple iPads and other modern tablets.
+    public bool DetectMobileQuick()
+    {
+        //Let's exclude tablets
+        if (DetectTierTablet())
+            return false;
+
+        //Most mobile browsing is done on smartphones
+        if (DetectSmartphone())
+            return true;
+
+        //Catch-all for many mobile devices
+        if (useragent.IndexOf(mobile) != -1)
+            return true;
+
+        if (DetectOperaMobile())
+            return true;
+        
+        //We also look for Kindle devices
+        if (DetectKindle() ||
+            DetectAmazonSilk())
+            return true;
+        
+        if (DetectWapWml() ||
+            DetectMidpCapable() ||
+            DetectBrewDevice())
+            return true;
+
+        if ((useragent.IndexOf(engineNetfront) != -1) ||
+            (useragent.IndexOf(engineUpBrowser) != -1))
+            return true;
+
+        return false;
+    }
+
+    //DetectMobileQuick delegate
+    public delegate void DetectMobileQuickHandler(object page, MDetectArgs args);
+    public event DetectMobileQuickHandler OnDetectMobileQuick;
+
+
+    //**************************
+    // The longer and more thorough way to detect for a mobile device.
+    //   Will probably detect most feature phones,
+    //   smartphone-class devices, Internet Tablets, 
+    //   Internet-enabled game consoles, etc.
+    //   This ought to catch a lot of the more obscure and older devices, also --
+    //   but no promises on thoroughness!
+    public bool DetectMobileLong()
+    {
+        if (DetectMobileQuick())
+            return true;
+            
+        if (DetectGameConsole())
+            return true;
+
+        if (DetectDangerHiptop() ||
+            DetectMaemoTablet() ||
+            DetectSonyMylo() ||
+            DetectArchos())
+            return true;
+
+        if ((useragent.IndexOf(devicePda) != -1) &&
+            (useragent.IndexOf(disUpdate) != -1))
+            return true;
+
+        //Detect older phones from certain manufacturers and operators. 
+        if ((useragent.IndexOf(uplink) != -1)  ||
+            (useragent.IndexOf(engineOpenWeb) != -1) ||
+            (useragent.IndexOf(manuSamsung1) != -1) ||
+            (useragent.IndexOf(manuSonyEricsson) != -1) ||
+            (useragent.IndexOf(manuericsson) != -1) ||
+            (useragent.IndexOf(svcDocomo) != -1) ||
+            (useragent.IndexOf(svcKddi) != -1) ||
+            (useragent.IndexOf(svcVodafone) != -1))
+            return true;
+
+        return false;
+    }
+
+
+
+    //*****************************
+    // For Mobile Web Site Design
+    //*****************************
+
+
+    //**************************
+    // The quick way to detect for a tier of devices.
+    //   This method detects for the new generation of
+    //   HTML 5 capable, larger screen tablets.
+    //   Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
+    public bool DetectTierTablet()
+    {
+        if (DetectIpad()
+            || DetectAndroidTablet()
+            || DetectBlackBerryTablet()
+            || DetectFirefoxOSTablet()
+            || DetectUbuntuTablet()
+            || DetectWebOSTablet())
+            return true;
+        else
+            return false;
+    }
+
+    //DetectTierTablet delegate
+    public delegate void DetectTierTabletHandler(object page, MDetectArgs args);
+    public event DetectTierTabletHandler OnDetectTierTablet;
+
+
+    //**************************
+    // The quick way to detect for a tier of devices.
+    //   This method detects for devices which can 
+    //   display iPhone-optimized web content.
+    //   Includes iPhone, iPod Touch, Android, Windows Phone, BB10, Playstation Vita, etc.
+    public bool DetectTierIphone()
+    {
+        if (DetectIphoneOrIpod() ||
+            DetectAndroidPhone() ||
+            DetectWindowsPhone() ||
+            DetectBlackBerry10Phone() ||
+            DetectPalmWebOS() ||
+            DetectBada() ||
+            DetectTizen() ||
+            DetectFirefoxOSPhone() ||
+            DetectSailfishPhone() ||
+            DetectUbuntuPhone() ||
+			DetectGamingHandheld())
+            return true;
+        else
+            return false;
+    }
+    
+    //DetectTierIphone delegate
+    public delegate void DetectTierIphoneHandler(object page, MDetectArgs args);
+    public event DetectTierIphoneHandler OnDetectTierIphone;
+
+
+    //**************************
+    // The quick way to detect for a tier of devices.
+    //   This method detects for devices which are likely to be capable 
+    //   of viewing CSS content optimized for the iPhone, 
+    //   but may not necessarily support JavaScript.
+    //   Excludes all iPhone Tier devices.
+    public bool DetectTierRichCss()
+    {
+        if (DetectMobileQuick())
+        {
+            //Exclude iPhone Tier and e-Ink Kindle devices
+            if (DetectTierIphone() || DetectKindle())
+                return false;
+
+            if (DetectWebkit() ||
+                DetectS60OssBrowser())
+                return true;
+
+            //Note: 'High' BlackBerry devices ONLY
+            if (DetectBlackBerryHigh() == true)
+                return true;
+
+            //Older Windows 'Mobile' isn't good enough for iPhone Tier.
+            if (DetectWindowsMobile() == true)
+                return true;
+            if (useragent.IndexOf(engineTelecaQ) != -1)
+                return true;
+
+            else
+                return false;
+        }
+        else
+            return false;
+    }
+
+    //DetectTierRichCss delegate
+    public delegate void DetectTierRichCssHandler(object page, MDetectArgs args);
+    public event DetectTierRichCssHandler OnDetectTierRichCss;
+
+
+    //**************************
+    // The quick way to detect for a tier of devices.
+    //   This method detects for all other types of phones,
+    //   but excludes the iPhone and Smartphone Tier devices.
+    public bool DetectTierOtherPhones()
+    {
+        if (DetectMobileLong() == true)
+        {
+            //Exclude devices in the other 2 categories
+            if (DetectTierIphone() ||
+                DetectTierRichCss())
+                return false;
+            else
+                return true;
+        }
+        else
+            return false;
+    }
+
+    //DetectTierOtherPhones delegate
+    public delegate void DetectTierOtherPhonesHandler(object page, MDetectArgs args);
+    public event DetectTierOtherPhonesHandler OnDetectTierOtherPhones;
+
+    //***************************************************************
+    #endregion
+
+    //Instead of overriding OnInit(), you can override InitializeCulture()
+    //  so that detection can happen earlier in page's lifecycle, if necessary. 
+    protected override void OnInit(EventArgs e)
+    {
+        base.OnInit(e);
+        
+        if (useragent == "" && httpaccept == "")
+        {
+            useragent = (Request.ServerVariables["HTTP_USER_AGENT"] ?? "").ToUpper();
+            httpaccept = (Request.ServerVariables["HTTP_ACCEPT"] ?? "").ToUpper();
+        }
+
+    }
+}
diff --git a/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx
new file mode 100755
index 0000000000000000000000000000000000000000..a0b14adbe9deb7081b8f9564198f901cecf60270
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx	
@@ -0,0 +1 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MobileDetectControl.ascx.cs" Inherits="WebApplication1.MobileDetect.MobileDetectControl" %>
diff --git a/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx.cs b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx.cs
new file mode 100755
index 0000000000000000000000000000000000000000..42ae4319a9a7d0c77da333768c772650960345a5
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx.cs	
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace WebApplication1.MobileDetect
+{
+    public partial class MobileDetectControl : MDetectControl
+    {
+        protected void Page_Load(object sender, EventArgs e)
+        {
+            this.FireEvents();
+        }
+
+
+        protected override void OnInit(EventArgs e)
+        {
+            base.OnInit(e);
+
+            //As a test, let's listen for any WebKit-based device. 
+            OnDetectWebkit += new DetectWebkitHandler(MobileDetectControl_OnDetectWebkit);
+
+        }
+
+        void MobileDetectControl_OnDetectWebkit(object page, MDetectControl.MDetectArgs args)
+        {
+            //Write the Type value from the argument to the web page. 
+            Response.Write("<b>This browser is " + args.Type + "</b>");
+
+        }
+    }
+}
\ No newline at end of file
diff --git a/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx.designer.cs b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx.designer.cs
new file mode 100755
index 0000000000000000000000000000000000000000..2b700c811dc554b9299ade8f706792955732d773
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectControl.ascx.designer.cs	
@@ -0,0 +1,18 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.42
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace WebApplication1.MobileDetect
+{
+
+
+    public partial class MobileDetectControl
+    {
+    }
+}
diff --git a/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx
new file mode 100755
index 0000000000000000000000000000000000000000..54c01cb221e1cd738f9879cce918444e24a63b55
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx	
@@ -0,0 +1,17 @@
+<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MobileDetectTestPage.aspx.cs" Inherits="WebApplication1.MobileDetect.MobileDetectTestPage" %>
+<%@ Register  TagPrefix="mdc" TagName="MobileDetect" Src="MobileDetectControl.ascx" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" >
+<head runat="server">
+    <title></title>
+</head>
+<body>
+    <form id="form1" runat="server">
+    <div>
+    <mdc:MobileDetect id="MDC" runat="server"></mdc:MobileDetect>
+    </div>
+    </form>
+</body>
+</html>
diff --git a/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx.cs b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx.cs
new file mode 100755
index 0000000000000000000000000000000000000000..c65d3c883e1d07ae70d433ac2d921c19ec642897
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx.cs	
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace WebApplication1.MobileDetect
+{
+    public partial class MobileDetectTestPage : System.Web.UI.Page
+    {
+        protected void Page_Load(object sender, EventArgs e)
+        {
+
+        }
+    }
+}
diff --git a/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx.designer.cs b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx.designer.cs
new file mode 100755
index 0000000000000000000000000000000000000000..d7d2426ac276de62733c9a1bbba532958e199402
--- /dev/null
+++ b/vendor/ahand/mobileesp/ASP_NET/UserControl Technique/MobileDetectTestPage.aspx.designer.cs	
@@ -0,0 +1,34 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.3607
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace WebApplication1.MobileDetect {
+    
+    
+    public partial class MobileDetectTestPage {
+        
+        /// <summary>
+        /// form1 control.
+        /// </summary>
+        /// <remarks>
+        /// Auto-generated field.
+        /// To modify move field declaration from designer file to code-behind file.
+        /// </remarks>
+        protected global::System.Web.UI.HtmlControls.HtmlForm form1;
+        
+        /// <summary>
+        /// MDC control.
+        /// </summary>
+        /// <remarks>
+        /// Auto-generated field.
+        /// To modify move field declaration from designer file to code-behind file.
+        /// </remarks>
+        protected global::WebApplication1.MobileDetect.MobileDetectControl MDC;
+    }
+}
diff --git a/vendor/ahand/mobileesp/Cpp/mdetect.h b/vendor/ahand/mobileesp/Cpp/mdetect.h
new file mode 100755
index 0000000000000000000000000000000000000000..92f22fefc217a85c481fadd85485a7332da81462
--- /dev/null
+++ b/vendor/ahand/mobileesp/Cpp/mdetect.h
@@ -0,0 +1,1312 @@
+/* *******************************************
+// Copyright 2010-2015, Anthony Hand
+//
+//
+// File version 2015.05.13 (May 13, 2015)
+// Updates:
+//	- Moved MobileESP to GitHub. https://github.com/ahand/mobileesp
+//	- Opera Mobile/Mini browser has the same UA string on multiple platforms and doesn't differentiate phone vs. tablet. 
+//		- Removed DetectOperaAndroidPhone(). This method is no longer reliable. 
+//		- Removed DetectOperaAndroidTablet(). This method is no longer reliable. 
+//	- Added support for Windows Phone 10: variable and DetectWindowsPhone10()
+//	- Updated DetectWindowsPhone() to include WP10. 
+//	- Added support for Firefox OS.  
+//		- A variable plus DetectFirefoxOS(), DetectFirefoxOSPhone(), DetectFirefoxOSTablet()
+//		- NOTE: Firefox doesn't add UA tokens to definitively identify Firefox OS vs. their browsers on other mobile platforms.
+//	- Added support for Sailfish OS. Not enough info to add a tablet detection method at this time. 
+//		- A variable plus DetectSailfish(), DetectSailfishPhone()
+//	- Added support for Ubuntu Mobile OS. 
+//		- DetectUbuntu(), DetectUbuntuPhone(), DetectUbuntuTablet()
+//	- Added support for 2 smart TV OSes. They lack browsers but do have WebViews for use by HTML apps. 
+//		- One variable for Samsung Tizen TVs, plus DetectTizenTV()
+//		- One variable for LG WebOS TVs, plus DetectWebOSTV()
+//	- Updated DetectTizen(). Now tests for “mobile” to disambiguate from Samsung Smart TVs
+//	- Removed variables for obsolete devices: deviceHtcFlyer, deviceXoom.
+//	- Updated DetectAndroid(). No longer has a special test case for the HTC Flyer tablet. 
+//	- Updated DetectAndroidPhone(). 
+//		- Updated internal detection code for Android. 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android and reports here if relevant. 
+//	- Updated DetectAndroidTablet(). 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android to exclude it from here.
+//	- DetectMeego(): Changed definition for this method. Now detects any Meego OS device, not just phones. 
+//	- DetectMeegoPhone(): NEW. For Meego phones. Ought to detect Opera browsers on Meego, as well.  
+//	- DetectTierIphone(): Added support for phones running Sailfish, Ubuntu and Firefox Mobile. 
+//	- DetectTierTablet(): Added support for tablets running Ubuntu and Firefox Mobile. 
+//	- DetectSmartphone(): Added support for Meego phones. 
+//	- Removed the variable for Obigo, an embedded browser. The browser is on old devices. 
+//		- Couldn’t find info on current Obigo embedded browser user agent strings.
+//	- Refactored the detection logic in DetectMobileQuick() and DetectMobileLong().
+//		- Moved a few detection tests for older browsers to Long. 
+//
+//
+//
+// File version 2014.01.24 (January 24, 2014)
+//	Updates:
+//	- Ported to C++ by Kiran T. Based on the PHP library.
+//
+//
+//
+// LICENSE INFORMATION
+// 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. 
+//
+//
+// ABOUT THIS PROJECT
+//   Project Owner: Anthony Hand
+//   Email: anthony.hand@gmail.com
+//   Web Site: http://www.mobileesp.com
+//   Source Files: https://github.com/ahand/mobileesp
+//   
+//   Versions of this code are available for:
+//      PHP, JavaScript, Java, ASP.NET (C#), C++, and Ruby
+//
+// *******************************************
+*/
+#ifndef MDETECT_H
+#define MDETECT_H
+
+#include <string>
+#include <algorithm>
+
+using namespace std;
+
+namespace MobileESP
+{
+   //Initialize some initial smartphone string variables.
+   const string engineWebKit = "webkit";
+
+   const string deviceIphone = "iphone";
+   const string deviceIpod = "ipod";
+   const string deviceIpad = "ipad";
+   const string deviceMacPpc = "macintosh"; //Used for disambiguation
+
+   const string deviceAndroid = "android";
+   const string deviceGoogleTV = "googletv";
+   const string deviceHtcFlyer = "htc_flyer"; //HTC Flyer
+   
+   const string deviceWinPhone7 = "windows phone os 7"; 
+   const string deviceWinPhone8 = "windows phone 8"; 
+   const string deviceWinPhone10 = "windows phone 10"; 
+   const string deviceWinMob = "windows ce";
+   const string deviceWindows = "windows"; 
+   const string deviceIeMob = "iemobile";
+   const string devicePpc = "ppc"; //Stands for PocketPC
+   const string enginePie = "wm5 pie"; //An old Windows Mobile
+   
+   const string deviceBB = "blackberry";   
+   const string deviceBB10 = "bb10"; //For the new BB 10 OS
+   const string vndRIM = "vnd.rim"; //Detectable when BB devices emulate IE or Firefox
+   const string deviceBBStorm = "blackberry95";  //Storm 1 and 2
+   const string deviceBBBold = "blackberry97"; //Bold 97x0 (non-touch)
+   const string deviceBBBoldTouch = "blackberry 99"; //Bold 99x0 (touchscreen)
+   const string deviceBBTour = "blackberry96"; //Tour
+   const string deviceBBCurve = "blackberry89"; //Curve2
+   const string deviceBBCurveTouch = "blackberry 938"; //Curve Touch
+   const string deviceBBTorch = "blackberry 98"; //Torch
+   const string deviceBBPlaybook = "playbook"; //PlayBook tablet
+   
+   const string deviceSymbian = "symbian";
+   const string deviceS60 = "series60";
+   const string deviceS70 = "series70";
+   const string deviceS80 = "series80";
+   const string deviceS90 = "series90";
+   
+   const string devicePalm = "palm";
+   const string deviceWebOS = "webos"; //For Palm devices
+   const string deviceWebOStv = "web0s"; //For LG TVs
+   const string deviceWebOShp = "hpwos"; //For HP's line of WebOS devices
+   
+   const string engineBlazer = "blazer"; //Old Palm browser
+   const string engineXiino = "xiino"; //Another old Palm
+   
+   const string deviceNuvifone = "nuvifone"; //Garmin Nuvifone
+   const string deviceBada = "bada"; //Samsung's Bada OS
+   const string deviceTizen = "tizen"; //Tizen OS
+   const string deviceMeego = "meego"; //Meego OS
+   const string deviceSailfish = "sailfish"; //Sailfish OS
+   const string deviceUbuntu = "ubuntu"; //Ubuntu Mobile OS
+
+   const string deviceKindle = "kindle"; //Amazon Kindle, eInk one
+   const string engineSilk = "silk-accelerated"; //Amazon's accelerated Silk browser for Kindle Fire
+   
+   //Initialize variables for mobile-specific content.
+   const string vndwap = "vnd.wap";
+   const string wml = "wml";   
+   
+   //Initialize variables for other random devices and mobile browsers.
+   const string deviceTablet = "tablet"; //Generic term for slate and tablet devices
+   const string deviceBrew = "brew";
+   const string deviceDanger = "danger";
+   const string deviceHiptop = "hiptop";
+   const string devicePlaystation = "playstation";
+   const string devicePlaystationVita = "vita";
+   const string deviceNintendoDs = "nitro";
+   const string deviceNintendo = "nintendo";
+   const string deviceWii = "wii";
+   const string deviceXbox = "xbox";
+   const string deviceArchos = "archos";
+   
+   const string engineFirefox = "firefox"; //For Firefox OS
+   const string engineOpera = "opera"; //Popular browser
+   const string engineNetfront = "netfront"; //Common embedded OS browser
+   const string engineUpBrowser = "up.browser"; //common on some phones
+   const string engineOpenWeb = "openweb"; //Transcoding by OpenWave server
+   const string deviceMidp = "midp"; //a mobile Java technology
+   const string uplink = "up.link";
+   const string engineTelecaQ = "teleca q"; //a modern feature phone browser
+   
+   const string devicePda = "pda"; //some devices report themselves as PDAs
+   const string mini = "mini";  //Some mobile browsers put 'mini' in their names.
+   const string mobile = "mobile"; //Some mobile browsers put 'mobile' in their user agent strings.
+   const string mobi = "mobi"; //Some mobile browsers put 'mobi' in their user agent strings.
+   
+   //Smart TV strings
+   const string smartTV1 = "smart-tv"; //Samsung Tizen smart TVs
+   const string smartTV2 = "smarttv"; //LG WebOS smart TVs
+
+   //Use Maemo, Tablet, and Linux to test for Nokia's Internet Tablets.
+   const string maemo = "maemo";
+   const string llinux = "linux";
+   const string qtembedded = "qt embedded"; //for Sony Mylo and others
+   const string mylocom2 = "com2"; //for Sony Mylo also
+   
+   //In some UserAgents, the only clue is the manufacturer.
+   const string manuSonyEricsson = "sonyericsson";
+   const string manuericsson = "ericsson";
+   const string manuSamsung1 = "sec-sgh";
+   const string manuSony = "sony";
+   const string manuHtc = "htc";
+
+   //In some UserAgents, the only clue is the operator.
+   const string svcDocomo = "docomo";
+   const string svcKddi = "kddi";
+   const string svcVodafone = "vodafone";
+
+   //Disambiguation strings.
+   const string disUpdate = "update"; //pda vs. update
+
+//**************************
+// The uagent_info class encapsulates information about
+//   a browser's connection to your web site. 
+//   You can use it to find out whether the browser asking for
+//   your site's content is probably running on a mobile device.
+//   The methods were written so you can be as granular as you want.
+//   For example, enquiring whether it's as specific as an iPod Touch or
+//   as general as a smartphone class device.
+//   The object's methods return 1 for true, or 0 for false.
+class uagent_info
+{
+private:
+   string useragent;
+   string httpaccept;
+   //Let's store values for quickly accessing the same info multiple times. InitCompleted
+   bool initCompleted; //Stores whether we're currently initializing the most popular functions.
+   bool isWebkit; //Stores the result of DetectWebkit()
+   bool isMobilePhone; //Stores the result of DetectMobileQuick()
+   bool isIphone; //Stores the result of DetectIphone()
+   bool isAndroid; //Stores the result of DetectAndroid()
+   bool isAndroidPhone; //Stores the result of DetectAndroidPhone()
+   bool isTierTablet; //Stores the result of DetectTierTablet()
+   bool isTierIphone; //Stores the result of DetectTierIphone()
+   bool isTierRichCss; //Stores the result of DetectTierRichCss()
+   bool isTierGenericMobile; //Stores the result of DetectTierOtherPhones()
+
+   //**************************
+   // Initialize Key Stored Values.
+   void InitDeviceScan()
+   {
+        //Save these properties to speed processing
+        isWebkit = DetectWebkit();
+        isIphone = DetectIphone();
+        isAndroid = DetectAndroid();
+        isAndroidPhone = DetectAndroidPhone();
+        
+        //These tiers are the most useful for web development
+        isTierTablet = DetectTierTablet(); //Do first
+        isTierIphone = DetectTierIphone(); //Do second
+        isMobilePhone = DetectMobileQuick(); //Do third
+        
+        //Optional: Comment these out if you NEVER use them.
+        isTierRichCss = DetectTierRichCss();
+        isTierGenericMobile = DetectTierOtherPhones();
+        
+        initCompleted = true;
+   }
+
+public:
+
+   //**************************
+   //The constructor.
+   uagent_info(const string &user_agent,const string &accept):
+	useragent(user_agent),
+	httpaccept(accept),
+   	initCompleted(false),
+  	isWebkit(false),
+	isMobilePhone(false),
+	isIphone(false),
+	isAndroid(false),
+	isAndroidPhone(false),
+	isTierTablet(false),
+	isTierIphone(false),
+	isTierRichCss(false),
+	isTierGenericMobile(false)
+   { 
+	 std::transform(useragent.begin(), useragent.end(),useragent.begin(), ::tolower);
+	 std::transform(httpaccept.begin(), httpaccept.end(),httpaccept.begin(), ::tolower);
+		
+	 //Let's initialize some values to save cycles later.
+	 InitDeviceScan();
+   }
+   
+   
+
+   //**************************
+   //Returns the contents of the User Agent value, in lower case.
+   string Get_Uagent()
+   { 
+       return useragent;
+   }
+
+   //**************************
+   //Returns the contents of the HTTP Accept value, in lower case.
+   string Get_HttpAccept()
+   { 
+       return httpaccept;
+   }
+   
+
+   //**************************
+   // Detects if the current device is an iPhone.
+   bool DetectIphone()
+   {
+      if (initCompleted == true ||
+          isIphone == true)
+         return isIphone;
+      
+      if (useragent.find( MobileESP::deviceIphone) != std::string::npos)
+      {
+         //The iPad and iPod Touch say they're an iPhone. So let's disambiguate.
+         if (DetectIpad() == true ||
+             DetectIpod() == true)
+            return false;
+         //Yay! It's an iPhone!
+         else
+            return true; 
+      }
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is an iPod Touch.
+   bool DetectIpod()
+   {
+      if (useragent.find( MobileESP::deviceIpod) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current device is an iPad tablet.
+   bool DetectIpad()
+   {
+      if (useragent.find( MobileESP::deviceIpad) != std::string::npos &&
+          DetectWebkit() == true)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is an iPhone or iPod Touch.
+   bool DetectIphoneOrIpod()
+   {
+       //We repeat the searches here because some iPods may report themselves as an iPhone, which would be okay.
+      if (DetectIphone() == true ||
+             DetectIpod() == true)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects *any* iOS device: iPhone, iPod Touch, iPad.
+   bool DetectIos()
+   {
+      if ((DetectIphoneOrIpod() == true) ||
+        (DetectIpad() == true))
+         return true; 
+      else
+         return false;
+   }
+
+
+   //**************************
+   // Detects *any* Android OS-based device: phone, tablet, and multi-media player.
+   // Also detects Google TV.
+   bool DetectAndroid()
+   {
+      if (initCompleted == true ||
+          isAndroid == true)
+         return isAndroid;
+
+      if ((useragent.find( MobileESP::deviceAndroid) != std::string::npos)
+          || (DetectGoogleTV() == true))
+         return true; 
+         
+      return false; 
+   }
+
+   //**************************
+   // Detects if the current device is a (small-ish) Android OS-based device
+   // used for calling and/or multi-media (like a Samsung Galaxy Player).
+   // Google says these devices will have 'Android' AND 'mobile' in user agent.
+   // Ignores tablets (Honeycomb and later).
+   bool DetectAndroidPhone()
+   {
+      if (initCompleted == true ||
+          isAndroidPhone == true)
+         return isAndroidPhone;
+
+      //First, let's make sure we're on an Android device.
+      if (DetectAndroid() == false)
+         return false; 
+
+      //If it's Android and has 'mobile' in it, Google says it's a phone.
+      if (useragent.find( MobileESP::mobile) != std::string::npos)
+         return true;
+      
+      //Special check for Android devices with Opera Mobile/Mini. They should report here.
+      if ((DetectOperaMobile() == true))
+         return true; 
+
+      return false; 
+   }
+
+   //**************************
+   // Detects if the current device is a (self-reported) Android tablet.
+   // Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
+   bool DetectAndroidTablet()
+   {
+      //First, let's make sure we're on an Android device.
+      if (DetectAndroid() == false)
+         return false; 
+
+      //Special check for Android devices with Opera Mobile/Mini. They should NOT report here.
+      if (DetectOperaMobile() == true)
+         return false; 
+         
+      //Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
+      if (useragent.find( MobileESP::mobile) != std::string::npos)
+         return false;
+         
+      return true; 
+   }
+
+   //**************************
+   // Detects if the current device is an Android OS-based device and
+   //   the browser is based on WebKit.
+   bool DetectAndroidWebKit()
+   {
+      if ((DetectAndroid() == true) &&
+		(DetectWebkit() == true))
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is a GoogleTV.
+   bool DetectGoogleTV()
+   {
+      if (useragent.find( MobileESP::deviceGoogleTV) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is based on WebKit.
+   bool DetectWebkit()
+   {
+      if (initCompleted == true ||
+          isWebkit == true)
+         return isWebkit;
+
+      if (useragent.find( MobileESP::engineWebKit) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+
+   //**************************
+   // Detects if the current browser is a 
+   // Windows Phone 7, 8, or 10 device.
+   bool DetectWindowsPhone()
+   {
+      if ((DetectWindowsPhone7() == true)
+			|| (DetectWindowsPhone8() == true)
+			|| (DetectWindowsPhone10() == true))
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects a Windows Phone 7 device (in mobile browsing mode).
+   bool DetectWindowsPhone7()
+   {
+      if (useragent.find( MobileESP::deviceWinPhone7) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects a Windows Phone 8 device (in mobile browsing mode).
+   bool DetectWindowsPhone8()
+   {
+      if (useragent.find( MobileESP::deviceWinPhone8) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects a Windows Phone 10 device (in mobile browsing mode).
+   bool DetectWindowsPhone10()
+   {
+      if (useragent.find( MobileESP::deviceWinPhone10) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a Windows Mobile device.
+   // Excludes Windows Phone 7 and later devices. 
+   // Focuses on Windows Mobile 6.xx and earlier.
+   bool DetectWindowsMobile()
+   {
+      if (DetectWindowsPhone() == true)
+         return false;
+      
+      //Most devices use 'Windows CE', but some report 'iemobile' 
+      //  and some older ones report as 'PIE' for Pocket IE. 
+      if (useragent.find( MobileESP::deviceWinMob) != std::string::npos ||
+          useragent.find( MobileESP::deviceIeMob) != std::string::npos ||
+          useragent.find( MobileESP::enginePie) != std::string::npos)
+         return true; 
+      //Test for Windows Mobile PPC but not old Macintosh PowerPC.
+	  if (useragent.find( MobileESP::devicePpc) != std::string::npos
+		  && !(useragent.find( MobileESP::deviceMacPpc) > 1))
+         return true; 
+      //Test for certain Windwos Mobile-based HTC devices.
+      if (useragent.find( MobileESP::manuHtc) != std::string::npos &&
+          useragent.find( MobileESP::deviceWindows) != std::string::npos)
+         return true; 
+      if (DetectWapWml() == true &&
+          useragent.find( MobileESP::deviceWindows) != std::string::npos) 
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is any BlackBerry device.
+   // Includes BB10 OS, but excludes the PlayBook.
+   bool DetectBlackBerry()
+   {
+       if ((useragent.find( MobileESP::deviceBB) != std::string::npos) ||
+          (httpaccept.find( MobileESP::vndRIM) != std::string::npos))
+         return true;
+      if (DetectBlackBerry10Phone() == true) 
+         return true;       
+       else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current browser is a BlackBerry 10 OS phone.
+   // Excludes tablets.
+   bool DetectBlackBerry10Phone()
+   {
+       if ((useragent.find( MobileESP::deviceBB10) != std::string::npos) &&
+          (useragent.find( MobileESP::mobile) != std::string::npos))
+         return true; 
+       else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current browser is on a BlackBerry tablet device.
+   //    Examples: PlayBook
+   bool DetectBlackBerryTablet()
+   {
+      if ((useragent.find( MobileESP::deviceBBPlaybook) != std::string::npos))
+         return true; 
+      else
+        return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a BlackBerry phone device AND uses a
+   //    WebKit-based browser. These are signatures for the new BlackBerry OS 6.
+   //    Examples: Torch. Includes the Playbook.
+   bool DetectBlackBerryWebKit()
+   {
+      if ((DetectBlackBerry() == true) &&
+		(DetectWebkit() == true))
+         return true; 
+      else
+        return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a BlackBerry Touch phone device with
+   //    a large screen, such as the Storm, Torch, and Bold Touch. Excludes the Playbook.
+   bool DetectBlackBerryTouch()
+   {  
+       if ((useragent.find( MobileESP::deviceBBStorm) != std::string::npos) ||
+		(useragent.find( MobileESP::deviceBBTorch) != std::string::npos) ||
+		(useragent.find( MobileESP::deviceBBBoldTouch) != std::string::npos) ||
+		(useragent.find( MobileESP::deviceBBCurveTouch) != std::string::npos))
+         return true; 
+       else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current browser is a BlackBerry OS 5 device AND
+   //    has a more capable recent browser. Excludes the Playbook.
+   //    Examples, Storm, Bold, Tour, Curve2
+   //    Excludes the new BlackBerry OS 6 and 7 browser!!
+   bool DetectBlackBerryHigh()
+   {
+      //Disambiguate for BlackBerry OS 6 or 7 (WebKit) browser
+      if (DetectBlackBerryWebKit() == true)
+         return false; 
+      if (DetectBlackBerry() == true)
+      {
+          if ((DetectBlackBerryTouch() == true) ||
+            useragent.find( MobileESP::deviceBBBold) != std::string::npos ||
+            useragent.find( MobileESP::deviceBBTour) != std::string::npos ||
+            useragent.find( MobileESP::deviceBBCurve) != std::string::npos)
+          {
+             return true; 
+          }
+          else
+            return false; 
+      }
+      else
+        return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a BlackBerry device AND
+   //    has an older, less capable browser. 
+   //    Examples: Pearl, 8800, Curve1.
+   bool DetectBlackBerryLow()
+   {
+      if (DetectBlackBerry() == true)
+      {
+          //Assume that if it's not in the High tier, then it's Low.
+          if ((DetectBlackBerryHigh() == true) ||
+			(DetectBlackBerryWebKit() == true))
+             return false; 
+          else
+            return true; 
+      }
+      else
+        return false; 
+   }
+
+
+   //**************************
+   // Detects if the current browser is the Nokia S60 Open Source Browser.
+   bool DetectS60OssBrowser()
+   {
+      //First, test for WebKit, then make sure it's either Symbian or S60.
+      if (DetectWebkit() == true)
+      {
+        if (useragent.find( MobileESP::deviceSymbian) != std::string::npos ||
+            useragent.find( MobileESP::deviceS60) != std::string::npos)
+        {
+           return true;
+        }
+        else
+           return false; 
+      }
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current device is any Symbian OS-based device,
+   //   including older S60, Series 70, Series 80, Series 90, and UIQ, 
+   //   or other browsers running on these devices.
+   bool DetectSymbianOS()
+   {
+       if (useragent.find( MobileESP::deviceSymbian) != std::string::npos || 
+           useragent.find( MobileESP::deviceS60) != std::string::npos ||
+           useragent.find( MobileESP::deviceS70) != std::string::npos || 
+           useragent.find( MobileESP::deviceS80) != std::string::npos ||
+           useragent.find( MobileESP::deviceS90) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+
+   //**************************
+   // Detects if the current browser is on a PalmOS device.
+   bool DetectPalmOS()
+   {
+		//Make sure it's not WebOS first
+		if (DetectPalmWebOS() == true)
+			return false;
+
+      //Most devices nowadays report as 'Palm', but some older ones reported as Blazer or Xiino.
+      if (useragent.find( MobileESP::devicePalm) != std::string::npos ||
+          useragent.find( MobileESP::engineBlazer) != std::string::npos ||
+          useragent.find( MobileESP::engineXiino) != std::string::npos)
+            return true; 
+      else
+         return false; 
+   }
+
+
+   //**************************
+   // Detects if the current browser is on a Palm device
+   //   running the new WebOS.
+   bool DetectPalmWebOS()
+   {
+      if (useragent.find( MobileESP::deviceWebOS) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is on an HP tablet running WebOS.
+   bool DetectWebOSTablet()
+   {
+      if ((useragent.find( MobileESP::deviceWebOShp) != std::string::npos)
+			&& (useragent.find( MobileESP::deviceTablet) != std::string::npos))
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is on a WebOS smart TV.
+   bool DetectWebOSTV()
+   {
+      if ((useragent.find( MobileESP::deviceWebOStv) != std::string::npos)
+			&& (useragent.find( MobileESP::smartTV2) != std::string::npos))
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is Opera Mobile or Mini.
+   bool DetectOperaMobile()
+   {
+      if (useragent.find( MobileESP::engineOpera) != std::string::npos)
+      {
+         if ((useragent.find( MobileESP::mini) != std::string::npos) ||
+          (useragent.find( MobileESP::mobi) != std::string::npos))
+            return true; 
+         else
+            return false; 
+      }
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is an Amazon Kindle (eInk devices only).
+   // Note: For the Kindle Fire, use the normal Android methods. 
+   bool DetectKindle()
+   {
+      if (useragent.find( MobileESP::deviceKindle) != std::string::npos &&
+          DetectAndroid() == false)
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current Amazon device has turned on the Silk accelerated browsing feature.
+   // Note: Typically used by the the Kindle Fire.
+   bool DetectAmazonSilk()
+   {
+      if (useragent.find( MobileESP::engineSilk) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if a Garmin Nuvifone device.
+   bool DetectGarminNuvifone()
+   {
+      if (useragent.find( MobileESP::deviceNuvifone) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects a device running the Bada smartphone OS from Samsung.
+   bool DetectBada()
+   {
+      if (useragent.find( MobileESP::deviceBada) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects a device running the Tizen smartphone OS.
+   bool DetectTizen()
+   {
+      if ((useragent.find( MobileESP::deviceTizen) != std::string::npos)
+			&& (useragent.find( MobileESP::mobile) != std::string::npos))
+         return true; 
+      else
+         return false; 
+   }
+   
+    //**************************
+   // Detects if the current browser is on a Tizen smart TV.
+   bool DetectTizenTV()
+   {
+      if ((useragent.find( MobileESP::deviceTizen) != std::string::npos)
+			&& (useragent.find( MobileESP::smartTV1) != std::string::npos))
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects a device running the Meego OS.
+   bool DetectMeego()
+   {
+      if (useragent.find( MobileESP::deviceMeego) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+   
+    //**************************
+   // Detects a phone running the Meego OS.
+   bool DetectMeegoPhone()
+   {
+      if ((useragent.find( MobileESP::deviceMeego) != std::string::npos)
+			&& (useragent.find( MobileESP::mobi) != std::string::npos))
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects a mobile device (probably) running the Firefox OS.
+   bool DetectFirefoxOS()
+   {
+      if ((DetectFirefoxOSPhone() == true) || DetectFirefoxOSTablet())
+         return true;
+      
+      return false; 
+   }
+
+   //**************************
+   // Detects a phone (probably) running the Firefox OS.
+   bool DetectFirefoxOSPhone()
+   {
+      //First, let's make sure we're NOT on another major mobile OS.
+      if (DetectIos() || 
+      	DetectAndroid() || 
+      	DetectSailfish())
+         return false;
+            
+      if ((useragent.find( MobileESP::engineFirefox) != std::string::npos) &&
+		(useragent.find( MobileESP::mobile) != std::string::npos))
+         return true;
+      
+      return false; 
+   }
+
+   //**************************
+   // Detects a tablet (probably) running the Firefox OS.
+   bool DetectFirefoxOSTablet()
+   {
+      //First, let's make sure we're NOT on another major mobile OS.
+      if (DetectIos() || 
+      	DetectAndroid() || 
+      	DetectSailfish())
+         return false;
+            
+      if ((useragent.find( MobileESP::engineFirefox) != std::string::npos) &&
+		(useragent.find( MobileESP::deviceTablet) != std::string::npos))
+         return true;
+      
+      return false; 
+   }
+
+   //**************************
+   // Detects a device running the Sailfish OS.
+   bool DetectSailfish()
+   {
+      if (useragent.find( MobileESP::deviceSailfish) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects a phone running the Sailfish OS.
+   bool DetectSailfishPhone()
+   {
+      if ((DetectSailfish() == true) &&
+		(useragent.find( MobileESP::mobile) != std::string::npos))
+         return true;
+      
+      return false; 
+   }
+
+   //**************************
+   // Detects a mobile device running the Ubuntu Mobile OS.
+   bool DetectUbuntu()
+   {
+      if ((DetectUbuntuPhone() == true) || DetectUbuntuTablet() == true)
+         return true;
+      
+      return false; 
+   }
+
+   //**************************
+   // Detects a phone running the Ubuntu Mobile OS.
+   bool DetectUbuntuPhone()
+   {
+      if ((useragent.find( MobileESP::deviceUbuntu) != std::string::npos) &&
+		(useragent.find( MobileESP::mobile) != std::string::npos))
+         return true;
+      
+      return false; 
+   }
+
+   //**************************
+   // Detects a tablet running the Ubuntu Mobile OS.
+   bool DetectUbuntuTablet()
+   {
+      if ((useragent.find( MobileESP::deviceUbuntu) != std::string::npos) &&
+		(useragent.find( MobileESP::deviceTablet) != std::string::npos))
+         return true;
+      
+      return false; 
+   }
+   
+   //**************************
+   // Detects the Danger Hiptop device.
+   bool DetectDangerHiptop()
+   {
+      if (useragent.find( MobileESP::deviceDanger) != std::string::npos ||
+          useragent.find( MobileESP::deviceHiptop) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a Sony Mylo device.
+   bool DetectSonyMylo()
+   {
+      if ((useragent.find( MobileESP::manuSony) != std::string::npos) &&
+         ((useragent.find( MobileESP::qtembedded) != std::string::npos) ||
+          (useragent.find( MobileESP::mylocom2) != std::string::npos)))
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current device is on one of the Maemo-based Nokia Internet Tablets.
+   bool DetectMaemoTablet()
+   {
+      if (useragent.find( MobileESP::maemo) != std::string::npos)
+         return true; 
+      //For Nokia N810, must be Linux + Tablet, or else it could be something else. 
+      if ((useragent.find( MobileESP::llinux) != std::string::npos)
+		&& (useragent.find( MobileESP::deviceTablet) != std::string::npos) 
+		&& (DetectWebOSTablet() == false)
+		&& (DetectAndroid() == false))
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is an Archos media player/Internet tablet.
+   bool DetectArchos()
+   {
+      if (useragent.find( MobileESP::deviceArchos) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is an Internet-capable game console.
+   // Includes many handheld consoles.
+   bool DetectGameConsole()
+   {
+      if ((DetectSonyPlaystation() == true) ||
+		 (DetectNintendo() == true) ||
+		 (DetectXbox() == true))
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current device is a Sony Playstation.
+   bool DetectSonyPlaystation()
+   {
+      if (useragent.find( MobileESP::devicePlaystation) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is a handheld gaming device with
+   // a touchscreen and modern iPhone-class browser. Includes the Playstation Vita.
+   bool DetectGamingHandheld()
+   {
+      if ((useragent.find( MobileESP::devicePlaystation) != std::string::npos) &&
+         (useragent.find( MobileESP::devicePlaystationVita) != std::string::npos))
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is a Nintendo game device.
+   bool DetectNintendo()
+   {
+      if (useragent.find( MobileESP::deviceNintendo) != std::string::npos || 
+           useragent.find( MobileESP::deviceWii) != std::string::npos ||
+           useragent.find( MobileESP::deviceNintendoDs) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects if the current device is a Microsoft Xbox.
+   bool DetectXbox()
+   {
+      if (useragent.find( MobileESP::deviceXbox) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // Detects whether the device is a Brew-powered device.
+   bool DetectBrewDevice()
+   {
+       if (useragent.find( MobileESP::deviceBrew) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects whether the device supports WAP or WML.
+   bool DetectWapWml()
+   {
+       if (httpaccept.find( MobileESP::vndwap) != std::string::npos ||
+           httpaccept.find( MobileESP::wml) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+   
+   //**************************
+   // Detects if the current device supports MIDP, a mobile Java technology.
+   bool DetectMidpCapable()
+   {
+       if (useragent.find( MobileESP::deviceMidp) != std::string::npos || 
+           httpaccept.find( MobileESP::deviceMidp) != std::string::npos)
+         return true; 
+      else
+         return false; 
+   }
+
+
+
+  //*****************************
+  // Device Classes
+  //*****************************
+   
+   //**************************
+   // Check to see whether the device is *any* 'smartphone'.
+   //   Note: It's better to use DetectTierIphone() for modern touchscreen devices. 
+   bool DetectSmartphone()
+   {
+      //Exclude duplicates from TierIphone
+      if ((DetectTierIphone() == true)
+		|| (DetectS60OssBrowser() == true)
+		|| (DetectSymbianOS() == true) 
+		|| (DetectWindowsMobile() == true)
+		|| (DetectBlackBerry() == true)
+		|| (DetectMeegoPhone() == true)
+		|| (DetectPalmWebOS() == true))
+         return true; 
+      else
+         return false; 
+   }
+
+   //**************************
+   // The quick way to detect for a mobile device.
+   //   Will probably detect most recent/current mid-tier Feature Phones
+   //   as well as smartphone-class devices. Excludes Apple iPads and other modern tablets.
+   bool DetectMobileQuick()
+   {
+      if (initCompleted == true ||
+          isMobilePhone == true)
+         return isMobilePhone;
+
+      //Let's exclude tablets
+      if (isTierTablet == true) 
+         return false;
+      
+      //Most mobile browsing is done on smartphones
+      if (DetectSmartphone() == true) 
+         return true;
+
+      //Catch-all for many mobile devices
+      if (useragent.find( MobileESP::mobile) != std::string::npos)
+         return true; 
+
+      if (DetectOperaMobile() == true)
+         return true;
+
+      //We also look for Kindle devices
+      if (DetectKindle() == true ||
+         DetectAmazonSilk() == true) 
+         return true;
+
+      if ((DetectWapWml() == true) 
+			|| (DetectMidpCapable() == true) 
+			|| (DetectBrewDevice() == true))
+         return true;
+         
+      if ((useragent.find( MobileESP::engineNetfront) != std::string::npos)
+			|| (useragent.find( MobileESP::engineUpBrowser) != std::string::npos))
+         return true; 
+         
+      else
+         return false; 
+   }
+  
+   //**************************
+   // The longer and more thorough way to detect for a mobile device.
+   //   Will probably detect most feature phones,
+   //   smartphone-class devices, Internet Tablets, 
+   //   Internet-enabled game consoles, etc.
+   //   This ought to catch a lot of the more obscure and older devices, also --
+   //   but no promises on thoroughness!
+   bool DetectMobileLong()
+   {
+      if (DetectMobileQuick() == true) 
+         return true; 
+      if (DetectGameConsole() == true) 
+         return true; 
+         
+      if ((DetectDangerHiptop() == true) 
+			|| (DetectMaemoTablet() == true)
+			|| (DetectSonyMylo() == true)
+			|| (DetectArchos() == true))
+         return true; 
+
+       if ((useragent.find( MobileESP::devicePda) != std::string::npos) &&
+		 !(useragent.find( MobileESP::disUpdate) != std::string::npos))
+         return true;
+      
+       //Detect older phones from certain manufacturers and operators. 
+       if ((useragent.find( MobileESP::uplink) != std::string::npos)
+       		|| (useragent.find( MobileESP::engineOpenWeb) != std::string::npos)
+       		|| (useragent.find( MobileESP::manuSamsung1) != std::string::npos)
+       		|| (useragent.find( MobileESP::manuSonyEricsson) != std::string::npos)
+       		|| (useragent.find( MobileESP::manuericsson) != std::string::npos)
+       		|| (useragent.find( MobileESP::svcDocomo) != std::string::npos)
+       		|| (useragent.find( MobileESP::svcKddi) != std::string::npos)
+       		|| (useragent.find( MobileESP::svcVodafone) != std::string::npos))
+         return true;
+
+       return false; 
+   }
+
+
+  //*****************************
+  // For Mobile Web Site Design
+  //*****************************
+
+   //**************************
+   // The quick way to detect for a tier of devices.
+   //   This method detects for the new generation of
+   //   HTML 5 capable, larger screen tablets.
+   //   Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
+   bool DetectTierTablet()
+   {
+      if (initCompleted == true ||
+          isTierTablet == true)
+         return isTierTablet;
+
+      if ((DetectIpad() == true) 
+         || (DetectAndroidTablet() == true) 
+         || (DetectBlackBerryTablet() == true) 
+         || (DetectFirefoxOSTablet() == true)
+         || (DetectUbuntuTablet() == true)
+         || (DetectWebOSTablet() == true))
+         return true; 
+      else
+         return false; 
+   }
+
+
+   //**************************
+   // The quick way to detect for a tier of devices.
+   //   This method detects for devices which can 
+   //   display iPhone-optimized web content.
+   //   Includes iPhone, iPod Touch, Android, Windows Phone 7 and 8, BB10, WebOS, Playstation Vita, etc.
+   bool DetectTierIphone()
+   {
+      if (initCompleted == true ||
+          isTierIphone == true)
+         return isTierIphone;
+
+      if ((DetectIphoneOrIpod() == true)
+			|| (DetectAndroidPhone() == true)
+			|| (DetectWindowsPhone() == true)
+			|| (DetectBlackBerry10Phone() == true)
+			|| (DetectPalmWebOS() == true)
+			|| (DetectBada() == true)
+			|| (DetectTizen() == true)
+			|| (DetectFirefoxOSPhone() == true)
+			|| (DetectSailfishPhone() == true)
+			|| (DetectUbuntuPhone() == true)
+			|| (DetectGamingHandheld() == true))
+         return true; 
+      
+      //Note: BB10 phone is in the previous paragraph
+      if ((DetectBlackBerryWebKit() == true) &&
+		(DetectBlackBerryTouch() == true))
+         return true;
+      
+      else
+         return false; 
+   }
+   
+   //**************************
+   // The quick way to detect for a tier of devices.
+   //   This method detects for devices which are likely to be capable 
+   //   of viewing CSS content optimized for the iPhone, 
+   //   but may not necessarily support JavaScript.
+   //   Excludes all iPhone Tier devices.
+   bool DetectTierRichCss()
+   {
+      if (initCompleted == true ||
+          isTierRichCss == true)
+         return isTierRichCss;
+
+      if (DetectMobileQuick() == true) 
+      {
+        //Exclude iPhone Tier and e-Ink Kindle devices
+        if ((DetectTierIphone() == true) ||
+            (DetectKindle() == true))
+           return false;
+           
+        //The following devices are explicitly ok.
+        if (DetectWebkit() == true) //Any WebKit
+           return true;
+        if (DetectS60OssBrowser() == true)
+           return true;
+           
+        //Note: 'High' BlackBerry devices ONLY
+        if (DetectBlackBerryHigh() == true)
+           return true;
+        
+        //Older Windows 'Mobile' isn't good enough for iPhone Tier. 
+        if (DetectWindowsMobile() == true)
+           return true;
+        if (useragent.find( MobileESP::engineTelecaQ) != std::string::npos)
+           return true;
+         
+        //default
+        else
+           return false;
+      }
+      else
+         return false; 
+   }
+
+   //**************************
+   // The quick way to detect for a tier of devices.
+   //   This method detects for all other types of phones,
+   //   but excludes the iPhone and RichCSS Tier devices.
+   bool DetectTierOtherPhones()
+   {
+      if (initCompleted == true ||
+          isTierGenericMobile == true)
+         return isTierGenericMobile;
+
+      //Exclude devices in the other 2 categories 
+      if ((DetectMobileLong() == true)
+		&& (DetectTierIphone() == false)
+		&& (DetectTierRichCss() == false))
+           return true;
+      else
+         return false; 
+   }
+};
+
+}
+
+/* Example code *
+#include <iostream>
+#include "mdetect.h"
+
+int main(int argc, char** argv)
+{
+	int ret = 0;
+	if(argc < 3) {
+		std::cout << "Usage is mdetect [user agent string] [Accept string]" << std::endl;
+	} else {
+		MobileESP::uagent_info usageInfo(argv[1],argv[2]);
+		if(true == usageInfo.DetectMobileQuick()) {
+			std::cout << "Passed in user agent is from a mobile browser" << std::endl;
+		} else {
+			std::cout << "Passed in user agent is *NOT* from a mobile browser" << std::endl;
+		}
+	}
+	return ret;
+}
+
+*/
+#endif //MDETECT_H
diff --git a/vendor/ahand/mobileesp/Java/UAgentInfo.java b/vendor/ahand/mobileesp/Java/UAgentInfo.java
new file mode 100755
index 0000000000000000000000000000000000000000..e4dd0f7f361cb20755a6445696dd086d43d99541
--- /dev/null
+++ b/vendor/ahand/mobileesp/Java/UAgentInfo.java
@@ -0,0 +1,1305 @@
+/* *******************************************
+// Copyright 2010-2015, Anthony Hand
+//
+//
+// File version 2015.05.13 (May 13, 2015)
+// Updates:
+//	- Moved MobileESP to GitHub. https://github.com/ahand/mobileesp
+//	- Opera Mobile/Mini browser has the same UA string on multiple platforms and doesn't differentiate phone vs. tablet. 
+//		- Removed DetectOperaAndroidPhone(). This method is no longer reliable. 
+//		- Removed DetectOperaAndroidTablet(). This method is no longer reliable. 
+//	- Added support for Windows Phone 10: variable and DetectWindowsPhone10()
+//	- Updated DetectWindowsPhone() to include WP10. 
+//	- Added support for Firefox OS.  
+//		- A variable plus DetectFirefoxOS(), DetectFirefoxOSPhone(), DetectFirefoxOSTablet()
+//		- NOTE: Firefox doesn't add UA tokens to definitively identify Firefox OS vs. their browsers on other mobile platforms.
+//	- Added support for Sailfish OS. Not enough info to add a tablet detection method at this time. 
+//		- A variable plus DetectSailfish(), DetectSailfishPhone()
+//	- Added support for Ubuntu Mobile OS. 
+//		- DetectUbuntu(), DetectUbuntuPhone(), DetectUbuntuTablet()
+//	- Added support for 2 smart TV OSes. They lack browsers but do have WebViews for use by HTML apps. 
+//		- One variable for Samsung Tizen TVs, plus DetectTizenTV()
+//		- One variable for LG WebOS TVs, plus DetectWebOSTV()
+//	- Updated DetectTizen(). Now tests for "mobile" to disambiguate from Samsung Smart TVs
+//	- Removed variables for obsolete devices: deviceHtcFlyer, deviceXoom.
+//	- Updated DetectAndroid(). No longer has a special test case for the HTC Flyer tablet. 
+//	- Updated DetectAndroidPhone(). 
+//		- Updated internal detection code for Android. 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android and reports here if relevant. 
+//	- Updated DetectAndroidTablet(). 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android to exclude it from here.
+//	- DetectMeego(): Changed definition for this method. Now detects any Meego OS device, not just phones. 
+//	- DetectMeegoPhone(): NEW. For Meego phones. Ought to detect Opera browsers on Meego, as well.  
+//	- DetectTierIphone(): Added support for phones running Sailfish, Ubuntu and Firefox Mobile. 
+//	- DetectTierTablet(): Added support for tablets running Ubuntu and Firefox Mobile. 
+//	- DetectSmartphone(): Added support for Meego phones. 
+//	- Refactored the detection logic in DetectMobileQuick() and DetectMobileLong().
+//		- Moved a few detection tests for older browsers to Long. 
+//
+//
+//
+// LICENSE INFORMATION
+// 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. 
+//
+//
+// ABOUT THIS PROJECT
+//   Project Owner: Anthony Hand
+//   Email: anthony.hand@gmail.com
+//   Web Site: http://www.mobileesp.com
+//   Source Files: https://github.com/ahand/mobileesp
+//
+//   Versions of this code are available for:
+//      PHP, JavaScript, Java, ASP.NET (C#), and Ruby
+//
+// *******************************************
+ */
+package com.handinteractive.mobile;
+
+/**
+ * The DetectSmartPhone class encapsulates information about
+ *   a browser's connection to your web site.
+ *   You can use it to find out whether the browser asking for
+ *   your site's content is probably running on a mobile device.
+ *   The methods were written so you can be as granular as you want.
+ *   For example, enquiring whether it's as specific as an iPod Touch or
+ *   as general as a smartphone class device.
+ *   The object's methods return true, or false.
+ */
+public class UAgentInfo {
+    // User-Agent and Accept HTTP request headers
+
+    private String userAgent = "";
+    private String httpAccept = "";
+    
+    // Let's store values for quickly accessing the same info multiple times.
+    public boolean initCompleted = false;
+    public boolean isWebkit = false; //Stores the result of DetectWebkit()
+    public boolean isMobilePhone = false; //Stores the result of DetectMobileQuick()
+    public boolean isIphone = false; //Stores the result of DetectIphone()
+    public boolean isAndroid = false; //Stores the result of DetectAndroid()
+    public boolean isAndroidPhone = false; //Stores the result of DetectAndroidPhone()
+    public boolean isTierTablet = false; //Stores the result of DetectTierTablet()
+    public boolean isTierIphone = false; //Stores the result of DetectTierIphone()
+    public boolean isTierRichCss = false; //Stores the result of DetectTierRichCss()
+    public boolean isTierGenericMobile = false; //Stores the result of DetectTierOtherPhones()
+    
+    // Initialize some initial smartphone string variables.
+    public static final String engineWebKit = "webkit";
+    
+    public static final String deviceIphone = "iphone";
+    public static final String deviceIpod = "ipod";
+    public static final String deviceIpad = "ipad";
+    public static final String deviceMacPpc = "macintosh"; //Used for disambiguation
+    
+    public static final String deviceAndroid = "android";
+    public static final String deviceGoogleTV = "googletv";
+    
+    public static final String deviceWinPhone7 = "windows phone os 7";
+    public static final String deviceWinPhone8 = "windows phone 8";
+    public static final String deviceWinPhone10 = "windows phone 10";
+    public static final String deviceWinMob = "windows ce";
+    public static final String deviceWindows = "windows";
+    public static final String deviceIeMob = "iemobile";
+    public static final String devicePpc = "ppc"; //Stands for PocketPC
+    public static final String enginePie = "wm5 pie"; //An old Windows Mobile
+    
+    public static final String deviceBB = "blackberry";
+    public static final String deviceBB10 = "bb10"; //For the new BB 10 OS
+    public static final String vndRIM = "vnd.rim"; //Detectable when BB devices emulate IE or Firefox
+    public static final String deviceBBStorm = "blackberry95";  //Storm 1 and 2
+    public static final String deviceBBBold = "blackberry97";  //Bold 97x0 (non-touch)
+    public static final String deviceBBBoldTouch = "blackberry 99";  //Bold 99x0 (touchscreen)
+    public static final String deviceBBTour = "blackberry96";  //Tour
+    public static final String deviceBBCurve = "blackberry89";  //Curve 2
+    public static final String deviceBBCurveTouch = "blackberry 938";  //Curve Touch 9380
+    public static final String deviceBBTorch = "blackberry 98";  //Torch
+    public static final String deviceBBPlaybook = "playbook"; //PlayBook tablet
+    
+    public static final String deviceSymbian = "symbian";
+    public static final String deviceS60 = "series60";
+    public static final String deviceS70 = "series70";
+    public static final String deviceS80 = "series80";
+    public static final String deviceS90 = "series90";
+    
+    public static final String devicePalm = "palm";
+    public static final String deviceWebOS = "webos"; //For Palm devices
+    public static final String deviceWebOStv = "web0s"; //For LG TVs
+    public static final String deviceWebOShp = "hpwos"; //For HP's line of WebOS devices
+    
+    public static final String deviceNuvifone = "nuvifone";  //Garmin Nuvifone
+    public static final String deviceBada = "bada";  //Samsung's Bada OS
+    public static final String deviceTizen = "tizen";  //Tizen OS
+    public static final String deviceMeego = "meego";  //Meego OS
+    public static final String deviceSailfish = "sailfish"; //Sailfish OS
+    public static final String deviceUbuntu = "ubuntu"; //Ubuntu Mobile OS
+
+    public static final String deviceKindle = "kindle";  //Amazon Kindle, eInk one
+    public static final String engineSilk = "silk-accelerated";  //Amazon's accelerated Silk browser for Kindle Fire
+    
+    public static final String engineBlazer = "blazer"; //Old Palm
+    public static final String engineXiino = "xiino"; //Another old Palm
+    
+    //Initialize variables for mobile-specific content.
+    public static final String vndwap = "vnd.wap";
+    public static final String wml = "wml";
+    
+    //Initialize variables for other random devices and mobile browsers.
+    public static final String deviceTablet = "tablet"; //Generic term for slate and tablet devices
+    public static final String deviceBrew = "brew";
+    public static final String deviceDanger = "danger";
+    public static final String deviceHiptop = "hiptop";
+    public static final String devicePlaystation = "playstation";
+    public static final String devicePlaystationVita = "vita";
+    public static final String deviceNintendoDs = "nitro";
+    public static final String deviceNintendo = "nintendo";
+    public static final String deviceWii = "wii";
+    public static final String deviceXbox = "xbox";
+    public static final String deviceArchos = "archos";
+    
+    public static final String engineFirefox = "firefox"; //For Firefox OS
+    public static final String engineOpera = "opera"; //Popular browser
+    public static final String engineNetfront = "netfront"; //Common embedded OS browser
+    public static final String engineUpBrowser = "up.browser"; //common on some phones
+    public static final String engineOpenWeb = "openweb"; //Transcoding by OpenWave server
+    public static final String deviceMidp = "midp"; //a mobile Java technology
+    public static final String uplink = "up.link";
+    public static final String engineTelecaQ = "teleca q"; //a modern feature phone browser
+    public static final String devicePda = "pda"; //some devices report themselves as PDAs
+    public static final String mini = "mini";  //Some mobile browsers put "mini" in their names.
+    public static final String mobile = "mobile"; //Some mobile browsers put "mobile" in their user agent strings.
+    public static final String mobi = "mobi"; //Some mobile browsers put "mobi" in their user agent strings.
+    
+    //Smart TV strings
+    public static final String smartTV1 = "smart-tv"; //Samsung Tizen smart TVs
+    public static final String smartTV2 = "smarttv"; //LG WebOS smart TVs
+
+    //Use Maemo, Tablet, and Linux to test for Nokia"s Internet Tablets.
+    public static final String maemo = "maemo";
+    public static final String linux = "linux";
+    public static final String qtembedded = "qt embedded"; //for Sony Mylo
+    public static final String mylocom2 = "com2"; //for Sony Mylo also
+    
+    //In some UserAgents, the only clue is the manufacturer.
+    public static final String manuSonyEricsson = "sonyericsson";
+    public static final String manuericsson = "ericsson";
+    public static final String manuSamsung1 = "sec-sgh";
+    public static final String manuSony = "sony";
+    public static final String manuHtc = "htc"; //Popular Android and WinMo manufacturer
+    
+    //In some UserAgents, the only clue is the operator.
+    public static final String svcDocomo = "docomo";
+    public static final String svcKddi = "kddi";
+    public static final String svcVodafone = "vodafone";
+
+    //Disambiguation strings.
+    public static final String disUpdate = "update"; //pda vs. update
+
+
+    /**
+     * Initialize the userAgent and httpAccept variables
+     *
+     * @param userAgent the User-Agent header
+     * @param httpAccept the Accept header
+     */
+    public UAgentInfo(String userAgent, String httpAccept) {
+        if (userAgent != null) {
+            this.userAgent = userAgent.toLowerCase();
+        }
+        if (httpAccept != null) {
+            this.httpAccept = httpAccept.toLowerCase();
+        }
+
+        //Intialize key stored values.
+        initDeviceScan();
+    }
+
+    /**
+     * Return the lower case HTTP_USER_AGENT
+     * @return userAgent
+     */
+    public String getUserAgent() {
+        return userAgent;
+    }
+
+    /**
+     * Return the lower case HTTP_ACCEPT
+     * @return httpAccept
+     */
+    public String getHttpAccept() {
+        return httpAccept;
+    }
+
+    /**
+     * Return whether the device is an Iphone or iPod Touch
+     * @return isIphone
+     */
+    public boolean getIsIphone() {
+        return isIphone;
+    }
+
+    /**
+     * Return whether the device is in the Tablet Tier.
+     * @return isTierTablet
+     */
+    public boolean getIsTierTablet() {
+        return isTierTablet;
+    }
+
+    /**
+     * Return whether the device is in the Iphone Tier.
+     * @return isTierIphone
+     */
+    public boolean getIsTierIphone() {
+        return isTierIphone;
+    }
+
+    /**
+     * Return whether the device is in the 'Rich CSS' tier of mobile devices.
+     * @return isTierRichCss
+     */
+    public boolean getIsTierRichCss() {
+        return isTierRichCss;
+    }
+
+    /**
+     * Return whether the device is a generic, less-capable mobile device.
+     * @return isTierGenericMobile
+     */
+    public boolean getIsTierGenericMobile() {
+        return isTierGenericMobile;
+    }
+
+    /**
+     * Initialize Key Stored Values.
+     */
+    public void initDeviceScan() {
+        //Save these properties to speed processing
+        this.isWebkit = detectWebkit();
+        this.isIphone = detectIphone();
+        this.isAndroid = detectAndroid();
+        this.isAndroidPhone = detectAndroidPhone();
+        
+        //Generally, these tiers are the most useful for web development
+        this.isMobilePhone = detectMobileQuick();
+        this.isTierTablet = detectTierTablet();
+        this.isTierIphone = detectTierIphone();
+        
+        //Optional: Comment these out if you NEVER use them
+        this.isTierRichCss = detectTierRichCss();
+        this.isTierGenericMobile = detectTierOtherPhones();
+        
+        this.initCompleted = true;
+    }
+
+    /**
+     * Detects if the current device is an iPhone.
+     * @return detection of an iPhone
+     */
+    public boolean detectIphone() {
+        // The iPad and iPod touch say they're an iPhone! So let's disambiguate.
+        if (userAgent.indexOf(deviceIphone) != -1 && 
+                !detectIpad() && 
+                !detectIpod()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is an iPod Touch.
+     * @return detection of an iPod Touch
+     */
+    public boolean detectIpod() {
+        if (userAgent.indexOf(deviceIpod) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is an iPad tablet.
+     * @return detection of an iPad
+     */
+    public boolean detectIpad() {
+        if (userAgent.indexOf(deviceIpad) != -1
+                && detectWebkit()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is an iPhone or iPod Touch.
+     * @return detection of an iPhone or iPod Touch
+     */
+    public boolean detectIphoneOrIpod() {
+        //We repeat the searches here because some iPods may report themselves as an iPhone, which would be okay.
+        if (userAgent.indexOf(deviceIphone) != -1
+                || userAgent.indexOf(deviceIpod) != -1) {
+            return true;
+        }
+        return false;
+    }
+    
+    /**
+     * Detects *any* iOS device: iPhone, iPod Touch, iPad.
+     * @return detection of an Apple iOS device
+     */
+    public boolean detectIos() {
+        if (detectIphoneOrIpod() || detectIpad()) {
+            return true;
+        }
+        return false;
+    }
+
+
+    /**
+     * Detects *any* Android OS-based device: phone, tablet, and multi-media player.
+     * Also detects Google TV.
+     * @return detection of an Android device
+     */
+    public boolean detectAndroid() {
+        if ((userAgent.indexOf(deviceAndroid) != -1) ||
+          detectGoogleTV()) 
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects if the current device is a (small-ish) Android OS-based device
+     * used for calling and/or multi-media (like a Samsung Galaxy Player).
+     * Google says these devices will have 'Android' AND 'mobile' in user agent.
+     * Ignores tablets (Honeycomb and later).
+     * @return  detection of an Android phone
+     */
+    public boolean detectAndroidPhone() {
+        //First, let's make sure we're on an Android device.
+        if (!detectAndroid())
+			return false;
+
+        //If it's Android and has 'mobile' in it, Google says it's a phone.
+        if (userAgent.indexOf(mobile) != -1)
+            return true;
+            
+        //Special check for Android devices with Opera Mobile/Mini. They should report here.
+        if (detectOperaMobile()) 
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects if the current device is a (self-reported) Android tablet.
+     * Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
+     * @return detection of an Android tablet
+     */
+    public boolean detectAndroidTablet() {
+        //First, let's make sure we're on an Android device.
+        if (!detectAndroid())
+			return false;
+
+        //Special check for Android devices with Opera Mobile/Mini. They should NOT report here.
+        if (detectOperaMobile()) 
+            return false;
+    
+        //Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
+        if ((userAgent.indexOf(mobile) > -1)) 
+            return false;
+        else 
+			return true;
+    }
+
+    /**
+     * Detects if the current device is an Android OS-based device and
+     * the browser is based on WebKit.
+     * @return detection of an Android WebKit browser
+     */
+    public boolean detectAndroidWebKit() {
+        if (detectAndroid() && detectWebkit()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is a GoogleTV.
+     * @return detection of GoogleTV
+     */
+    public boolean detectGoogleTV() {
+        if (userAgent.indexOf(deviceGoogleTV) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is based on WebKit.
+     * @return detection of a WebKit browser
+     */
+    public boolean detectWebkit() {
+        if (userAgent.indexOf(engineWebKit) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is the Symbian S60 Open Source Browser.
+     * @return detection of Symbian S60 Browser
+     */
+    public boolean detectS60OssBrowser() {
+        //First, test for WebKit, then make sure it's either Symbian or S60.
+        if (detectWebkit()
+                && (userAgent.indexOf(deviceSymbian) != -1
+                || userAgent.indexOf(deviceS60) != -1)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     *
+     * Detects if the current device is any Symbian OS-based device,
+     *   including older S60, Series 70, Series 80, Series 90, and UIQ,
+     *   or other browsers running on these devices.
+     * @return detection of SymbianOS
+     */
+    public boolean detectSymbianOS() {
+        if (userAgent.indexOf(deviceSymbian) != -1
+                || userAgent.indexOf(deviceS60) != -1
+                || userAgent.indexOf(deviceS70) != -1
+                || userAgent.indexOf(deviceS80) != -1
+                || userAgent.indexOf(deviceS90) != -1) {
+            return true;
+        }
+        return false;
+    }
+    
+    /**
+     * Detects if the current browser is a Windows Phone 7.x, 8, or 10 device
+     * @return detection of Windows Phone 7.x OR 8
+     */
+    public boolean detectWindowsPhone() {
+        if (detectWindowsPhone7() 
+        	|| detectWindowsPhone8()
+        	|| detectWindowsPhone10()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects a Windows Phone 7 device (in mobile browsing mode).
+     * @return detection of Windows Phone 7
+     */
+    public boolean detectWindowsPhone7() {
+        if (userAgent.indexOf(deviceWinPhone7) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects a Windows Phone 8 device (in mobile browsing mode).
+     * @return detection of Windows Phone 8
+     */
+    public boolean detectWindowsPhone8() {
+        if (userAgent.indexOf(deviceWinPhone8) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects a Windows Phone 10 device (in mobile browsing mode).
+     * @return detection of Windows Phone 10
+     */
+    public boolean detectWindowsPhone10() {
+        if (userAgent.indexOf(deviceWinPhone10) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is a Windows Mobile device.
+     * Excludes Windows Phone 7.x and 8 devices.
+     * Focuses on Windows Mobile 6.xx and earlier.
+     * @return detection of Windows Mobile
+     */
+    public boolean detectWindowsMobile() {
+        if (detectWindowsPhone()) {
+            return false;
+        }
+        //Most devices use 'Windows CE', but some report 'iemobile'
+        //  and some older ones report as 'PIE' for Pocket IE.
+        //  We also look for instances of HTC and Windows for many of their WinMo devices.
+        if (userAgent.indexOf(deviceWinMob) != -1
+                || userAgent.indexOf(deviceWinMob) != -1
+                || userAgent.indexOf(deviceIeMob) != -1
+                || userAgent.indexOf(enginePie) != -1
+                || (userAgent.indexOf(manuHtc) != -1 && userAgent.indexOf(deviceWindows) != -1) 
+                || (detectWapWml() && userAgent.indexOf(deviceWindows) != -1)) {
+            return true;
+        }
+        
+        //Test for Windows Mobile PPC but not old Macintosh PowerPC.
+        if (userAgent.indexOf(devicePpc) != -1 &&
+				!(userAgent.indexOf(deviceMacPpc) != -1))
+            return true;
+            
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is any BlackBerry.
+     * Includes BB10 OS, but excludes the PlayBook.
+     * @return detection of Blackberry
+     */
+    public boolean detectBlackBerry() {
+        if (userAgent.indexOf(deviceBB) != -1 || 
+			httpAccept.indexOf(vndRIM) != -1) 
+            return true;
+        
+        if (detectBlackBerry10Phone())
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is a BlackBerry 10 OS phone.
+     * Excludes tablets.
+     * @return detection of a Blackberry 10 device
+     */
+    public boolean detectBlackBerry10Phone() {
+        if (userAgent.indexOf(deviceBB10) != -1 && 
+			userAgent.indexOf(mobile) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is on a BlackBerry tablet device.
+     *    Example: PlayBook
+     * @return detection of a Blackberry Tablet
+     */
+    public boolean detectBlackBerryTablet() {
+        if (userAgent.indexOf(deviceBBPlaybook) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is a BlackBerry device AND uses a
+     *    WebKit-based browser. These are signatures for the new BlackBerry OS 6.
+     *    Examples: Torch. Includes the Playbook.
+     * @return detection of a Blackberry device with WebKit browser
+     */
+    public boolean detectBlackBerryWebKit() {
+        if (detectBlackBerry() &&
+			userAgent.indexOf(engineWebKit) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is a BlackBerry Touch
+     * device, such as the Storm, Torch, and Bold Touch. Excludes the Playbook.
+     * @return detection of a Blackberry touchscreen device
+     */
+    public boolean detectBlackBerryTouch() {
+        if (detectBlackBerry() &&
+			(userAgent.indexOf(deviceBBStorm) != -1 ||
+			userAgent.indexOf(deviceBBTorch) != -1 ||
+			userAgent.indexOf(deviceBBBoldTouch) != -1 ||
+                        userAgent.indexOf(deviceBBCurveTouch) != -1 )) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is a BlackBerry device AND
+     *   has a more capable recent browser. Excludes the Playbook.
+     *   Examples, Storm, Bold, Tour, Curve2
+     *   Excludes the new BlackBerry OS 6 and 7 browser!!
+     * @return detection of a Blackberry device with a better browser
+     */
+    public boolean detectBlackBerryHigh() {
+        //Disambiguate for BlackBerry OS 6 or 7 (WebKit) browser
+        if (detectBlackBerryWebKit()) 
+			return false;
+        if (detectBlackBerry()) {
+            if (detectBlackBerryTouch()
+                    || userAgent.indexOf(deviceBBBold) != -1
+                    || userAgent.indexOf(deviceBBTour) != -1
+                    || userAgent.indexOf(deviceBBCurve) != -1) {
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Detects if the current browser is a BlackBerry device AND
+     *   has an older, less capable browser.
+     *   Examples: Pearl, 8800, Curve1
+     * @return detection of a Blackberry device with a poorer browser
+     */
+    public boolean detectBlackBerryLow() {
+        if (detectBlackBerry()) {
+            //Assume that if it's not in the High tier, then it's Low
+            if (detectBlackBerryHigh()
+					|| detectBlackBerryWebKit()) {
+                return false;
+            } else {
+                return true;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Detects if the current browser is on a PalmOS device.
+     * @return detection of a PalmOS device
+     */
+    public boolean detectPalmOS() {
+        //Most devices nowadays report as 'Palm', but some older ones reported as Blazer or Xiino.
+        if (userAgent.indexOf(devicePalm) != -1
+                || userAgent.indexOf(engineBlazer) != -1
+                || userAgent.indexOf(engineXiino) != -1) {
+            //Make sure it's not WebOS first
+            if (detectPalmWebOS()) {
+                return false;
+            } else {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is on a Palm device
+     *    running the new WebOS.
+     * @return detection of a Palm WebOS device
+     */
+    public boolean detectPalmWebOS() {
+        if (userAgent.indexOf(deviceWebOS) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is on an HP tablet running WebOS.
+     * @return detection of an HP WebOS tablet
+     */
+    public boolean detectWebOSTablet() {
+        if (userAgent.indexOf(deviceWebOShp) != -1 && 
+                userAgent.indexOf(deviceTablet) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is on a WebOS smart TV.
+     * @return detection of a WebOS smart TV
+     */
+    public boolean detectWebOSTV() {
+        if (userAgent.indexOf(deviceWebOStv) != -1 && 
+                userAgent.indexOf(smartTV2) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects Opera Mobile or Opera Mini.
+     * @return detection of an Opera browser for a mobile device
+     */
+    public boolean detectOperaMobile() {
+        if (userAgent.indexOf(engineOpera) != -1
+                && (userAgent.indexOf(mini) != -1
+                || userAgent.indexOf(mobi) != -1)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is an Amazon Kindle (eInk devices only).
+     * Note: For the Kindle Fire, use the normal Android methods.
+     * @return detection of a Kindle
+     */
+    public boolean detectKindle() {
+        if (userAgent.indexOf(deviceKindle)!= -1 &&
+            !detectAndroid()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current Amazon device is using the Silk Browser.
+     * Note: Typically used by the the Kindle Fire.
+     * @return detection of an Amazon Kindle Fire in Silk mode.
+     */
+    public boolean detectAmazonSilk() {
+        if (userAgent.indexOf(engineSilk)  != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is a
+     *    Garmin Nuvifone.
+     * @return detection of a Garmin Nuvifone
+     */
+    public boolean detectGarminNuvifone() {
+        if (userAgent.indexOf(deviceNuvifone) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects a device running the Bada OS from Samsung.
+     * @return detection of a Bada device
+     */
+    public boolean detectBada() {
+        if (userAgent.indexOf(deviceBada) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects a device running the Tizen smartphone OS.
+     * @return detection of a Tizen device
+     */
+    public boolean detectTizen() {
+        if (userAgent.indexOf(deviceTizen) != -1 && 
+                userAgent.indexOf(mobile) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is on a Tizen smart TV.
+     * @return detection of a Tizen smart TV
+     */
+    public boolean detectTizenTV() {
+        if (userAgent.indexOf(deviceTizen) != -1 && 
+                userAgent.indexOf(smartTV1) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects a device running the Meego OS.
+     * @return detection of a Meego device
+     */
+    public boolean detectMeego() {
+        if (userAgent.indexOf(deviceMeego) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects a phone running the Meego OS.
+     * @return detection of a Meego phone
+     */
+    public boolean detectMeegoPhone() {
+        if (userAgent.indexOf(deviceMeego) != -1 && 
+                userAgent.indexOf(mobi) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects a mobile device (probably) running the Firefox OS.
+     * @return detection of a Firefox OS mobile device
+     */
+    public boolean detectFirefoxOS() {
+        if (detectFirefoxOSPhone() || detectFirefoxOSTablet()) 
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects a phone (probably) running the Firefox OS.
+     * @return detection of a Firefox OS phone
+     */
+    public boolean detectFirefoxOSPhone() {
+        //First, let's make sure we're NOT on another major mobile OS.
+        if (detectIos() 
+        	|| detectAndroid()
+        	|| detectSailfish())
+            return false;
+        
+        if ((userAgent.indexOf(engineFirefox) != -1) 
+        	&& (userAgent.indexOf(mobile) != -1)) 
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects a tablet (probably) running the Firefox OS.
+     * @return detection of a Firefox OS tablet
+     */
+    public boolean detectFirefoxOSTablet() {
+        //First, let's make sure we're NOT on another major mobile OS.
+        if (detectIos() 
+        	|| detectAndroid()
+        	|| detectSailfish())
+            return false;
+        
+        if ((userAgent.indexOf(engineFirefox) != -1) 
+        	&& (userAgent.indexOf(deviceTablet) != -1)) 
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects a device running the Sailfish OS.
+     * @return detection of a Sailfish device
+     */
+    public boolean detectSailfish() {
+        if (userAgent.indexOf(deviceSailfish) != -1) {
+            return true;
+        }
+        return false;
+    }
+    
+    /**
+     * Detects a phone running the Sailfish OS.
+     * @return detection of a Sailfish phone
+     */
+    public boolean detectSailfishPhone() {
+        if (detectSailfish() && (userAgent.indexOf(mobile) != -1)) 
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects a mobile device running the Ubuntu Mobile OS.
+     * @return detection of an Ubuntu Mobile OS mobile device
+     */
+    public boolean detectUbuntu() {
+        if (detectUbuntuPhone() || detectUbuntuTablet()) 
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects a phone running the Ubuntu Mobile OS.
+     * @return detection of an Ubuntu Mobile OS phone
+     */
+    public boolean detectUbuntuPhone() {
+        if ((userAgent.indexOf(deviceUbuntu) != -1) 
+        	&& (userAgent.indexOf(mobile) != -1)) 
+            return true;
+        
+        return false;
+    }
+
+    /**
+     * Detects a tablet running the Ubuntu Mobile OS.
+     * @return detection of an Ubuntu Mobile OS tablet
+     */
+    public boolean detectUbuntuTablet() {
+        if ((userAgent.indexOf(deviceUbuntu) != -1) 
+        	&& (userAgent.indexOf(deviceTablet) != -1)) 
+            return true;
+        
+        return false;
+    }
+
+
+    /**
+     * Detects the Danger Hiptop device.
+     * @return detection of a Danger Hiptop
+     */
+    public boolean detectDangerHiptop() {
+        if (userAgent.indexOf(deviceDanger) != -1
+                || userAgent.indexOf(deviceHiptop) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current browser is a Sony Mylo device.
+     * @return detection of a Sony Mylo device
+     */
+    public boolean detectSonyMylo() {
+        if (userAgent.indexOf(manuSony) != -1
+                && (userAgent.indexOf(qtembedded) != -1
+                || userAgent.indexOf(mylocom2) != -1)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is on one of the Maemo-based Nokia Internet Tablets.
+     * @return detection of a Maemo OS tablet
+     */
+    public boolean detectMaemoTablet() {
+        if (userAgent.indexOf(maemo) != -1) {
+            return true;
+        } else if (userAgent.indexOf(linux) != -1
+                && userAgent.indexOf(deviceTablet) != -1
+                && !detectWebOSTablet()
+                && !detectAndroid()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is an Archos media player/Internet tablet.
+     * @return detection of an Archos media player
+     */
+    public boolean detectArchos() {
+        if (userAgent.indexOf(deviceArchos) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is an Internet-capable game console.
+     * Includes many handheld consoles.
+     * @return detection of any Game Console
+     */
+    public boolean detectGameConsole() {
+        if (detectSonyPlaystation()
+                || detectNintendo()
+                || detectXbox()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is a Sony Playstation.
+     * @return detection of Sony Playstation
+     */
+    public boolean detectSonyPlaystation() {
+        if (userAgent.indexOf(devicePlaystation) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is a handheld gaming device with
+     * a touchscreen and modern iPhone-class browser. Includes the Playstation Vita.
+     * @return detection of a handheld gaming device
+     */
+    public boolean detectGamingHandheld() {
+        if ((userAgent.indexOf(devicePlaystation) != -1) &&
+            (userAgent.indexOf(devicePlaystationVita) != -1)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is a Nintendo game device.
+     * @return detection of Nintendo
+     */
+    public boolean detectNintendo() {
+        if (userAgent.indexOf(deviceNintendo) != -1
+                || userAgent.indexOf(deviceWii) != -1
+                || userAgent.indexOf(deviceNintendoDs) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device is a Microsoft Xbox.
+     * @return detection of Xbox
+     */
+    public boolean detectXbox() {
+        if (userAgent.indexOf(deviceXbox) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects whether the device is a Brew-powered device.
+     * @return detection of a Brew device
+     */
+    public boolean detectBrewDevice() {
+        if (userAgent.indexOf(deviceBrew) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects whether the device supports WAP or WML.
+     * @return detection of a WAP- or WML-capable device
+     */
+    public boolean detectWapWml() {
+        if (httpAccept.indexOf(vndwap) != -1
+                || httpAccept.indexOf(wml) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Detects if the current device supports MIDP, a mobile Java technology.
+     * @return detection of a MIDP mobile Java-capable device
+     */
+    public boolean detectMidpCapable() {
+        if (userAgent.indexOf(deviceMidp) != -1
+                || httpAccept.indexOf(deviceMidp) != -1) {
+            return true;
+        }
+        return false;
+    }
+
+
+
+  //*****************************
+  // Device Classes
+  //*****************************
+
+    /**
+     * Check to see whether the device is any device
+     *   in the 'smartphone' category.
+     * @return detection of a general smartphone device
+     */
+    public boolean detectSmartphone() {
+        //Exclude duplicates from TierIphone
+        return (detectTierIphone() 
+                || detectS60OssBrowser()
+                || detectSymbianOS()
+                || detectWindowsMobile()
+                || detectBlackBerry()
+                || detectMeegoPhone()
+                || detectPalmOS());
+    }
+
+    /**
+     *	Detects if the current device is a mobile device.
+     *  This method catches most of the popular modern devices. 
+     *  Excludes Apple iPads and other modern tablets.
+     * @return detection of any mobile device using the quicker method
+     */
+    public boolean detectMobileQuick() {
+        //Let's exclude tablets
+        if (isTierTablet) {
+            return false;
+        }
+        //Most mobile browsing is done on smartphones
+        if (detectSmartphone()) {
+            return true;
+        }
+
+        //Catch-all for many mobile devices
+        if (userAgent.indexOf(mobile) != -1) {
+            return true;
+        }
+
+        if (detectOperaMobile()) {
+            return true;
+        }
+
+        //We also look for Kindle devices
+        if (detectKindle()
+            || detectAmazonSilk()) {
+            return true;
+        }
+
+        if (detectWapWml()
+			|| detectMidpCapable()
+			|| detectBrewDevice()) {
+            return true;
+        }
+
+        if ((userAgent.indexOf(engineNetfront) != -1) 
+			|| (userAgent.indexOf(engineUpBrowser) != -1)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * The longer and more thorough way to detect for a mobile device.
+     *   Will probably detect most feature phones,
+     *   smartphone-class devices, Internet Tablets,
+     *   Internet-enabled game consoles, etc.
+     *   This ought to catch a lot of the more obscure and older devices, also --
+     *   but no promises on thoroughness!
+     * @return detection of any mobile device using the more thorough method
+     */
+    public boolean detectMobileLong() {
+        if (detectMobileQuick()
+                || detectGameConsole()) {
+            return true;
+        }
+
+        if (detectDangerHiptop()
+			|| detectMaemoTablet()
+            || detectSonyMylo()
+			|| detectArchos()) {
+            return true;
+        }
+
+        if ((userAgent.indexOf(devicePda) != -1) &&
+			(userAgent.indexOf(disUpdate) < 0)) //no index found
+        {
+            return true;
+        }
+
+        //Detect older phones from certain manufacturers and operators.
+        if ((userAgent.indexOf(uplink) != -1) 
+        	|| (userAgent.indexOf(engineOpenWeb) != -1) 
+        	|| (userAgent.indexOf(manuSamsung1) != -1)
+        	|| (userAgent.indexOf(manuSonyEricsson) != -1)
+        	|| (userAgent.indexOf(manuericsson) != -1)
+        	|| (userAgent.indexOf(svcDocomo) != -1)
+        	|| (userAgent.indexOf(svcKddi) != -1)
+        	|| (userAgent.indexOf(svcVodafone) != -1))
+        	{
+            	return true;
+        	}
+        
+        return false;
+    }
+
+    //*****************************
+    // For Mobile Web Site Design
+    //*****************************
+    
+    /**
+     * The quick way to detect for a tier of devices.
+     *   This method detects for the new generation of
+     *   HTML 5 capable, larger screen tablets.
+     *   Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
+     * @return detection of any device in the Tablet Tier
+     */
+    public boolean detectTierTablet() {
+        if (detectIpad()
+                || detectAndroidTablet()
+                || detectBlackBerryTablet()
+                || detectFirefoxOSTablet()
+                || detectUbuntuTablet()
+                || detectWebOSTablet()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * The quick way to detect for a tier of devices.
+     *   This method detects for devices which can
+     *   display iPhone-optimized web content.
+     *   Includes iPhone, iPod Touch, Android, Windows Phone 7 and 8, BB10, WebOS, Playstation Vita, etc.
+     * @return detection of any device in the iPhone/Android/Windows Phone/BlackBerry/WebOS Tier
+     */
+    public boolean detectTierIphone() {
+        if (detectIphoneOrIpod()
+                || detectAndroidPhone()
+                || detectWindowsPhone()
+                || detectBlackBerry10Phone()
+                || (detectBlackBerryWebKit() 
+					&& detectBlackBerryTouch())
+                || detectPalmWebOS()
+                || detectBada()
+                || detectTizen()
+                || detectFirefoxOSPhone()
+                || detectSailfishPhone()
+                || detectUbuntuPhone()
+                || detectGamingHandheld()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * The quick way to detect for a tier of devices.
+     *   This method detects for devices which are likely to be capable
+     *   of viewing CSS content optimized for the iPhone,
+     *   but may not necessarily support JavaScript.
+     *   Excludes all iPhone Tier devices.
+     * @return detection of any device in the 'Rich CSS' Tier
+     */
+    public boolean detectTierRichCss() {
+		boolean result = false;
+		//The following devices are explicitly ok.
+		//Note: 'High' BlackBerry devices ONLY
+		if (detectMobileQuick()) {
+
+            //Exclude iPhone Tier and e-Ink Kindle devices.
+			if (!detectTierIphone() && !detectKindle()) {
+
+				//The following devices are explicitly ok.
+				//Note: 'High' BlackBerry devices ONLY
+				//Older Windows 'Mobile' isn't good enough for iPhone Tier.
+				if (detectWebkit()
+					|| detectS60OssBrowser()
+					|| detectBlackBerryHigh()
+					|| detectWindowsMobile()
+					|| userAgent.indexOf(engineTelecaQ) != -1) {
+					   result= true;
+				} // if detectWebkit()
+			} //if !detectTierIphone()
+		} //if detectMobileQuick()
+		return result;
+    }
+
+    /**
+     * The quick way to detect for a tier of devices.
+     *   This method detects for all other types of phones,
+     *   but excludes the iPhone and RichCSS Tier devices.
+     * @return detection of a mobile device in the less capable tier 
+     */
+    public boolean detectTierOtherPhones() {
+        //Exclude devices in the other 2 categories
+        if (detectMobileLong() 
+			&& !detectTierIphone() 
+			&& !detectTierRichCss()) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/vendor/ahand/mobileesp/JavaScript/mdetect.js b/vendor/ahand/mobileesp/JavaScript/mdetect.js
new file mode 100755
index 0000000000000000000000000000000000000000..d7a3a1360e374397f07b8add1c07dbc2c9cdfdc9
--- /dev/null
+++ b/vendor/ahand/mobileesp/JavaScript/mdetect.js
@@ -0,0 +1,1160 @@
+/* *******************************************
+// Copyright 2010-2015, Anthony Hand
+//
+// BETA NOTICE
+// Previous versions of the JavaScript code for MobileESP were 'regular' 
+// JavaScript. The strength of it was that it was really easy to code and use.
+// Unfortunately, regular JavaScript means that all variables and functions
+// are in the global namespace. There can be collisions with other code libraries
+// which may have similar variable or function names. Collisions cause bugs as each
+// library changes a variable's definition or functionality unexpectedly.
+// As a result, we thought it wise to switch to an "object oriented" style of code.
+// This 'literal notation' technique keeps all MobileESP variables and functions fully self-contained.
+// It avoids potential for collisions with other JavaScript libraries.
+// This technique allows the developer continued access to any desired function or property.
+//
+// Please send feedback to project founder Anthony Hand: anthony.hand@gmail.com
+//
+//
+// File version 2015.05.13 (May 13, 2015)
+// Updates:
+//	- Moved MobileESP to GitHub. https://github.com/ahand/mobileesp
+//	- Opera Mobile/Mini browser has the same UA string on multiple platforms and doesn't differentiate phone vs. tablet. 
+//		- Removed DetectOperaAndroidPhone(). This method is no longer reliable. 
+//		- Removed DetectOperaAndroidTablet(). This method is no longer reliable. 
+//	- Added support for Windows Phone 10: variable and DetectWindowsPhone10()
+//	- Updated DetectWindowsPhone() to include WP10. 
+//	- Added support for Firefox OS.  
+//		- A variable plus DetectFirefoxOS(), DetectFirefoxOSPhone(), DetectFirefoxOSTablet()
+//		- NOTE: Firefox doesn't add UA tokens to definitively identify Firefox OS vs. their browsers on other mobile platforms.
+//	- Added support for Sailfish OS. Not enough info to add a tablet detection method at this time. 
+//		- A variable plus DetectSailfish(), DetectSailfishPhone()
+//	- Added support for Ubuntu Mobile OS. 
+//		- DetectUbuntu(), DetectUbuntuPhone(), DetectUbuntuTablet()
+//	- Added support for 2 smart TV OSes. They lack browsers but do have WebViews for use by HTML apps. 
+//		- One variable for Samsung Tizen TVs, plus DetectTizenTV()
+//		- One variable for LG WebOS TVs, plus DetectWebOSTV()
+//	- Updated DetectTizen(). Now tests for “mobile” to disambiguate from Samsung Smart TVs
+//	- Removed variables for obsolete devices: deviceHtcFlyer, deviceXoom.
+//	- Updated DetectAndroid(). No longer has a special test case for the HTC Flyer tablet. 
+//	- Updated DetectAndroidPhone(). 
+//		- Updated internal detection code for Android. 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android and reports here if relevant. 
+//	- Updated DetectAndroidTablet(). 
+//		- No longer has a special test case for the HTC Flyer tablet. 
+//		- Checks against DetectOperaMobile() on Android to exclude it from here.
+//	- DetectMeego(): Changed definition for this method. Now detects any Meego OS device, not just phones. 
+//	- DetectMeegoPhone(): NEW. For Meego phones. Ought to detect Opera browsers on Meego, as well.  
+//	- DetectTierIphone(): Added support for phones running Sailfish, Ubuntu and Firefox Mobile. 
+//	- DetectTierTablet(): Added support for tablets running Ubuntu and Firefox Mobile. 
+//	- DetectSmartphone(): Added support for Meego phones. 
+//	- Reorganized DetectMobileQuick(). Moved the following to DetectMobileLong():
+//		- DetectDangerHiptop(), DetectMaemoTablet(), DetectSonyMylo(), DetectArchos()
+//       
+//
+//
+// LICENSE INFORMATION
+// 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. 
+//
+//
+// ABOUT THIS PROJECT
+//   Project Owner: Anthony Hand
+//   Email: anthony.hand@gmail.com
+//   Web Site: http://www.mobileesp.com
+//   Source Files: https://github.com/ahand/mobileesp
+//   
+//   Versions of this code are available for:
+//      PHP, JavaScript, Java, ASP.NET (C#), Ruby and others
+//
+//
+// WARNING: 
+//   These JavaScript-based device detection features may ONLY work 
+//   for the newest generation of smartphones, such as the iPhone, 
+//   Android and Palm WebOS devices.
+//   These device detection features may NOT work for older smartphones 
+//   which had poor support for JavaScript, including 
+//   older BlackBerry, PalmOS, and Windows Mobile devices. 
+//   Additionally, because JavaScript support is extremely poor among 
+//   'feature phones', these features may not work at all on such devices.
+//   For better results, consider using a server-based version of this code, 
+//   such as Java, APS.NET, PHP, or Ruby.
+//
+// *******************************************
+*/
+
+
+var MobileEsp = {
+
+	//GLOBALLY USEFUL VARIABLES
+	//Note: These values are set automatically during the Init function.
+	//Stores whether we're currently initializing the most popular functions.
+	initCompleted : false,
+	isWebkit : false, //Stores the result of DetectWebkit()
+	isMobilePhone : false, //Stores the result of DetectMobileQuick()
+	isIphone : false, //Stores the result of DetectIphone()
+	isAndroid : false, //Stores the result of DetectAndroid()
+	isAndroidPhone : false, //Stores the result of DetectAndroidPhone()
+	isTierTablet : false, //Stores the result of DetectTierTablet()
+	isTierIphone : false, //Stores the result of DetectTierIphone()
+	isTierRichCss : false, //Stores the result of DetectTierRichCss()
+	isTierGenericMobile : false, //Stores the result of DetectTierOtherPhones()
+	
+	//INTERNALLY USED DETECTION STRING VARIABLES
+	engineWebKit : 'webkit',
+	deviceIphone : 'iphone',
+	deviceIpod : 'ipod',
+	deviceIpad : 'ipad',
+	deviceMacPpc : 'macintosh', //Used for disambiguation
+	
+	deviceAndroid : 'android',
+	deviceGoogleTV : 'googletv',
+	
+	deviceWinPhone7 : 'windows phone os 7', 
+	deviceWinPhone8 : 'windows phone 8', 
+	deviceWinPhone10 : 'windows phone 10', 
+	deviceWinMob : 'windows ce',
+	deviceWindows : 'windows',
+	deviceIeMob : 'iemobile',
+	devicePpc : 'ppc', //Stands for PocketPC
+	enginePie : 'wm5 pie',  //An old Windows Mobile
+
+	deviceBB : 'blackberry',
+	deviceBB10 : 'bb10', //For the new BB 10 OS
+	vndRIM : 'vnd.rim', //Detectable when BB devices emulate IE or Firefox
+	deviceBBStorm : 'blackberry95', //Storm 1 and 2
+	deviceBBBold : 'blackberry97', //Bold 97x0 (non-touch)
+	deviceBBBoldTouch : 'blackberry 99', //Bold 99x0 (touchscreen)
+	deviceBBTour : 'blackberry96', //Tour
+	deviceBBCurve : 'blackberry89', //Curve 2
+	deviceBBCurveTouch : 'blackberry 938', //Curve Touch 9380
+	deviceBBTorch : 'blackberry 98', //Torch
+	deviceBBPlaybook : 'playbook', //PlayBook tablet
+
+	deviceSymbian : 'symbian',
+	deviceSymbos : 'symbos', //Opera 10 on Symbian
+	deviceS60 : 'series60',
+	deviceS70 : 'series70',
+	deviceS80 : 'series80',
+	deviceS90 : 'series90',
+
+	devicePalm : 'palm',
+	deviceWebOS : 'webos', //For Palm devices 
+	deviceWebOStv : 'web0s', //For LG TVs
+	deviceWebOShp : 'hpwos', //For HP's line of WebOS devices
+
+	deviceNuvifone : 'nuvifone', //Garmin Nuvifone
+	deviceBada : 'bada', //Samsung's Bada OS
+	deviceTizen : 'tizen', //Tizen OS
+	deviceMeego : 'meego', //Meego OS
+	deviceSailfish : 'sailfish', //Sailfish OS
+	deviceUbuntu : 'ubuntu', //Ubuntu Mobile OS
+
+	deviceKindle : 'kindle', //Amazon eInk Kindle
+	engineSilk : 'silk-accelerated', //Amazon's accelerated Silk browser for Kindle Fire
+
+	engineBlazer : 'blazer', //Old Palm browser
+	engineXiino : 'xiino',
+	
+	//Initialize variables for mobile-specific content.
+	vndwap : 'vnd.wap',
+	wml : 'wml',
+	
+	//Initialize variables for random devices and mobile browsers.
+	//Some of these may not support JavaScript
+	deviceTablet : 'tablet',
+	deviceBrew : 'brew',
+	deviceDanger : 'danger',
+	deviceHiptop : 'hiptop',
+	devicePlaystation : 'playstation',
+	devicePlaystationVita : 'vita',
+	deviceNintendoDs : 'nitro',
+	deviceNintendo : 'nintendo',
+	deviceWii : 'wii',
+	deviceXbox : 'xbox',
+	deviceArchos : 'archos',
+	
+	engineFirefox : 'firefox', //For Firefox OS
+	engineOpera : 'opera', //Popular browser
+	engineNetfront : 'netfront', //Common embedded OS browser
+	engineUpBrowser : 'up.browser', //common on some phones
+	deviceMidp : 'midp', //a mobile Java technology
+	uplink : 'up.link',
+	engineTelecaQ : 'teleca q', //a modern feature phone browser
+	engineObigo : 'obigo', //W 10 is a modern feature phone browser
+	
+	devicePda : 'pda',
+	mini : 'mini',  //Some mobile browsers put 'mini' in their names
+	mobile : 'mobile', //Some mobile browsers put 'mobile' in their user agent strings
+	mobi : 'mobi', //Some mobile browsers put 'mobi' in their user agent strings
+	
+	//Smart TV strings
+	smartTV1 : 'smart-tv', //Samsung Tizen smart TVs
+	smartTV2 : 'smarttv', //LG WebOS smart TVs
+
+	//Use Maemo, Tablet, and Linux to test for Nokia's Internet Tablets.
+	maemo : 'maemo',
+	linux : 'linux',
+	mylocom2 : 'sony/com', // for Sony Mylo 1 and 2
+	
+	//In some UserAgents, the only clue is the manufacturer
+	manuSonyEricsson : 'sonyericsson',
+	manuericsson : 'ericsson',
+	manuSamsung1 : 'sec-sgh',
+	manuSony : 'sony',
+	manuHtc : 'htc', //Popular Android and WinMo manufacturer
+	
+	//In some UserAgents, the only clue is the operator
+	svcDocomo : 'docomo',
+	svcKddi : 'kddi',
+	svcVodafone : 'vodafone',
+	
+	//Disambiguation strings.
+	disUpdate : 'update', //pda vs. update
+	
+	//Holds the User Agent string value.
+	uagent : '',
+   
+	//Initializes key MobileEsp variables
+	InitDeviceScan : function() {
+		this.initCompleted = false;
+		
+		if (navigator && navigator.userAgent)
+			this.uagent = navigator.userAgent.toLowerCase();
+		
+		//Save these properties to speed processing
+		this.isWebkit = this.DetectWebkit();
+		this.isIphone = this.DetectIphone();
+		this.isAndroid = this.DetectAndroid();
+		this.isAndroidPhone = this.DetectAndroidPhone();
+		
+		//Generally, these tiers are the most useful for web development
+		this.isMobilePhone = this.DetectMobileQuick();
+		this.isTierIphone = this.DetectTierIphone();
+		this.isTierTablet = this.DetectTierTablet();
+		
+		//Optional: Comment these out if you NEVER use them
+		this.isTierRichCss = this.DetectTierRichCss();
+		this.isTierGenericMobile = this.DetectTierOtherPhones();
+		
+		this.initCompleted = true;
+	},
+
+
+	//APPLE IOS
+
+	//**************************
+	// Detects if the current device is an iPhone.
+	DetectIphone : function() {
+        if (this.initCompleted || this.isIphone)
+			return this.isIphone;
+
+		if (this.uagent.search(this.deviceIphone) > -1)
+			{
+				//The iPad and iPod Touch say they're an iPhone! So let's disambiguate.
+				if (this.DetectIpad() || this.DetectIpod())
+					return false;
+				//Yay! It's an iPhone!
+				else 
+					return true;
+			}
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is an iPod Touch.
+	DetectIpod : function() {
+			if (this.uagent.search(this.deviceIpod) > -1)
+				return true;
+			else
+				return false;
+	},
+
+	//**************************
+	// Detects if the current device is an iPhone or iPod Touch.
+	DetectIphoneOrIpod : function() {
+		//We repeat the searches here because some iPods 
+		//  may report themselves as an iPhone, which is ok.
+		if (this.DetectIphone() || this.DetectIpod())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is an iPad tablet.
+	DetectIpad : function() {
+		if (this.uagent.search(this.deviceIpad) > -1  && this.DetectWebkit())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects *any* iOS device: iPhone, iPod Touch, iPad.
+	DetectIos : function() {
+		if (this.DetectIphoneOrIpod() || this.DetectIpad())
+			return true;
+		else
+			return false;
+	},
+
+
+	//ANDROID
+
+	//**************************
+	// Detects *any* Android OS-based device: phone, tablet, and multi-media player.
+	// Also detects Google TV.
+	DetectAndroid : function() {
+		if (this.initCompleted || this.isAndroid)
+			return this.isAndroid;
+		
+		if ((this.uagent.search(this.deviceAndroid) > -1) || this.DetectGoogleTV())
+			return true;
+		
+		return false;
+	},
+
+	//**************************
+	// Detects if the current device is a (small-ish) Android OS-based device
+	// used for calling and/or multi-media (like a Samsung Galaxy Player).
+	// Google says these devices will have 'Android' AND 'mobile' in user agent.
+	// Ignores tablets (Honeycomb and later).
+	DetectAndroidPhone : function() {
+		if (this.initCompleted || this.isAndroidPhone)
+			return this.isAndroidPhone;
+		
+		//First, let's make sure we're on an Android device.
+		if (!this.DetectAndroid())
+			return false;
+		
+		//If it's Android and has 'mobile' in it, Google says it's a phone.
+		if (this.uagent.search(this.mobile) > -1)
+			return true;
+
+		//Special check for Android phones with Opera Mobile. They should report here.
+		if (this.DetectOperaMobile())
+			return true;
+		
+		return false;
+	},
+
+	//**************************
+	// Detects if the current device is a (self-reported) Android tablet.
+	// Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
+	DetectAndroidTablet : function() {
+		//First, let's make sure we're on an Android device.
+		if (!this.DetectAndroid())
+			return false;
+		
+		//Special check for Opera Android Phones. They should NOT report here.
+		if (this.DetectOperaMobile())
+			return false;
+			
+		//Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
+		if (this.uagent.search(this.mobile) > -1)
+			return false;
+		else
+			return true;
+	},
+
+	//**************************
+	// Detects if the current device is an Android OS-based device and
+	//   the browser is based on WebKit.
+	DetectAndroidWebKit : function() {
+		if (this.DetectAndroid() && this.DetectWebkit())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is a GoogleTV.
+	DetectGoogleTV : function() {
+		if (this.uagent.search(this.deviceGoogleTV) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is based on WebKit.
+	DetectWebkit : function() {
+		if (this.initCompleted || this.isWebkit)
+			return this.isWebkit;
+		
+		if (this.uagent.search(this.engineWebKit) > -1)
+			return true;
+		else
+			return false;
+	},
+
+
+	//WINDOWS MOBILE AND PHONE
+
+    // Detects if the current browser is a 
+    // Windows Phone 7, 8, or 10 device.
+    DetectWindowsPhone : function() {
+		if (this.DetectWindowsPhone7() ||
+            this.DetectWindowsPhone8() ||
+            this.DetectWindowsPhone10())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a Windows Phone 7 device (in mobile browsing mode).
+	DetectWindowsPhone7 : function() { 
+		if (this.uagent.search(this.deviceWinPhone7) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a Windows Phone 8 device (in mobile browsing mode).
+	DetectWindowsPhone8 : function() {
+		if (this.uagent.search(this.deviceWinPhone8) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a Windows Phone 10 device (in mobile browsing mode).
+	DetectWindowsPhone10 : function() {
+		if (this.uagent.search(this.deviceWinPhone10) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is a Windows Mobile device.
+	// Excludes Windows Phone 7 and later devices. 
+	// Focuses on Windows Mobile 6.xx and earlier.
+	DetectWindowsMobile : function() {
+		if (this.DetectWindowsPhone())
+			return false;
+
+		//Most devices use 'Windows CE', but some report 'iemobile' 
+		//  and some older ones report as 'PIE' for Pocket IE. 
+		if (this.uagent.search(this.deviceWinMob) > -1 ||
+			this.uagent.search(this.deviceIeMob) > -1 ||
+			this.uagent.search(this.enginePie) > -1)
+			return true;
+		//Test for Windows Mobile PPC but not old Macintosh PowerPC.
+		if ((this.uagent.search(this.devicePpc) > -1) && 
+			!(this.uagent.search(this.deviceMacPpc) > -1))
+			return true;
+		//Test for Windwos Mobile-based HTC devices.
+		if (this.uagent.search(this.manuHtc) > -1 &&
+			this.uagent.search(this.deviceWindows) > -1)
+			return true;
+		else
+			return false;
+	},
+
+
+	//BLACKBERRY
+
+	//**************************
+	// Detects if the current browser is a BlackBerry of some sort.
+	// Includes BB10 OS, but excludes the PlayBook.
+	DetectBlackBerry : function() {
+		if ((this.uagent.search(this.deviceBB) > -1) ||
+			(this.uagent.search(this.vndRIM) > -1))
+			return true;
+		if (this.DetectBlackBerry10Phone())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+        // Detects if the current browser is a BlackBerry 10 OS phone.
+        // Excludes tablets.
+	DetectBlackBerry10Phone : function() {
+		if ((this.uagent.search(this.deviceBB10) > -1) &&
+			(this.uagent.search(this.mobile) > -1))
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is on a BlackBerry tablet device.
+	//    Example: PlayBook
+	DetectBlackBerryTablet : function() {
+		if (this.uagent.search(this.deviceBBPlaybook) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is a BlackBerry device AND uses a
+	//    WebKit-based browser. These are signatures for the new BlackBerry OS 6.
+	//    Examples: Torch. Includes the Playbook.
+	DetectBlackBerryWebKit : function() {
+		if (this.DetectBlackBerry() &&
+			this.uagent.search(this.engineWebKit) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is a BlackBerry Touch
+	//    device, such as the Storm, Torch, and Bold Touch. Excludes the Playbook.
+	DetectBlackBerryTouch : function() {
+		if (this.DetectBlackBerry() &&
+			((this.uagent.search(this.deviceBBStorm) > -1) ||
+			(this.uagent.search(this.deviceBBTorch) > -1) ||
+			(this.uagent.search(this.deviceBBBoldTouch) > -1) ||
+			(this.uagent.search(this.deviceBBCurveTouch) > -1) ))
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is a BlackBerry OS 5 device AND
+	//    has a more capable recent browser. Excludes the Playbook.
+	//    Examples, Storm, Bold, Tour, Curve2
+	//    Excludes the new BlackBerry OS 6 and 7 browser!!
+	DetectBlackBerryHigh : function() {
+		//Disambiguate for BlackBerry OS 6 or 7 (WebKit) browser
+		if (this.DetectBlackBerryWebKit())
+			return false;
+		if ((this.DetectBlackBerry()) &&
+			(this.DetectBlackBerryTouch() ||
+			this.uagent.search(this.deviceBBBold) > -1 || 
+			this.uagent.search(this.deviceBBTour) > -1 || 
+			this.uagent.search(this.deviceBBCurve) > -1))
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is a BlackBerry device AND
+	//    has an older, less capable browser. 
+	//    Examples: Pearl, 8800, Curve1.
+	DetectBlackBerryLow : function() {
+		if (this.DetectBlackBerry())
+		{
+			//Assume that if it's not in the High tier or has WebKit, then it's Low.
+			if (this.DetectBlackBerryHigh() || this.DetectBlackBerryWebKit())
+				return false;
+			else
+				return true;
+		}
+		else
+			return false;
+	},
+
+
+	//SYMBIAN
+
+	//**************************
+	// Detects if the current browser is the Nokia S60 Open Source Browser.
+	DetectS60OssBrowser : function() {
+		if (this.DetectWebkit())
+		{
+			if ((this.uagent.search(this.deviceS60) > -1 || 
+				this.uagent.search(this.deviceSymbian) > -1))
+				return true;
+			else
+				return false;
+		}
+		else
+			return false;
+	}, 
+
+	//**************************
+	// Detects if the current device is any Symbian OS-based device,
+	//   including older S60, Series 70, Series 80, Series 90, and UIQ, 
+	//   or other browsers running on these devices.
+	DetectSymbianOS : function() {
+		if (this.uagent.search(this.deviceSymbian) > -1 ||
+			this.uagent.search(this.deviceS60) > -1 ||
+			((this.uagent.search(this.deviceSymbos) > -1) &&
+				(this.DetectOperaMobile)) || //Opera 10
+			this.uagent.search(this.deviceS70) > -1 ||
+			this.uagent.search(this.deviceS80) > -1 ||
+			this.uagent.search(this.deviceS90) > -1)
+			return true;
+		else
+			return false;
+	},
+
+
+	//WEBOS AND PALM
+
+	//**************************
+	// Detects if the current browser is on a PalmOS device.
+	DetectPalmOS : function() {
+		//Make sure it's not WebOS first
+		if (this.DetectPalmWebOS())
+			return false;
+
+		//Most devices nowadays report as 'Palm', 
+		//  but some older ones reported as Blazer or Xiino.
+		if (this.uagent.search(this.devicePalm) > -1 ||
+			this.uagent.search(this.engineBlazer) > -1 ||
+			this.uagent.search(this.engineXiino) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is on a Palm device
+	//   running the new WebOS.
+	DetectPalmWebOS : function()
+	{
+		if (this.uagent.search(this.deviceWebOS) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is on an HP tablet running WebOS.
+	DetectWebOSTablet : function() {
+		if (this.uagent.search(this.deviceWebOShp) > -1 &&
+			this.uagent.search(this.deviceTablet) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is on a WebOS smart TV.
+	DetectWebOSTV : function() {
+		if (this.uagent.search(this.deviceWebOStv) > -1 &&
+			this.uagent.search(this.smartTV2) > -1)
+			return true;
+		else
+			return false;
+	},
+
+
+	//OPERA
+
+	//**************************
+	// Detects if the current browser is Opera Mobile or Mini.
+	// Note: Older embedded Opera on mobile devices didn't follow these naming conventions.
+	//   Like Archos media players, they will probably show up in DetectMobileQuick or -Long instead. 
+	DetectOperaMobile : function() {
+		if ((this.uagent.search(this.engineOpera) > -1) &&
+			((this.uagent.search(this.mini) > -1 ||
+			this.uagent.search(this.mobi) > -1)))
+			return true;
+		else
+			return false;
+	},
+
+
+	//MISCELLANEOUS DEVICES
+
+	//**************************
+	// Detects if the current device is an Amazon Kindle (eInk devices only).
+	// Note: For the Kindle Fire, use the normal Android methods.
+	DetectKindle : function() {
+		if (this.uagent.search(this.deviceKindle) > -1 &&
+			!this.DetectAndroid())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current Amazon device has turned on the Silk accelerated browsing feature.
+	// Note: Typically used by the the Kindle Fire.
+	DetectAmazonSilk : function() {
+		if (this.uagent.search(this.engineSilk) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is a
+	//   Garmin Nuvifone.
+	DetectGarminNuvifone : function() {
+		if (this.uagent.search(this.deviceNuvifone) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a device running the Bada OS from Samsung.
+	DetectBada : function() {
+		if (this.uagent.search(this.deviceBada) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a device running the Tizen smartphone OS.
+	DetectTizen : function() {
+		if (this.uagent.search(this.deviceTizen) > -1 &&
+			this.uagent.search(this.mobile) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is on a Tizen smart TV.
+	DetectTizenTV : function() {
+		if (this.uagent.search(this.deviceTizen) > -1 &&
+			this.uagent.search(this.smartTV1) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a device running the Meego OS.
+	DetectMeego : function() {
+		if (this.uagent.search(this.deviceMeego) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a phone running the Meego OS.
+	DetectMeegoPhone : function() {
+		if (this.uagent.search(this.deviceMeego) > -1 &&
+			this.uagent.search(this.mobi) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a mobile device (probably) running the Firefox OS.
+	DetectFirefoxOS : function() {
+		if (this.DetectFirefoxOSPhone() || this.DetectFirefoxOSTablet())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a phone (probably) running the Firefox OS.
+	DetectFirefoxOSPhone : function() {
+		//First, let's make sure we're NOT on another major mobile OS.
+		if (this.DetectIos() || 
+			this.DetectAndroid() ||
+			this.DetectSailfish())
+			return false;    	  
+
+		if ((this.uagent.search(this.engineFirefox) > -1) && 
+			(this.uagent.search(this.mobile) > -1))
+			return true;
+		
+		return false;
+	},
+
+	//**************************
+	// Detects a tablet (probably) running the Firefox OS.
+	DetectFirefoxOSTablet : function() {
+		//First, let's make sure we're NOT on another major mobile OS.
+		if (this.DetectIos() || 
+			this.DetectAndroid() ||
+			this.DetectSailfish())
+			return false;    	  
+
+		if ((this.uagent.search(this.engineFirefox) > -1) && 
+			(this.uagent.search(this.deviceTablet) > -1))
+			return true;
+		
+		return false;
+	},
+
+	//**************************
+	// Detects a device running the Sailfish OS.
+	DetectSailfish : function() {
+		if (this.uagent.search(this.deviceSailfish) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a phone running the Sailfish OS.
+	DetectSailfishPhone : function() {
+		if (this.DetectSailfish() && (this.uagent.search(this.mobile) > -1))
+			return true;
+		
+		return false;
+	},
+
+
+	//**************************
+	// Detects a mobile device running the Ubuntu Mobile OS.
+	DetectUbuntu : function() {
+		if (this.DetectUbuntuPhone() || this.DetectUbuntuTablet())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects a phone running the Ubuntu Mobile OS.
+	DetectUbuntuPhone : function() {
+		if ((this.uagent.search(this.deviceUbuntu) > -1) && 
+			(this.uagent.search(this.mobile) > -1))
+			return true;
+		
+		return false;
+	},
+
+	//**************************
+	// Detects a tablet running the Ubuntu Mobile OS.
+	DetectUbuntuTablet : function() {
+		if ((this.uagent.search(this.deviceUbuntu) > -1) && 
+			(this.uagent.search(this.deviceTablet) > -1))
+			return true;
+		
+		return false;
+	},
+
+	//**************************
+	// Detects the Danger Hiptop device.
+	DetectDangerHiptop : function() {
+		if (this.uagent.search(this.deviceDanger) > -1 ||
+			this.uagent.search(this.deviceHiptop) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current browser is a Sony Mylo device.
+	DetectSonyMylo : function() {
+		if ((this.uagent.search(this.manuSony) > -1) &&
+                    ((this.uagent.search(this.qtembedded) > -1) ||
+                     (this.uagent.search(this.mylocom2) > -1)))
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is on one of 
+	// the Maemo-based Nokia Internet Tablets.
+	DetectMaemoTablet : function() {
+		if (this.uagent.search(this.maemo) > -1)
+			return true;
+		//For Nokia N810, must be Linux + Tablet, or else it could be something else.
+		if ((this.uagent.search(this.linux) > -1) && 
+			(this.uagent.search(this.deviceTablet) > -1) && 
+			this.DetectWebOSTablet() && 
+			!this.DetectAndroid())
+			return true;
+		else
+			return false;
+	},
+
+        //**************************
+	// Detects if the current device is an Archos media player/Internet tablet.
+	DetectArchos : function() {
+		if (this.uagent.search(this.deviceArchos) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is an Internet-capable game console.
+	// Includes many handheld consoles.
+	DetectGameConsole : function() {
+		if (this.DetectSonyPlaystation() || 
+			this.DetectNintendo() ||
+			this.DetectXbox())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is a Sony Playstation.
+	DetectSonyPlaystation : function() {
+		if (this.uagent.search(this.devicePlaystation) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is a handheld gaming device with
+    // a touchscreen and modern iPhone-class browser. Includes the Playstation Vita.
+	DetectGamingHandheld : function() {
+		if ((this.uagent.search(this.devicePlaystation) > -1) &&
+                   (this.uagent.search(this.devicePlaystationVita) > -1))
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is a Nintendo game device.
+	DetectNintendo : function() {
+		if (this.uagent.search(this.deviceNintendo) > -1   || 
+			this.uagent.search(this.deviceWii) > -1 ||
+			this.uagent.search(this.deviceNintendoDs) > -1)
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// Detects if the current device is a Microsoft Xbox.
+	DetectXbox : function() {
+		if (this.uagent.search(this.deviceXbox) > -1)
+			return true;
+		else
+			return false;
+	},
+        
+        
+	//**************************
+	// Detects whether the device is a Brew-powered device.
+	//   Note: Limited to older Brew-powered feature phones.
+	//   Ignores newer Brew versions like MP. Refer to DetectMobileQuick().
+	DetectBrewDevice : function() {
+		if (this.uagent.search(this.deviceBrew) > -1)
+			return true;
+		else
+			return false;
+	},
+
+
+	// DEVICE CLASSES
+
+	//**************************
+	// Check to see whether the device is *any* 'smartphone'.
+	//   Note: It's better to use DetectTierIphone() for modern touchscreen devices. 
+	DetectSmartphone : function() {
+		//Exclude duplicates from TierIphone
+        if (this.DetectTierIphone() ||
+            this.DetectS60OssBrowser() ||
+			this.DetectSymbianOS() ||
+			this.DetectWindowsMobile() ||
+			this.DetectBlackBerry() ||
+			this.DetectMeegoPhone() ||
+			this.DetectPalmOS())
+			return true;
+		
+		//Otherwise, return false.
+		return false;
+	},
+
+	//**************************
+	// Detects if the current device is a mobile device.
+	//  This method catches most of the popular modern devices.
+	//  Excludes Apple iPads and other modern tablets.
+	DetectMobileQuick : function() {
+		if (this.initCompleted || this.isMobilePhone)
+			return this.isMobilePhone;
+
+		//Let's exclude tablets.
+		if (this.DetectTierTablet())
+			return false;
+
+		//Most mobile browsing is done on smartphones
+		if (this.DetectSmartphone())
+			return true;
+
+		//Catch-all for many mobile devices
+		if (this.uagent.search(this.mobile) > -1)
+			return true;
+
+		if (this.DetectOperaMobile())
+			return true;
+
+		//We also look for Kindle devices
+		if (this.DetectKindle() ||
+			this.DetectAmazonSilk())
+			return true;
+
+		if (this.uagent.search(this.deviceMidp) > -1 ||
+			this.DetectBrewDevice())
+			return true;
+
+		if ((this.uagent.search(this.engineObigo) > -1) ||
+			(this.uagent.search(this.engineNetfront) > -1) ||
+			(this.uagent.search(this.engineUpBrowser) > -1))
+			return true;
+
+		return false;
+	},
+
+	//**************************
+	// Detects in a more comprehensive way if the current device is a mobile device.
+	DetectMobileLong : function() {
+		if (this.DetectMobileQuick())
+			return true;
+		if (this.DetectGameConsole())
+			return true;
+
+		if (this.DetectDangerHiptop() ||
+			this.DetectMaemoTablet() ||
+			this.DetectSonyMylo() ||
+			this.DetectArchos())
+			return true;
+
+		if ((this.uagent.search(this.devicePda) > -1) &&
+			!(this.uagent.search(this.disUpdate) > -1)) 
+			return true;
+		
+		//Detect for certain very old devices with stupid useragent strings.
+		if ((this.uagent.search(this.manuSamsung1) > -1) ||
+			(this.uagent.search(this.manuSonyEricsson) > -1) || 
+			(this.uagent.search(this.manuericsson) > -1) ||
+			(this.uagent.search(this.svcDocomo) > -1) ||
+			(this.uagent.search(this.svcKddi) > -1) ||
+			(this.uagent.search(this.svcVodafone) > -1))
+			return true;
+		
+		return false;
+	},
+
+	//*****************************
+	// For Mobile Web Site Design
+	//*****************************
+	
+	//**************************
+	// The quick way to detect for a tier of devices.
+	//   This method detects for the new generation of
+	//   HTML 5 capable, larger screen tablets.
+	//   Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
+	DetectTierTablet : function() {
+		if (this.initCompleted || this.isTierTablet)
+			return this.isTierTablet;
+		
+		if (this.DetectIpad() ||
+			this.DetectAndroidTablet() ||
+			this.DetectBlackBerryTablet() ||
+			this.DetectFirefoxOSTablet() ||
+			this.DetectUbuntuTablet() ||
+			this.DetectWebOSTablet())
+			return true;
+		else
+			return false;
+	},
+
+	//**************************
+	// The quick way to detect for a tier of devices.
+	//   This method detects for devices which can 
+	//   display iPhone-optimized web content.
+	//   Includes iPhone, iPod Touch, Android, Windows Phone 7 and 8, BB10, WebOS, Playstation Vita, etc.
+	DetectTierIphone : function() {
+		if (this.initCompleted || this.isTierIphone)
+			return this.isTierIphone;
+
+		if (this.DetectIphoneOrIpod() ||
+                        this.DetectAndroidPhone() ||
+			this.DetectWindowsPhone() ||
+			this.DetectBlackBerry10Phone() ||
+			this.DetectPalmWebOS() ||
+			this.DetectBada() ||
+			this.DetectTizen() ||
+			this.DetectFirefoxOSPhone() ||
+			this.DetectSailfishPhone() ||
+			this.DetectUbuntuPhone() ||
+			this.DetectGamingHandheld())
+			return true;
+
+        //Note: BB10 phone is in the previous paragraph
+		if (this.DetectBlackBerryWebKit() && this.DetectBlackBerryTouch())
+			return true;
+		
+		else
+			return false;
+	},
+
+	//**************************
+	// The quick way to detect for a tier of devices.
+	//   This method detects for devices which are likely to be 
+	//   capable of viewing CSS content optimized for the iPhone, 
+	//   but may not necessarily support JavaScript.
+	//   Excludes all iPhone Tier devices.
+	DetectTierRichCss : function() {
+		if (this.initCompleted || this.isTierRichCss)
+			return this.isTierRichCss;
+
+		//Exclude iPhone and Tablet Tiers and e-Ink Kindle devices
+		if (this.DetectTierIphone() ||
+			this.DetectKindle() ||
+			this.DetectTierTablet())
+			return false;
+		
+		//Exclude if not mobile
+		if (!this.DetectMobileQuick())
+			return false;
+				
+		//If it's a mobile webkit browser on any other device, it's probably OK.
+		if (this.DetectWebkit())
+			return true;
+		
+		//The following devices are also explicitly ok.
+		if (this.DetectS60OssBrowser() ||
+			this.DetectBlackBerryHigh() ||
+			this.DetectWindowsMobile() ||
+			(this.uagent.search(this.engineTelecaQ) > -1))
+			return true;
+		
+		else
+			return false;
+	},
+
+	//**************************
+	// The quick way to detect for a tier of devices.
+	//   This method detects for all other types of phones,
+	//   but excludes the iPhone and RichCSS Tier devices.
+	// NOTE: This method probably won't work due to poor
+	//  support for JavaScript among other devices. 
+	DetectTierOtherPhones : function() {
+		if (this.initCompleted || this.isTierGenericMobile)
+			return this.isTierGenericMobile;
+		
+		//Exclude iPhone, Rich CSS and Tablet Tiers
+		if (this.DetectTierIphone() ||
+			this.DetectTierRichCss() ||
+			this.DetectTierTablet())
+			return false;
+		
+		//Otherwise, if it's mobile, it's OK
+		if (this.DetectMobileLong())
+			return true;
+
+		else
+			return false;
+	}
+
+};
+
+//Initialize the MobileEsp object
+MobileEsp.InitDeviceScan();
+
+
+
diff --git a/vendor/ahand/mobileesp/LICENSE b/vendor/ahand/mobileesp/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..8f71f43fee3f78649d238238cbde51e6d7055c82
--- /dev/null
+++ b/vendor/ahand/mobileesp/LICENSE
@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   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.
+
diff --git a/vendor/ahand/mobileesp/MobileESP_UA-Test-Strings/MobileESP UA Test Strings - UA Strings.csv b/vendor/ahand/mobileesp/MobileESP_UA-Test-Strings/MobileESP UA Test Strings - UA Strings.csv
new file mode 100644
index 0000000000000000000000000000000000000000..d1ce0ca1461d0ec386716ba50745d8fd856ffe11
--- /dev/null
+++ b/vendor/ahand/mobileesp/MobileESP_UA-Test-Strings/MobileESP UA Test Strings - UA Strings.csv	
@@ -0,0 +1,139 @@
+UA Type,Device OEM,Device Name,Device Platform,Browser,UA String,Matched Sub-Strings,MobileESP Detection Methods,MobileESP Priority,Comments,Markets Launched,Reference
+tablet,Acer,Iconia A500,Andorid ,Android,"Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13","android, webkit","DetectAndroid(), DetectAndroidTablet(), DetectAndroidWebKit(), DetectWebKit()",High,Launched with Android 3.0 (Honeycomb),International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Amazon,Fire,Android,Kindle Silk,"Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","Android, mobile, webkit","DetectAndroid(), DetectAndroidPhone(), DetectAndroidWebKit(), DetectWebKit()",High,The Kindle Fire Android browser running in normal Android mode. MobileESP ignores the Kindle word here.,International,http://www.labnol.org/software/kindle-user-agent-string/20378/
+mobile,Amazon,Fire,Android,Kindle Silk,"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true",silk,DetectAmazonSilk(),High,The US for the Silk browser in accelerated mode on the Amazon Kindle Fire.,International,http://www.labnol.org/software/kindle-user-agent-string/20378/
+mobile,Barnes & Noble,Nook Simple Touch,Android,Android,"2.1 NOOK BNRV300---Mozilla/5.0 (Linux; U; Android 2.1; xx-xx; NOOK BNRV300 Build/ERD79) Apple WebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17","android, nook","DetectAndroid(), DetectAndroidPhone(), DetectAndroidWebKit(), DetectWebKit(), DetectNook()",Low,The Simple Touch is black and white but runs Android. ,,
+tablet,Barnes & Noble,Nook,Android,Android,nook browser/1.0,nook,"DetectNook(), DetectMobileQuick()",Low,"This was the UA for the Nook 1.0 device. Support is added for detecting the ""Nook"" substring just in case the useragent doesn't report Android or the device is an older eInk one.",International,http://www.zytrax.com/tech/web/mobile_ids.html
+tablet,Barnes & Noble,Nook Color,Android,Android,"Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; BNTV250A Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1",android,"DetectAndroid(), DetectAndroidTablet(), DetectAndroidWebKit(), DetectWebKit()",High,"With this UA, the Nook Color reports itself as an Android Tablet. (The Nook Color was the Nook 2.0 device.)",International,http://www.zytrax.com/tech/web/mobile_ids.html
+tablet,Google,Nexus 10,Android,Firefox,mozilla/5.0 (android; tablet; rv:37.0) gecko/37.0 firefox/37.0,android,"DetectAndrid(), DetectAndroidTablet()",Medium,"This will detect as a tablet because Firefox doesn't put ""mobile"" in the useragent. ",International,Through direct testing in May 2015. 
+tablet,Google,Nexus 10,Android,Opera,"mozilla/5.0 (linux; android 5.1.1; nexus 10 build/lmy47v) applewebkit/537.36 (khtml, like gecko) chrome/42.0.2311.107 safari/537.36 opr/29.0.1809.92117","android, webkit","DetectAndroid(), DetectWebKit()",Medium,"No token for ""tablet"". ",International,Through direct testing in May 2015. 
+tablet,Google,Nexus 10,Android,Opera Mini,opera/9.80 (android; opera mini/8.0.1807/36.1955; u; en) presto/2.12.423 version/12.16,"opera, mini","DetectOperaMobile(), DetectAndroid(), DetectMobileQuick()",Medium,"No token for ""tablet"". Scored 203 out of 555 at www.html5test.com",International,Through direct testing in May 2015. 
+mobile,HTC,Flyer - Desktop Mode,Android,Android,"mozilla/5.0 (macintosh; u; intel mac os x 10_6_3; htc_flyer_p512; en-us) applewebkit/533.16 (khtml, like gecko) version/5.0 safari/533.16",n/a,"DetectAndroid(), DetectAndroidPhone(), DetectAndroidWebKit(), DetectWebKit()",Low,"As of June 2012, special allowance is made for detecting the HTC Flyer in Desktop mode and identifying it as a phone. ",International,Copied from the HTC browser. Saved in Anthony's personal Gmail. 
+mobile,HTC,Flyer - Mobile Browsing Mode,Android,Android,"mozilla/5.0 (linux; u; android 2.3.4; en-us; htc_flyer_p512 build/grj22) applewebkit/533.1 (khtml, like gecko) version/4.0 mobile safari/533.1",android,"DetectAndroid(), DetectAndroidPhone(), DetectAndroidWebKit(), DetectWebKit()",Low,"As of June 2012, special allowance is made for detecting the HTC Flyer in Desktop mode and identifying it as a phone.",International,Copied from the HTC browser. Saved in Anthony's personal Gmail.
+mobile,HTC,T-Mobile G1,Android,Android,"Mozilla/5.0 (Linux; U; Android 1.1; en-gb; dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2","Android, mobile, webkit","DetectAndroid(), DetectAndroidPhone(), DetectAndroidWebKit(), DetectWebKit()",High,"The G1 was the first Android device on the US market (first in the world). It launched with Android 1.1, was later OTA updated to 1.5 (Cupcake).",USA,http://www.gtrifonov.com/2010/04/29/google-android-user-agent-strings-3/
+mobile,Motorola,DROID RAZR 4G,Android,Android,"Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; DROID RAZR 4G Build/6.5.1-73_DHD-11_M1-29) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","android, webkit","DetectAndroid(), DetectAndroidPhone(), DetectAndroidWebKit(), DetectWebKit()",Medium,A popular Android device on Verizon. ,USA,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=motorola_droid_razr_ver1
+tablet,Motorola,Xoom,Android,Android,"Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build/HWI69) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",android,"DetectAndroid(), DetectAndroidTablet(), DetectAndroidWebKit(), DetectWebKit()",High,Launched with Android 3.0 (Honeycomb). The string varied slightly by culture/language and build.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+phone,Motorola,Moto X (2013),Android,Firefox,mozilla/5.0 (android; mobile; rv:37.0) gecko/37.0 firefox/37.0,"android, mobile","DetectAndroid(), DetectAndroidPhone()",Medium,,International,Through direct testing in May 2015. 
+phone,Motorola,Moto X (2013),Android,Opera,"mozilla/5.0 (linux; android 4.4.4; xt1053 build/kxa21.12-l1.29.1) applewebkit/537.36 (khtml, like gecko) chrome/42.0.2311.107 mobile safari/537.36 opr/29.0.1809.92117","android, mobile, webkit","DetectAndroid(), DetectAndroidPhone(), DetectWebKit()",Medium,"The new WebKit-based browser is more capable, so we don't count it as Opera Mobile.",International,Through direct testing in May 2015. 
+phone,Motorola,Moto X (2013),Android,Opera Mini,opera/9.80 (android; opera mini/8.0.1807/36.1955; u; en) presto/2.12.423 version/12.16,"opera, mini","DetectOperaMobile(), DetectAndroid(), DetectMobileQuick()",Medium,"No token for ""mobile."" ",International,Through direct testing in May 2015. 
+mobile,Samsung,Galaxy S 3,Android,Android,"mozilla/5.0 (linux; u; android 4.0.4; en-us; gt-i9300 build/imm76d) applewebkit/534.30 (khtml, like gecko) version/4.0 mobile safari/534.30","Android, mobile, webkit","DetectAndroid(), DetectAndroidPhone(), DetectAndroidWebKit(), DetectWebKit()",High,Samsung's 2012 flagship Android device. Sold worldwide.,International,
+tablet,Sony,Tablet P,Android,Android,"Mozilla/5.0 (Linux; U; Android 3.2; de-de; Sony Tablet P Build/THMD01900) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",android,"DetectAndroid(), DetectAndroidTablet(), DetectAndroidWebKit(), DetectWebKit()",High,A dual-screen Android tablet.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+tablet,Sony,Tablet S,Android,Android,"Mozilla/5.0 (Linux; U; Android 3.2; en-gb; Sony Tablet S Build/THMD01900) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",android,"DetectAndroid(), DetectAndroidTablet(), DetectAndroidWebKit(), DetectWebKit()",High,"A 9.4"" Android tablet.",International,http://www.zytrax.com/tech/web/mobile_ids.html
+tablet,Toshiba,AT100-100,Android,Android,"Mozilla/5.0 (Linux; U; Android 3.1; de-de; AT100 Build/HMJ37) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",Android,"DetectAndroid(), DetectAndroidTablet(), DetectAndroidWebKit(), DetectWebKit()",High,"A 10.1"" Android tablet",International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Samsung,GT-S5253,Bada,Dolfin,SAMSUNG-GT-S5253/1.0 Bada/1.0 AppleWebKit/533.1 Dolfin/2.0 Mobile NexPlayer/3.0 SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1 OPN-B,"bada, mobile, midp, webkit","DetectBada(), DetectWebKit(), DetectMidpCapable()",Low,Bada is Samsung's proprietary Linux-based smartphone OS for non-USA markets. The Dolfin browser is quite good. This device is in the Bada 1.0 series.,International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=samsung_gt_s5253_ver1
+mobile,BlackBerry,9380 Curve Touch,BlackBerry,BlackBerry,"BlackBerry; U; BlackBerry 9380; xx-xx) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.557 Mobile Safari/534.11+",blackberry 938,"DetectBlackBerry(), DetectBlackBerryTouch(), DetectBlackWebKit()",Low,"A touchscreen device for international markets with a large, iPhone-like screen.",International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=blackberry9380_ver1
+mobile,BlackBerry,Porsche Design P’9981,BlackBerry,BlackBerry,"BlackBerry; U; BlackBerry 9981; xx-xx) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.579 Mobile Safari/534.11+","blackberry, webkit","DetectBlackBerry(), DetectBlackBerryTouch(), DetectBlackWebKit()",Low,This device is in the Bold Touch series. ,International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=blackberry9981_ver1
+mobile,BlackBerry,Style 9670,BlackBerry,BlackBerry,"BlackBerry; U; BlackBerry 9670; xx-xx) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.226 Mobile Safari/534.1+","blackberry, webkit","DetectBlackBerry(), DetectBlackWebKit()",Low,The device was launched on Sprint in late 2010.,USA,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=blackberry_9670_ver1
+mobile ,BlackBerry,Tour 9630,BlackBerry,BlackBerry,BlackBerry9630/4.7.1.40 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/126,blackberry96,"DetectBlackBerry(), DetectBlackHigh()",Low,"This device had a browser which could display CSS reasonably well, but didn't have much JS skills. High profile in late 2008.",International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=blackberry9630_ver1
+mobile,BlackBerry ,Bold (multiple models),BlackBerry,BlackBerry,BlackBerry9700/5.0.0.207 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/175,blackberry97,"DetectBlackBerry(), DetectBlackHigh()",Medium,"The Bold line is one of RIM's most popular models, with many variants. Note that touchscreen versions of the bold also register like this (as a non-touch device) due to the small screen. iPhone-style UIs would not work well.",International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=blackberry9700_ver1
+mobile,BlackBerry,Curve 2 8900,BlackBerry ,BlackBerry,BlackBerry8900/4.6.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/100,blackberry89,"DetectBlackBerry(), DetectBlackHigh()",Low,The device was high profile in the US esp. in 2008.,International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=blackberry8900_ver1
+mobile,BlackBerry,BB10 Developer Phone,BlackBerry 10,BlackBerry,"Mozilla/5.0 (BB10; touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.388 Mobile Safari/537.3+","bb10, webkit","DetectBlackBerry(), DetectBlackBerry10Phone(), DetectWebKit(), DetectIphoneTier(), DetectSmartphone()",Low,This is a test phone. The real devices going on sale will be High Priority.,International,http://devblog.blackberry.com/2012/08/blackberry-10-user-agent-string/
+mobile,BlackBerry,Pearl (8100),BlackBerry 4.2,BlackBerry,BlackBerry8100/4.5.0.108 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/214,blackberry,"DetectBlackBerry(), DetectBlackBerryLow()",Low,The first consumer-oriented BlackBerry device. Was a hit seller.,International,http://www.mobilerated.com/rim-blackberry-8100-pearl-specifications.html
+mobile,BlackBerry,Storm 2,BlackBerry OS,BlackBerry,BlackBerry9550/5.0.0.320 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/105,blackberry95,"DetectBlackBerry(), DetectBlackBerryTouch(), DetectBlackBerryHigh()",High,"Lead the flagship all-touch line of devices, esp. Verizon, Nov. 2009.",USA & International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=blackberry9550_ver1
+mobile,BlackBerry,Torch (9800),BlackBerry OS,BlackBerry,"BlackBerry; U; BlackBerry 9800; xx-xx) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.135 Mobile Safari/534.1+",blackberry 98,"DetectBlackBerry(), DetectBlackBerryTouch(), DetectBlackWebKit()",High,Lead the touch BlackBerry device line at AT&T.,USA & International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=blackberry9800_ver1
+mobile,BlackBerry,Playbook,BlackBerry OS (QNX),BlackBerry,"Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+'",playbook,DetectBlackBerryTablet(),Medium,RIM's flagship tablet.,USA & International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=rim_playbook_android_ver1
+mobile,HTC,Freestyle (F5151),Brew,Obigo,"HTC-F5151/1.0 Mozilla/5.0 (BMP; U; en) AppleWebKit/530.8 (KHTML, like Gecko) OBIGO/W10 Safari/530.8",obigo,"DetectWebKit() , DetectMobileQuick()",Low,"This device is listed because it's a small but modern touchscreen feature phone. The modern Obigo W10 browser is based on WebKit, so it more capable than legacy Teleca or Obigo browsers.",International,http://developer.att.com/developer/device_detailSpec.jsp?id=6.3_v1_10800390
+mobile,Pantech,Link II ,Brew,Netfront,PantechP5000/JTUS06272011 BMP/1.0.2 DeviceId/141025 NetFront/4.1 OMC/1.5.3 Profile/MIDP-2.1 Configuration/CLDC-1.1,"midp, netfront","DetectMobileQuick(), DetectMidpCapable()",Low,"A feature phone on AT&T in 2012. Available worldwide, too. ",International,
+desktop,Apple,Mac,Desktop,Safari,"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/ 3.1.2 Safari/525.20.1",n/a,Unsupported,High,"A desktop or laptop running Mac OS. As with all ""desktop"" devices, should not be detected by MobileESP.",International,http://www.zytrax.com/tech/web/mobile_ids.html
+game,Nintendo,3DS,Embedded,Opera,Mozilla/5.0 (Nintendo 3DS; U; ; de) Version/1.7455.EU,nintendo,"DetectNintendo(), DetectGameConsole()",Low,Anonther Nintendo handheld gaming device.,International,http://www.botsvsbrowsers.com/details/747492/index.html
+game,Nintendo,DS,Embedded,Opera,Opera/9.00 (Nintendo DS; U; ; 1309-9; en),nintendo,"DetectNintendo(), DetectGameConsole()",Medium,There are tons of useragents for the Nintendo DS. This appears to be a reasonable choice for tracking. ,International,http://www.botsvsbrowsers.com/details/341766/index.html
+game,Nintendo,DSi,Embedded,Opera,Nintendo DSi; Opera Mini/5.1.21965/20.2513; U; en,"nintendo, opera mini","DetectNintendo(), DetectGameConsole(), DetectOperaMobile()",Low,Anonther Nintendo handheld gaming device.,International,http://www.botsvsbrowsers.com/details/728961/index.html
+game,Nintendo,Wii,Embedded,Opera,Opera/9.30 (Nintendo Wii; U; ; 2047-7; en),"nintendo, wii","DetectNintendo(), DetectGameConsole()",Medium,"Not high priority, but it is currently supported. Technically, this belongs in a TV Tier.",International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Cricket,A410,Feature Phone,Brew,Cricket-A410/1.0 Polaris/v6.17,n/a,Unsupported,Low - LMI,This Brew device was launched on the Cricket network in the US. Little is known about device. ,USA,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Danger,Hiptop,Feature Phone,Danger,Mozilla/5.0 (Danger hiptop 3.4; U; AvantGo 3.2),danger hiptop,DetectDangerHiptop(),Low,A popular feature phone around 2006.,USA,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,LG,enV3 (VX9200),Feature Phone,Teleca,Mozilla/5.0 (compatible; Teleca Q7; Brew 3.1.5; U; xx-xx) 320X240 LGE VX9200,"brew, teleca q","DetectMobileQuick(), DetectBrew(), DetectRichCss()",Low,"A popular feature phone, esp. on Verizon.",USA & International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=lg_vx9200_ver1
+mobile,LG,Chocolate (KG-800),Feature Phone,Teleca-Obigo,LG-KG800/V10e Obigo/WAP2.0 MIDP-2.0/CLDC-1.1,midp,DetectMidpCapable(),Low,A popular feature phone worldwide around 2008.,International,http://www.mobile-phone-specs.com/model/lg_kg800_ver1/
+mobile,Motorla,RAZR2 V9m,Feature Phone,Up,MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0,up.browser,DetectMobileQuick(),Low,One of many devices using the Up Browser. ,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Samsung,A737,Feature Phone,Brew,Mozilla/4.1 (U; BREW 3.1.5; en-US; Teleca/Q05A/INT),brew,DetectBrewDevice(),Medium,Should test positive for being a Brew device. It might work with a real phone due to the Accept properties (WML). Failed on 3/25/12.,USA,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Samsung,SPH-A620 VGA1000,Feature Phone,Obigo,Mozilla/4.0 (compatible; MSIE 6.0; j2me) ReqwirelessWeb/3.5,n/a,Unsupported,L - LMI,Not worth the effort to add support for this one obsolete device. Sold at Sprint.,USA,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Siemens,S55,Feature Phone,Embedded,ReqwirelessWeb/3.2 S55,n/a,Unsupported,L - LMP-D,A very old feature phone with a very small screen.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Various,Various,Feature Phones,Opera Mini,Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13221/25.623; U; en) Presto/2.5.25 Version/10.54,opera mini,DetectOperaMobile(),Medium,"Thought to be installed on various feature phones, including BlackBerries.",International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Various,Various,Feature Phones,Opera Mini,Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/19.916; U; en) Presto/2.5.25,opera mini,DetectOperaMobile(),Medium,Thought to be installed on various feature phones.,International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Various,Various,Feature Phones,Opera Mini,Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.16823/1428; U; en) Presto/2.2.0,opera mini,DetectOperaMobile(),Medium,Thought to be installed on various feature phones.,International,http://www.zytrax.com/tech/web/browser_ids.htm
+TV,Amazon,Fire TV,Fire OS,WebView,"Mozilla/5.0 (Linux; Android 4.2.2; AFTB Build/JDQ39) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.173 Mobile Safari/537.22 cordova-amazon-fireos/3.4.0 AmazonWebAppPlatform/3.4.0;2.0",amazonwebappplatform,"DetectFireTV()
+DetectSmartTV()",Low,"Amazon's Fire TV doesn't have a standalone browser. Instead, apps can use a WebView to display HTML content. ",International,https://developer.amazon.com/public/solutions/devices/fire-tv/docs/user-agent-strings
+mobile,Various,Various,Firefox OS,Firefox,Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0,"firefox, mobile","DetectFirefoxOS(),  DetectFirefoxOSPhone(), DetectTierIphone(), DetectSmartphone(), DetectMobileQuick()",Low,Potential new up and coming mobile OS. Need to exclude Android and iOS from check to disambiguate. ,International,https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference
+tablet,Various,Various,Firefox OS,Firefox,Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0,"firefox, tablet","DetectFirefoxOS(),  DetectFirefoxOSTablet()",Low,Potential new up and coming mobile OS. ,International,https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference
+tablet,Apple,iPad,iOS,Maxthon,"mozilla/5.0 (ipad; cpu os 7_0_2 llike mac os x) applewebkit/537.51.1 (khtml, like gecko) mobile/11a501a ","ipad, mobile, webkit","DetectTierTablet(), DetectWebkit(), DetectIpad(), DetectIos()",High,A popular browser in China now available worldwide. The Maxthon browser is available on iOS and Android devices. ,International,Screenshot from an iPad in October 2013.
+tablet,Apple,iPad,iOS,Opera Coast,"Mozilla/5.0 (iPad; CPU OS 7_0_6 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Coast/2.0.5.71150 Mobile/11B651 Safari/7534.48.3","ipad, webkit","DetectTierTablet(), DetectWebkit(), DetectIpad(), DetectIos()",Low,"Because Opera Coast uses WebKit and tags the agent with ""iPad"", it will detect as if it's the default Apple browser. Opera Coast's iPhone browser similarly detects as iPhone. ",International,https://udger.com/resources/ua-list/browser-detail?browser=Coast
+phone,Apple,iPhone,iOS,Opera Mini,"mozilla/5.0 (iphone; cpu iphone os 8_3 like mac os x) applewebkit/600.1.4 (khtml, like gecko) opios/10.0.1.90729 mobile/12f70 safari/9537.53","iphone, webkit","DetectIphone(), DetectIphoneOrIpod(), DetectIos(), DetectWebKit()",Low,"Because Opera Mini now has iPhone and WebKit tokens in the browser, it will be detected the same as the iPhone's native browser. ",International,Through direct testing in May 2015. 
+mobile,Apple,iPhone,iOS,Safari Mobile,"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7","iphone, webkit","DetectIphone(), DetectIphoneOrIpod(), DetectIos(), DetectWebKit()",High,iOS v 4 on iPhone,International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Apple,"iPod Touch 
+(Generation: Fall 2012)",iOS,Safari Mobile,"mozilla/5.0 (ipod; cpu iphone os 6_0 like mac os x) applewebkit/536.26 (khtml, like gecko) version/6.0 mobile/10a406 safari/8536.25","ipod, iphone, webkit","DetectIpod(), DetectIphoneOrIpod(), DetectIos(), DetectWebKit()",High,iOS v 6 on iPod Touch (Device launched Fall 2012),International,"UA string captured on a device in the Apple store, Oct. 2012."
+tablet,Apple,iPad,iOS,Safari Mobile,"Mozilla/5.0 (iPad; U; CPU OS 4_3_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5","ipad, webkit","DetectIpad(), DetectWebKit()",High,The Apple iPad running iOS version 4.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Apple,iPod Touch,iOS ,Safari Mobile,"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7","ipod, iphone, webkit","DetectIpod(), DetectIphoneOrIpod(), DetectIos(), DetectWebKit()",High,iOS v 4 on iPod Touch,International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Amazon,Kindle ,Kindle,Kindle (Monochrome),"Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600×800; rotate)","kindle, webkit","DetectKindle(), DetectWebKit()",High,For the eInk monochrome devices only. ,International,http://www.labnol.org/software/kindle-user-agent-string/20378/
+mobile,Archos,605 WiFi,Linux,Opera,opera/9.02 (linux armv5tejl; u; archos; gogi; a605; en),archos,"DetectArchos(), DetectMobileQuick(), DetectTierOtherPhones()",n/a,An older 4.3 inch video & music player with an embedded browser. Released about 2007. ,International,"Screenshot from a friend who owns the device. Info & specs: 
+http://www.mobiletechreview.com/mediaplayers/Archos-605-wifi.htm"
+mobile,Archos,7 Internet Media Tablet,Linux,Opera,opera/9.02 (linux armv71; u; archos; gogi; g61; version 1.7.22 (wmdrmpd: 10.1) ; en),archos,"DetectArchos(), DetectMobileQuick(), DetectTierOtherPhones()",n/a,An older 7 inch portable video & music player with an embedded browser. Released about 2009. ,International,"Screenshot from a friend who owns the device. Info & specs: 
+http://www.mobiletechreview.com/mediaplayers/Archos-7.htm"
+mobile,Garmin ,Nüvifone G60,Linux,WebKit-based,"Mozilla/5.0 (Linux; U; arm; xx-xx, Nuvifone) AppleWebKit/523.13 (KHTML, like Gecko) Version/3.0 Mobile Safari/419.3 Qt Qtopia Iris/1.1.2","mobile, webkit","DetectGarminNuvifone(), DetectTierRichCss()",Low,"Because of its capable WebKit-based browser, this device was singled out for addition to the code. Released to AT&T in late 2009. Other Garmin phones based on Android ought to self-report as Android devices.",USA,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=garmin_nuviphone_ver1
+mobile,Sony,Mylo COM 1,Linux,Opera,Opera/8.02 (Qt embedded; Linux armv4ll; U) [ja] SONY/COM1,sony/com,"DetectSonyMylo(), DetectMobileLong()",Low,A poorly selling Internet tablet around 2007.,,http://www.osnews.com/thread?186230
+mobile,Sony,Mylo COM 2,Linux,Unknown (Netfront?),"Mozilla/5.0 (Linux, Sony/COM2/1.01 [en]; like Gecko/2007) Firefox/2",sony/com,"DetectSonyMylo(), DetectMobileLong()",Low,A poorly selling Internet tablet around 2007.,International,http://www.myuseragentstring.com/useragents/sony/sony_mylo_ver1/
+mobile,Nokia,N800,Maemo,Fennec (Mobile Firefox),Mozilla/5.0 (X11; U; Linux armv61; en-US; rv:1.9.1b2pre) Gecko/20081015 Fennec/1.0a1,n/a,Unsupported,Low - LMP-B,"Fennec was a beta on Maemo, more of an experiment.",International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Nokia,N800,Maemo,Firefox,Mozilla/5.0 (X11; U; Linux armv6l; en-US; rv:1.9a6pre) Gecko/20070810 Firefox/3.0a1 Tablet browser 0.1.16 RX-34_2007SE_4.2007.38-2,"linux, tablet",DetectMaemoTablet(),Low,"On the Nokia N800, may have been the default browser.",International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Nokia,N900,Maemo,Firefox,Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2b6pre) Gecko/20100318 Firefox/3.5 Maemo Browser 1.7.4.7 RX-51 N900,maemo,DetectMaemoTablet(),Low,"Nokia's only Maemo phone. It was high visibility around 2010. Although the browser was decently capable, it's not worth putting in exception code to move it to the RichCSS Tier.",International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Nokia,N800,Maemo,Links,Links (2.1pre31; Linux 2.6.21-omap1 armv6l; x),n/a,Unsupported,L - LMP-B,UA for the Links browser for Nokia's Maemo platform.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Nokia,N800,Maemo,Midori,"Mozilla/5.0 (X11; U; Linux armv6l; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori",n/a,Unsupported,L - LMP-B,UA for the Midori browser for Maemo. Midori was released on a few other small devices. (Wikipedia),International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Nokia,N800,Maemo,Minimo,Mozilla/5.0 (X11; U; Linux armv6l; rv 1.8.1.5pre) Gecko/20070619 Minimo/0.020,n/a,Unsupported,Low - LMP-B,This was basically an experimental version of Firefox that was only minimally released for the Nokia N800. Predates Fennec.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Nokia,N800,Maemo,Prism,Mozilla/5.0 (X11; U; Linux armv6l; en-US; rv: 1.9.1a2pre) Gecko/20080813221937 Prism/0.9.1,n/a,Unsupported,L - LMP-B,UA for the Links browser for Nokia's Maemo platform.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Nokia,N800,Maemo,Tear,"Mozilla/5.0 (X11; U; Linux armv6l; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) tear",n/a,Unsupported,L - LMP-B,Beta for the Tear browser for Nokia's Maemo platform.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Nokia,"N9 
+N950",Meego,Meego (Nokia),"Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13","meego, webkit, mobile","DetectMeego(), DetectMobileQuick(), DetectWebkit(), DetectTierRichCss()",Low,A device with limited sales and a deadend mobile OS. Both this device and the Nokia N950 shared the same useragent string. ,International,http://www.developer.nokia.com/Resources/Library/Web/#!nokia-browsers/nokia-browser-85-for-meego-12-harmattan/user-agent.html
+mobile,Nokia,"N9 
+N950",Meego,Opera,Opera/9.80 (Linux armv7l; Opera Mobi/1; MeeGo) Presto/2.11.355 Version/12.10,"meego, webkit, mobile","DetectMeego(), DetectMobileQuick(), DetectWebkit(), DetectTierRichCss()",Low,A device with limited sales and a deadend mobile OS. Both this device and the Nokia N950 shared the same useragent string. ,International,http://www.developer.nokia.com/Resources/Library/Web/#!nokia-browsers/nokia-browser-85-for-meego-12-harmattan/user-agent.html
+mobile,Various,Various,Mobile Devices,Bolt,"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; BOLT/2.800) AppleWebKit/534.6 (KHTML, like Gecko) Version/5.0 Safari/534.6.3",n/a,Unsupported,Low - LMP-B,The Bolt mobile browser. Not sure if this is a generic UA for installed devices or also when white labeled.,International,http://www.zytrax.com/tech/web/mobile_ids.html#bolt
+mobile,Palm,Centro,PalmOS,Blazer,Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Palmsource/Palm-D062; Blazer/4.5) 16;320X320,palm,DetectPalmWebOS(),Low,"Released in late 2007, this was the last significant PalmOS consumer device. It was a popular device in 2008. ",USA,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=palm_centro_ver1
+mobile,Palm,Various,PalmOS,Skysurf,Mozilla/4.74 [en] (X11; I; ProxiNet),n/a,Unsupported,L - LMP-B,"An archaic browser on a dead platform: ""Zero Grvaity's Skysurf, running under PalmOS 3.0""",International,http://www.zytrax.com/tech/web/mobile_ids.html
+tablet,BlackBerry,PlayBook,PlayBook,PlayBook,"Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.7 Safari/534.11+",playbook,DetectBlackBerryTablet(),High,"The BlackBerry PlayBook tablet, launched 2011.",International,Sent by a MobileESP user based on his web site access logs
+mobile,Sony,Playstation,Playstation,Playstation,Mozilla/5.0 (PLAYSTATION 3; 1.00),playstation,"DetectSonyPlaystation(), DetectGameConsole()",Medium,A Sony Playstation gaming console.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Sony,Playstation,Playstation,Playstation,"Mozilla/5.0 (PLAYSTATION 3 4.11) AppleWebKit/531.22.8 (KHTML, like Gecko)",playstation,"DetectSonyPlaystation(), DetectGameConsole(), DetectWebKit()",Low,Another version of a useragent for Sony Playstation gaming console.,International,http://www.hvz.baden-wuerttemberg.de/analysehvz/agent_201203.html
+mobile,Sony,Playstation Portable,Playstation,Playstation,Mozilla/4.0 (PSP (PlayStation Portable); 2.00),playstation,"DetectSonyPlaystation(), DetectGameConsole()",Low,A handheld gaming console.,International,http://www.hvz.baden-wuerttemberg.de/analysehvz/agent_201203.html
+mobile,Sony,Playstation Vita,Playstation,Playstation (Webkit),"Mozilla/5.0 (Playstation Vita 2.02) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2","playstation, webkit","DetectSonyPlaystation(), DetectWebKit(), DetectGameConsole(), DetectPlayStationHandheld(), DetectTierIphone()",Medium,A handheld gaming console with an iPhone-class browser.,International,http://community.eu.playstation.com/t5/PS-Vita-General-Discussion/PS-vita-web-browser-a-few-details/td-p/14477729
+mobile,bSquare,bSquare,PocketPC,MS IE Mobile,Mozilla/4.0 (compatible; MSIE 5.5; Windows NT) (compatible; MSIE 5.5; Windows NT),n/a,Unsupported,Low - LMP - D,bSquare never sold their devices to consumers under their own label. This was the UA on reference hardware during early testing. ,None,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,HTC,Touch Pro,PocketPC,MS IE Mobile,XV6850 Opera/9.50 (Windows NT 5.1; U; en),n/a,Unsupported,Low - LMI,Not worth the effort to add support for this one obsolete device. The only unique element is the device ID (XV6850).,USA,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Sharp,Zarus SL-C750,PocketPC,MS IE Mobile,Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.18-rmk7-pxa3-embedix armv5tel; 480x640) Opera 6.0 [en],n/a,Unsupported,L - LMI,An old PocketPC-based Zarus PDA. May have been marketed outside of Japan.,Japan,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Various,Various,PocketPC,MS IE Mobile,Mozilla/2.0 (compatible; MSIE 3.02; Windows CE; 240x320),windows ce,DetectWindowsMobile(),Low - OD,,International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Various,Various,PocketPC,Opera Mobile,Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 480x640) Opera 8.60 [en],"opera, windows ce","DetectOperaMobile(), DetectWindowsMobile()",Medium,Opera Mobile on Windows PocketPC devices.,International,http://www.zytrax.com/tech/web/browser_ids.htm
+TV,ROku,various,Roku,WebView,Roku/DVP-5.2 (025.02E03197A),roku,"DetectRokuTV()
+DetectSmartTV()",Low,"Roku doesn't have a standalone browser. Instead, apps can use a WebView to display HTML content. ",International,https://udger.com/resources/ua-list/device-detail?device=Smart+TV
+mobile,Nokia,Nokia X3-02,S40,WAP Browser,Mozilla/5.0 (Series40; NokiaX3-02/06.00; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/1.5.0.34.11,midp,DetectMobileQuick(),Medium,"Nokia still sells tons of S40-based feature phones around the world. Especially in developing countries, these devices are often used for accessing web sites. ",International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Jolla,Various,Sailfish,SailfishBrowser,Mozilla/5.0 (Maemo; Linux; U; Jolla; Sailfish; Mobile; rv:31.0) Gecko/31.0 Firefox/31.0 SailfishBrowser/1.0,"sailfish, mobile","DetectSailfish(),  DetectSailfishPhone(), DetectTierIphone(), DetectSmartphone(), DetectMobileQuick()",Low,Potential new up and coming mobile OS.,International,https://together.jolla.com/question/81498/webservice-request-from-android-app-seems-to-be-overridden-with-user-agent-string-phandroidappl/
+tablet,Jolla,Various,Sailfish,SailfishBrowser,None available yet,TBD,TBD,Low,Potential new up and coming mobile OS. This Tablet method is speculative right now pending confirmation of useragent. ,International,
+mobile,Nokia,Various,Symbian,Opera Mobile,Opera/9.80 (S60; SymbOS; Opera Mobi/499; U; ru) Presto/2.4.18 Version/10.00,"opera mobi, symbos","DetectOperaMobile(), DetectSymbianOS()",Medium,Opera Mobile 10.0 running on Nokia Symbian S60 devices.,International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Nokia,Nokia 5800 XpressMusic,Symbian,OSS Browser,"Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Nokia5800d-1/21.0.025; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413","symbian, series60, webkit","DetectS60OssBrowser()
+DetectSymbianOS(), DetectWebKit(), DetectTierRichCss()",Low,The OSS WebKit browser shipping on the new touch-based Nokia 5800 running S60 5th Edition.,International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Nokia,Nokia 701 (Belle Refresh),Symbian,OSS Browser,"Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia701/111.020.0307; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.1.14 Mobile Safari/533.4 3gpp-gba","symbian, series60, webkit","DetectS60OssBrowser()
+DetectSymbianOS(), DetectWebKit(), DetectTierRichCss()",Medium,"The OSS WebKit browser shipping on the 2010 Nokia 701 running Symbian^3 (the open sourced version of Symbian). ""Belle"" OS update.",International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Nokia,Nokia N8 (Anna Refresh),Symbian,OSS Browser,"Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/012.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.0 Mobile Safari/533.4 3gpp-gba","symbian, series60, webkit","DetectS60OssBrowser()
+DetectSymbianOS(), DetectWebKit(), DetectTierRichCss()",Medium,"The OSS WebKit browser shipping on the 2010 flagship Nokia N8 running Symbian^3 (the open sourced version of Symbian). ""Anna"" OS update.",International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Nokia,S60 r3 Newer Devices,Symbian,OSS Browser,"Mozilla/5.0 (SymbianOS/9.1; U; [en]; Series60/3.0 NokiaE60/4.06.0) AppleWebKit/413 (KHTML, like Gecko) Safari/413","symbian, series60","DetectS60OssBrowser()
+DetectSymbianOS(), DetectTierRichCss()",Low,"The ""new"" WebKit-based Open Source browser on later batches of Symbian r3 devices. 2006-07 era, probably. ",International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Nokia,S60 r3 Older Devices,Symbian,OSS Browser,"Mozilla/5.0 (SymbianOS/9.1; U; [en-us]) AppleWebKit/413 (KHTML, like Gecko) Safari/413",symbian,"DetectS60OssBrowser()
+DetectSymbianOS(), DetectTierRichCss()",Low,"The ""new"" WebKit-based Open Source browser on the first batch or so of Symbian r3 devices. 2006-07 era, probably. ",International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Nokia,Nokia N73 (S60 r3),Symbian,S60 WAP Browser,NokiaN73-2/3.0-630.0.2 Series60/3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1,symbian,DetectSymbianOS(),Low,This was for the original proprietary S60 WAP browser that was NOT based on WebKit. It shipped on many devices simultaneously with the newer OSS browser in S60 r3 before finally being killed. ,International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Various,Various,Symbian,Opera Mini,Opera/9.80 (Series 60; Opera Mini/6.1.26266/26.1069; U; en) Presto/2.8.119 Version/10.54,opera mini,DetectOperaMobile(),Medium,Version of Opera Mini for such Symbian devices as the Nokia E63.,International,http://www.handsetdetection.com/properties/tags/Nokia/E63/Opera%20Mini/6.1.26266
+mobile,Sony Ericsson,W960i,Symbian UIQ,Opera Mobile,SonyEricssonW960i/R100 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; 701) Opera 8.65 [de],symbian,DetectSymbianOS(),Low,A poorly selling (but great) UIQ phone. One of Sony Ericsson's last UIQ devices.,International,http://www.mobile-phone-specs.com/model/sonyericsson_w960i_ver1/
+mobile,Samsung,TBD,Tizen,Tizen,"Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-i9500/1.0; U; Tizen/1.0 like Android; en-us) AppleWebKit/534.46 (KHTML, like Gecko) SLP Browser/1.0 Mobile","tizen, mobile, webkit","DetectTizen(),
+DetectWebKit(),
+DetectTierIphone(), DetectSmartphone()",Low,Tizen is a new Linux-based smartphone platform being launched by Samsung and Intel. Browser capabilities are expected to be at least as good as Android's. ,International,"From a MobileESP community member, December 2012"
+TV,Samsung,Various,Tizen TV,Browser,"Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1","tizen, smart-tv",DetectTizenTV(),Low,Samsung is committed to Tizen for its smart TV platform. ,International,http://developer.samsung.com/technical-doc/view.do?v=T000000203
+mobile,Various,Various,Ubuntu Mobile,Browser,Mozilla/5.0 (Linux; Ubuntu 14.04 like Android 4.4) AppleWebKit/537.36 Chromium/35.0.1870.2 Mobile Safari/537.36,"ubuntu, mobile","DetectUbuntu(),  DetectUbuntuPhone(), DetectTierIphone(), DetectSmartphone(), DetectMobileQuick(), DetectWebkit()",Low,Potential new up and coming mobile OS.,International,https://plus.google.com/+SimosXenitellis/posts/hfnnDpgFEZA
+tablet,Various,Various,Ubuntu Mobile,Browser,None available yet,"ubuntu, tablet","DetectUbuntu(),  DetectUbuntuTablet(), DetectTierTablet()",Low,Potential new up and coming mobile OS. This Tablet method is speculative right now pending confirmation of useragent. ,International,http://daker.me/2013/11/ubuntu-touch-user-agent.html
+tablet,HP,TouchPad,WebOS,WebOS,"Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.2; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.40.1 Safari/534.6 TouchPad/1.0",hpwos,DetectWebOSTablet(),High,HP WebOS-based TouchPad tablet,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Palm,Pre,WebOS,WebOS (WebKit-based),"Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0",webos,DetectPalmWebOS(),Medium,The Palm Pre was the first WebOS device.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+TV,LG,Various,WebOS TV,Browser,"Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/538.2 (KHTML, like Gecko) Large Screen WebAppManager Safari/538.2","webos, smarttv",DetectWebOSTV(),Low,LG is committed to WebOS for its smart TV platform. ,International,http://developer.lge.com/webOSTV/develop/web-app/webos-tv-platform/web-engine
+desktop,Acer,Iconia W500,Windows,Internet Explorer,Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; MAAR; .NET4.0C),n/a,FALSE,High,"A tablet PC device probably launched with Windows 7. As with all ""desktop"" devices, should not be detected by MobileESP.",International,http://www.zytrax.com/tech/web/mobile_ids.html
+game,Microsoft ,Xbox,Windows,Internet Explorer,Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) xbox Gecko/20100101 Firefox/6.0.2,xbox,"DetectXbox(), DetectGameConsole()",Medium,A popular gaming console.,International,http://www.botsvsbrowsers.com/details/731405/index.html
+mobile,Various,Various,Windows CE,Minimo,Mozilla/5.0 (Windows; U; Windows CE 5.1; rv:1.8.1a3) Gecko/20060610 Minimo/0.016,windows ce,"Unsupported
+(Reports true for DetectWindowsMobile())",Low - LMP-B,This was basically an experimental version of Firefox that was only minimally released for WinCE PDAs. Predates Fennec.,International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,Various,Various,Windows CE,Opera Mobile,Opera/9.80 (Windows Mobile; WCE; Opera Mobi/WMD-50433; U; en) Presto/2.4.13 Version/10.00,opera,DetectOperaMobile(),Medium,Opera Mobile 10.0 running on Windows Mobile.,International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Various,Various,"Windows CE
+(PocketPC ?)",MS IE Mobile,Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11),"windows ce, iemobile",DetectWindowsMobile(),Low - OD,Such as Palm-branded PocketPC devices and the HTC Touch.,International,http://www.zytrax.com/tech/web/browser_ids.htm
+mobile,Dell,Venue Pro,Windows Phone,MS IE Mobile,Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro),windows phone os 7,DetectWindowsPhone7(),High,"Dell Venue Pro, a Windows Phone 7 device",International,http://www.zytrax.com/tech/web/mobile_ids.html
+mobile,HTC,8x,Windows Phone,Internet Explorer,Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; HTC; 0002),windows phone 8,"DetectWindowsPhone8(), DetectTierIphone(), DetectSmartphone()",High,HTC's flagship WP8 device for late 2012 and going into 2013.,USA & International,http://developer.att.com/developer/device_detailSpec.jsp?id=12600013
+mobile,Nokia,Lumia 900,Windows Phone,Internet Explorer,Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 900),windows phone os 7,"DetectWindowsPhone7(), DetectTierIphone(), DetectSmartphone()",High,Nokia's flagship WP7 device for 2012.,USA & International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Nokia,Lumia 920,Windows Phone,Internet Explorer,Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920),windows phone 8,"DetectWindowsPhone8(), DetectTierIphone(), DetectSmartphone()",High,Nokia's flagship WP8 device for late 2012 and going into 2013.,USA & International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Nokia,Lumia 800,Windows Phone ,Internet Explorer,"Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)
+",windows phone os 7,"DetectWindowsPhone7(), DetectTierIphone(), DetectSmartphone()",Medium,"One of Nokia's first, best Windows Phone devices (2011).",International,http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
+mobile,Palm,Treo 800w,Windows PocketPC,Internet Explorer,"Treo800w/v0100 Mozilla/4.0 (compatible; MSIE 4.01; Windows CE, PPC; 320x320) (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",windows ce,DetectWindowsMobile(),Low,One of Palm's more successful Windows Mobile devices. Released in 2008.,International,http://www.tera-wurfl.com/explore/?action=wurfl_id&id=palm_treo800w_ver1
\ No newline at end of file
diff --git a/vendor/ahand/mobileesp/MobileESP_UA-Test-Strings/MobileESP UA Test Strings.xlsx b/vendor/ahand/mobileesp/MobileESP_UA-Test-Strings/MobileESP UA Test Strings.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..85067cec24e0a195a553987c3cfd1163ddb73689
Binary files /dev/null and b/vendor/ahand/mobileesp/MobileESP_UA-Test-Strings/MobileESP UA Test Strings.xlsx differ
diff --git a/vendor/mobileesp/mdetect/mdetect.php b/vendor/ahand/mobileesp/PHP/mdetect.php
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/mobileesp/mdetect/mdetect.php
rename to vendor/ahand/mobileesp/PHP/mdetect.php
diff --git a/vendor/ahand/mobileesp/Python/mdetect.py b/vendor/ahand/mobileesp/Python/mdetect.py
new file mode 100755
index 0000000000000000000000000000000000000000..fe8592ee8f57dc5235814315842e5bea69a23be4
--- /dev/null
+++ b/vendor/ahand/mobileesp/Python/mdetect.py
@@ -0,0 +1,1023 @@
+# *******************************************
+# Copyright 2010-2015, Anthony Hand
+#
+#
+# File version 2015.05.13 (May 13, 2015)
+# Updates:
+#	- Moved MobileESP to GitHub. https:#github.com/ahand/mobileesp
+#	- Opera Mobile/Mini browser has the same UA string on multiple platforms and doesn't differentiate phone vs. tablet. 
+#		- Removed DetectOperaAndroidPhone(). This method is no longer reliable. 
+#		- Removed DetectOperaAndroidTablet(). This method is no longer reliable. 
+#	- Added support for Windows Phone 10: variable and DetectWindowsPhone10()
+#	- Updated DetectWindowsPhone() to include WP10. 
+#	- Added support for Firefox OS.  
+#		- A variable plus DetectFirefoxOS(), DetectFirefoxOSPhone(), DetectFirefoxOSTablet()
+#		- NOTE: Firefox doesn't add UA tokens to definitively identify Firefox OS vs. their browsers on other mobile platforms.
+#	- Added support for Sailfish OS. Not enough info to add a tablet detection method at this time. 
+#		- A variable plus DetectSailfish(), DetectSailfishPhone()
+#	- Added support for Ubuntu Mobile OS. 
+#		- DetectUbuntu(), DetectUbuntuPhone(), DetectUbuntuTablet()
+#	- Added support for 2 smart TV OSes. They lack browsers but do have WebViews for use by HTML apps. 
+#		- One variable for Samsung Tizen TVs, plus DetectTizenTV()
+#		- One variable for LG WebOS TVs, plus DetectWebOSTV()
+#	- Added DetectTizen(). Tests for "mobile" to disambiguate from Samsung Smart TVs.
+#	- Removed variables for obsolete devices: deviceHtcFlyer, deviceXoom.
+#	- Updated DetectAndroid(). No longer has a special test case for the HTC Flyer tablet. 
+#	- Updated DetectAndroidPhone(). 
+#		- Updated internal detection code for Android. 
+#		- No longer has a special test case for the HTC Flyer tablet. 
+#		- Checks against DetectOperaMobile() on Android and reports here if relevant. 
+#	- Updated DetectAndroidTablet(). 
+#		- No longer has a special test case for the HTC Flyer tablet. 
+#		- Checks against DetectOperaMobile() on Android to exclude it from here.
+#	- DetectMeego(): Changed definition for this method. Now detects any Meego OS device, not just phones. 
+#	- DetectMeegoPhone(): NEW. For Meego phones. Ought to detect Opera browsers on Meego, as well.  
+#	- DetectTierIphone(): Added support for phones running Sailfish, Ubuntu and Firefox Mobile. 
+#	- DetectTierTablet(): Added support for tablets running Ubuntu and Firefox Mobile. 
+#	- DetectSmartphone(): Added support for Meego phones. 
+#	- Caught this library up to the PHP, JavaScript and Java versions. Updates include: 
+#		- Added support for Bada: a variable and DetectBada(). This detects any Bada OS device, but (almost) all are phones.
+#		- Refactored the Windows Phone delegate-related properties and features. Now fires for any Windows Phone, not just WP7. 
+#			- The event fires now when DetectWindowsPhone() is true. 
+#		- Added support for Windows Phone 8: DetectWindowsPhone8().
+#		- Updated DetectWindowsMobile(). Excludes any Windows Phone device, not just WP7. 
+#		- Added support for BlackBerry 10 OS phones: DetectBlackBerry10Phone().
+#		- Updated DetectSmartphone() to sync with the other libraries. 
+#		- Updated DetectTierIphone() to sync with the other libraries.
+#		- OnInit(EventArgs e): Fixed the user agent and httpaccept init logic.
+#	- Refactored the detection logic in DetectMobileQuick() and DetectMobileLong().
+#		- Moved a few detection tests for older browsers to Long. 
+#
+#
+#
+# File version date: Feburary 10, 2012
+#       Creation:
+#       - Cloned from http://code.google.com/p/mobileesp/source/browse/Java/UAgentInfo.java
+#                 and http://code.google.com/p/mobileesp/source/browse/PHP/mdetect.php
+# 		- Port to Python: Alexey Evseev (alexevseev@gmail.com)
+# 		- Made for www.irk.fm website
+#
+#
+#
+# LICENSE INFORMATION
+# 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. 
+#
+#
+# ABOUT THIS PROJECT
+#   Project Owner: Anthony Hand
+#   Email: anthony.hand@gmail.com
+#   Web Site: http://www.mobileesp.com
+#   Source Files: https://github.com/ahand/mobileesp
+#
+#   Versions of this code are available for:
+#      PHP, JavaScript, Java, ASP.NET (C#), Ruby and Python
+#
+# *******************************************
+
+
+class UAgentInfo(object):   
+    """The UAgentInfo class encapsulates information about
+    a browser's connection to your web site.
+    You can use it to find out whether the browser asking for
+    your site's content is probably running on a mobile device.
+    The methods were written so you can be as granular as you want.
+    For example, enquiring whether it's as specific as an iPod Touch or
+    as general as a smartphone class device.
+    The object's methods return true, or false.
+    """
+   
+    # Initialize some initial smartphone string variables.
+    engineWebKit = "webkit"
+    
+    deviceIphone = "iphone"
+    deviceIpod = "ipod"
+    deviceIpad = "ipad"
+    deviceMacPpc = "macintosh" #Used for disambiguation
+    
+    deviceAndroid = "android"
+    deviceGoogleTV = "googletv"
+    
+    deviceSymbian = "symbian"
+    deviceS60 = "series60"
+    deviceS70 = "series70"
+    deviceS80 = "series80"
+    deviceS90 = "series90"
+    
+    deviceWinPhone7 = "windows phone os 7"
+    deviceWinPhone8 = "windows phone 8"
+    deviceWinPhone10 = "windows phone 10"
+    deviceWinMob = "windows ce"
+    deviceWindows = "windows"
+    deviceIeMob = "iemobile"
+    devicePpc = "ppc" #Stands for PocketPC
+    enginePie = "wm5 pie" #An old Windows Mobile
+    
+    deviceBB = "blackberry"
+    deviceBB10 = "bb10" #For the new BB 10 OS
+    vndRIM = "vnd.rim" #Detectable when BB devices emulate IE or Firefox
+    deviceBBStorm = "blackberry95"  #Storm 1 and 2
+    deviceBBBold = "blackberry97"  #Bold 97x0 (non-touch)
+    deviceBBBoldTouch = "blackberry 99"  #Bold 99x0 (touchscreen)
+    deviceBBTour = "blackberry96"  #Tour
+    deviceBBCurve = "blackberry89"  #Curve 2
+    deviceBBCurveTouch = "blackberry 938"  #Curve Touch 9380
+    deviceBBTorch = "blackberry 98"  #Torch
+    deviceBBPlaybook = "playbook" #PlayBook tablet
+    
+    devicePalm = "palm"
+    deviceWebOS = "webos" #For Palm devices
+    deviceWebOStv = "web0s" #For LG TVs
+    deviceWebOShp = "hpwos" #For HP's line of WebOS devices
+    
+    engineBlazer = "blazer" #Old Palm
+    engineXiino = "xiino" #Another old Palm
+    
+    deviceKindle = "kindle"  #Amazon Kindle, eInk one
+    engineSilk = "silk"  #Amazon's accelerated Silk browser for Kindle Fire
+    
+    deviceNuvifone = "nuvifone"  #Garmin Nuvifone
+    deviceBada = "bada" #Samsung's Bada OS    
+    deviceTizen = "tizen" #Tizen OS    
+    deviceMeego = "meego" #Meego OS    
+    deviceSailfish = "sailfish" #Sailfish OS
+    deviceUbuntu = "ubuntu"  #Ubuntu Mobile OS
+    
+    #Initialize variables for mobile-specific content.
+    vndwap = "vnd.wap"
+    wml = "wml"
+    
+    #Initialize variables for other random devices and mobile browsers.
+    deviceTablet = "tablet" #Generic term for slate and tablet devices
+    deviceBrew = "brew"
+    deviceDanger = "danger"
+    deviceHiptop = "hiptop"
+    devicePlaystation = "playstation"
+    devicePlaystationVita = "vita"
+    deviceNintendoDs = "nitro"
+    deviceNintendo = "nintendo"
+    deviceWii = "wii"
+    deviceXbox = "xbox"
+    deviceArchos = "archos"
+    
+    engineFirefox = "firefox" #For Firefox OS
+    engineOpera = "opera" #Popular browser
+    engineNetfront = "netfront" #Common embedded OS browser
+    engineUpBrowser = "up.browser" #common on some phones
+    engineOpenWeb = "openweb" #Transcoding by OpenWave server
+    deviceMidp = "midp" #a mobile Java technology
+    uplink = "up.link"
+    engineTelecaQ = "teleca q" #a modern feature phone browser
+    devicePda = "pda" #some devices report themselves as PDAs
+    mini = "mini"  #Some mobile browsers put "mini" in their names.
+    mobile = "mobile" #Some mobile browsers put "mobile" in their user agent strings.
+    mobi = "mobi" #Some mobile browsers put "mobi" in their user agent strings.
+    
+    #Smart TV strings
+    smartTV1 = "smart-tv" #Samsung Tizen smart TVs
+    smartTV2 = "smarttv" #LG WebOS smart TVs
+
+    #Use Maemo, Tablet, and Linux to test for Nokia"s Internet Tablets.
+    maemo = "maemo"
+    linux = "linux"
+    qtembedded = "qt embedded" #for Sony Mylo
+    mylocom2 = "com2" #for Sony Mylo also
+    
+    #In some UserAgents, the only clue is the manufacturer.
+    manuSonyEricsson = "sonyericsson"
+    manuericsson = "ericsson"
+    manuSamsung1 = "sec-sgh"
+    manuSony = "sony"
+    manuHtc = "htc" #Popular Android and WinMo manufacturer
+    
+    #In some UserAgents, the only clue is the operator.
+    svcDocomo = "docomo"
+    svcKddi = "kddi"
+    svcVodafone = "vodafone"
+
+    #Disambiguation strings.
+    disUpdate = "update" #pda vs. update
+
+    def __init__(self, userAgent, httpAccept):
+        """Initialize the __userAgent and __httpAccept variables
+
+        Keyword arguments:
+        userAgent  -- the User-Agent header
+        httpAccept -- the Accept header
+        """
+
+        # User-Agent and Accept HTTP request headers
+        self.__userAgent = userAgent.lower() if userAgent else ""
+        self.__httpAccept = httpAccept.lower() if httpAccept else ""
+
+        # Let's store values for quickly accessing the same info multiple times.
+        self.__isIphone = False
+        self.__isAndroidPhone = False
+        self.__isTierTablet = False
+        self.__isTierIphone = False
+        self.__isTierRichCss = False
+        self.__isTierGenericMobile = False
+
+        # Intialize key stored values.
+        self.initDeviceScan()
+
+    def getUserAgent(self):
+        """Return the lower case HTTP_USER_AGENT"""
+        return self.__userAgent
+
+    def getHttpAccept(self):
+        """Return the lower case HTTP_ACCEPT"""
+        return self.__httpAccept
+    
+    def getIsIphone(self):
+        """Return whether the device is an Iphone or iPod Touch"""
+        return self.__isIphone
+
+    def getIsTierTablet(self):
+        """Return whether the device is in the Tablet Tier."""
+        return self.__isTierTablet
+
+    def getIsTierIphone(self):
+        """Return whether the device is in the Iphone Tier."""
+        return self.__isTierIphone
+
+    def getIsTierRichCss(self):
+        """Return whether the device is in the 'Rich CSS' tier of mobile devices."""
+        return self.__isTierRichCss
+
+    def getIsTierGenericMobile(self):
+        """Return whether the device is a generic, less-capable mobile device."""
+        return self.__isTierGenericMobile
+
+
+    def initDeviceScan(self):
+        """Initialize Key Stored Values."""
+        self.__isIphone = self.detectIphoneOrIpod()
+        self.__isAndroidPhone = self.detectAndroidPhone()
+        self.__isTierTablet = self.detectTierTablet()
+        self.__isTierIphone = self.detectTierIphone()
+        self.__isTierRichCss = self.detectTierRichCss()
+        self.__isTierGenericMobile = self.detectTierOtherPhones()
+
+    def detectIphone(self):
+        """Return detection of an iPhone
+
+        Detects if the current device is an iPhone.
+        """
+        # The iPad and iPod touch say they're an iPhone! So let's disambiguate.
+        return UAgentInfo.deviceIphone in self.__userAgent \
+            and not self.detectIpad() \
+            and not self.detectIpod()
+
+    def detectIpod(self):
+        """Return detection of an iPod Touch
+
+        Detects if the current device is an iPod Touch.
+        """
+        return UAgentInfo.deviceIpod in self.__userAgent
+
+
+    def detectIpad(self):
+        """Return detection of an iPad
+
+        Detects if the current device is an iPad tablet.
+        """
+        return UAgentInfo.deviceIpad in self.__userAgent \
+            and self.detectWebkit()
+
+    def detectIphoneOrIpod(self):
+        """Return detection of an iPhone or iPod Touch
+
+        Detects if the current device is an iPhone or iPod Touch.
+        """
+        #We repeat the searches here because some iPods may report themselves as an iPhone, which would be okay.
+        return UAgentInfo.deviceIphone in self.__userAgent \
+            or UAgentInfo.deviceIpod in self.__userAgent
+
+    def detectIos(self):
+        """Return detection of an Apple iOS device
+
+        Detects *any* iOS device: iPhone, iPod Touch, iPad.
+        """
+        return self.detectIphoneOrIpod() \
+            or self.detectIpad()
+
+    def detectAndroid(self):
+        """Return detection of an Android device
+
+        Detects *any* Android OS-based device: phone, tablet, and multi-media player.
+        Also detects Google TV.
+        """
+        if UAgentInfo.deviceAndroid in self.__userAgent \
+           or self.detectGoogleTV():
+            return True
+
+        return False
+
+
+    def detectAndroidPhone(self):
+        """Return  detection of an Android phone
+
+        Detects if the current device is a (small-ish) Android OS-based device
+        used for calling and/or multi-media (like a Samsung Galaxy Player).
+        Google says these devices will have 'Android' AND 'mobile' in user agent.
+        Ignores tablets (Honeycomb and later).
+        """
+        #First, let's make sure we're on an Android device.
+        if not self.detectAndroid():
+            return False
+
+        #If it's Android and has 'mobile' in it, Google says it's a phone.
+        if UAgentInfo.mobile in self.__userAgent:
+            return True
+
+        #Special check for Android devices with Opera Mobile/Mini. They should report here.
+        if self.detectOperaMobile():
+            return True
+
+        return False
+
+
+    def detectAndroidTablet(self):
+        """Return detection of an Android tablet
+
+        Detects if the current device is a (self-reported) Android tablet.
+        Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
+        """
+        #First, let's make sure we're on an Android device.
+        if not self.detectAndroid():
+            return False
+
+        #Special check for Android devices with Opera Mobile/Mini. They should NOT report here.
+        if self.detectOperaMobile():
+            return False
+    
+        #Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
+        return UAgentInfo.mobile not in self.__userAgent
+
+
+    def detectAndroidWebKit(self):
+        """Return detection of an Android WebKit browser
+
+        Detects if the current device is an Android OS-based device and
+        the browser is based on WebKit.
+        """
+        return self.detectAndroid() \
+            and self.detectWebkit()
+
+    def detectGoogleTV(self):
+        """Return detection of GoogleTV
+
+        Detects if the current device is a GoogleTV.
+        """
+        return UAgentInfo.deviceGoogleTV in self.__userAgent
+
+
+    def detectWebkit(self):
+        """Return detection of a WebKit browser
+
+        Detects if the current browser is based on WebKit.
+        """
+        return UAgentInfo.engineWebKit in self.__userAgent
+
+    def detectS60OssBrowser(self):
+        """Return detection of Symbian S60 Browser
+
+        Detects if the current browser is the Symbian S60 Open Source Browser.
+        """
+        #First, test for WebKit, then make sure it's either Symbian or S60.
+        return self.detectWebkit() \
+            and (UAgentInfo.deviceSymbian in self.__userAgent \
+                or UAgentInfo.deviceS60 in self.__userAgent)
+
+    def detectSymbianOS(self):
+        """Return detection of SymbianOS
+
+        Detects if the current device is any Symbian OS-based device,
+        including older S60, Series 70, Series 80, Series 90, and UIQ,
+        or other browsers running on these devices.
+        """
+        return UAgentInfo.deviceSymbian in self.__userAgent \
+            or UAgentInfo.deviceS60 in self.__userAgent \
+            or UAgentInfo.deviceS70 in self.__userAgent \
+            or UAgentInfo.deviceS80 in self.__userAgent \
+            or UAgentInfo.deviceS90 in self.__userAgent
+
+    def detectWindowsPhone(self):
+        """Return detection of a Windows Phone device
+
+        Detects if the current browser is a 
+     	Windows Phone 7, 8, or 10 device
+        """
+        return self.detectWindowsPhone7() \
+            or self.detectWindowsPhone8() \
+            or self.detectWindowsPhone10()
+
+    def detectWindowsPhone7(self):
+        """Return detection of Windows Phone 7
+
+        Detects if the current browser is a
+        Windows Phone 7 device.
+        """
+        return UAgentInfo.deviceWinPhone7 in self.__userAgent
+
+    def detectWindowsPhone8(self):
+        """Return detection of Windows Phone 8
+
+        Detects if the current browser is a
+        Windows Phone 8 device.
+        """
+        return UAgentInfo.deviceWinPhone8 in self.__userAgent
+
+    def detectWindowsPhone10(self):
+        """Return detection of Windows Phone 10
+
+        Detects if the current browser is a
+        Windows Phone 10 device.
+        """
+        return UAgentInfo.deviceWinPhone10 in self.__userAgent
+
+    def detectWindowsMobile(self):
+        """Return detection of Windows Mobile
+
+        Detects if the current browser is a Windows Mobile device.
+        Excludes Windows Phone 7 devices.
+        Focuses on Windows Mobile 6.xx and earlier.
+        """
+        #Exclude new Windows Phone.
+        if self.detectWindowsPhone():
+            return False
+        #Most devices use 'Windows CE', but some report 'iemobile'
+        #  and some older ones report as 'PIE' for Pocket IE.
+        #  We also look for instances of HTC and Windows for many of their WinMo devices.
+        if UAgentInfo.deviceWinMob in self.__userAgent \
+           or UAgentInfo.deviceIeMob in self.__userAgent \
+           or UAgentInfo.enginePie in self.__userAgent:
+            return True
+        # Test for certain Windwos Mobile-based HTC devices.
+        if UAgentInfo.manuHtc in self.__userAgent \
+           and UAgentInfo.deviceWindows in self.__userAgent:
+            return True
+        if self.detectWapWml() \
+           and UAgentInfo.deviceWindows in self.__userAgent:
+            return True
+        
+        #Test for Windows Mobile PPC but not old Macintosh PowerPC.
+        return UAgentInfo.devicePpc in self.__userAgent \
+            and UAgentInfo.deviceMacPpc not in self.__userAgent
+
+    def detectBlackBerry(self):
+        """Return detection of Blackberry
+
+        Detects if the current browser is any BlackBerry.
+        Includes the PlayBook.
+        """
+        return UAgentInfo.deviceBB in self.__userAgent \
+            or UAgentInfo.vndRIM in self.__httpAccept
+
+    def detectBlackBerry10Phone(self):
+        """Return detection of a Blackberry 10 OS phone
+
+        Detects if the current browser is a BlackBerry 10 OS phone.
+        Excludes the PlayBook.
+        """
+        return UAgentInfo.deviceBB10 in self.__userAgent \
+            and UAgentInfo.mobile in self.__userAgent
+
+    def detectBlackBerryTablet(self):
+        """Return detection of a Blackberry Tablet
+
+        Detects if the current browser is on a BlackBerry tablet device.
+        Example: PlayBook
+        """
+        return UAgentInfo.deviceBBPlaybook in self.__userAgent
+
+    def detectBlackBerryWebKit(self):
+        """Return detection of a Blackberry device with WebKit browser
+
+        Detects if the current browser is a BlackBerry device AND uses a
+        WebKit-based browser. These are signatures for the new BlackBerry OS 6.
+        Examples: Torch. Includes the Playbook.
+        """
+        
+        return self.detectBlackBerry() \
+            and self.detectWebkit()
+
+
+    def detectBlackBerryTouch(self):
+        """Return detection of a Blackberry touchscreen device
+
+        Detects if the current browser is a BlackBerry Touch
+        device, such as the Storm, Torch, and Bold Touch. Excludes the Playbook.
+        """
+        return UAgentInfo.deviceBBStorm in self.__userAgent \
+                or UAgentInfo.deviceBBTorch in self.__userAgent \
+                or UAgentInfo.deviceBBBoldTouch in self.__userAgent \
+                or UAgentInfo.deviceBBCurveTouch in self.__userAgent
+
+    def detectBlackBerryHigh(self):
+        """Return detection of a Blackberry device with a better browser
+
+        Detects if the current browser is a BlackBerry device AND
+        has a more capable recent browser. Excludes the Playbook.
+        Examples, Storm, Bold, Tour, Curve2
+        Excludes the new BlackBerry OS 6 and 7 browser!!
+        """
+        #Disambiguate for BlackBerry OS 6 or 7 (WebKit) browser
+        if self.detectBlackBerryWebKit():
+            return False
+        if not self.detectBlackBerry():
+            return False
+
+        return self.detectBlackBerryTouch() \
+            or UAgentInfo.deviceBBBold in self.__userAgent \
+            or UAgentInfo.deviceBBTour in self.__userAgent \
+            or UAgentInfo.deviceBBCurve in self.__userAgent
+
+    def detectBlackBerryLow(self):
+        """Return detection of a Blackberry device with a poorer browser
+
+        Detects if the current browser is a BlackBerry device AND
+        has an older, less capable browser.
+        Examples: Pearl, 8800, Curve1
+        """
+        if not self.detectBlackBerry():
+            return False
+
+        #Assume that if it's not in the High tier, then it's Low
+        return self.detectBlackBerryHigh() \
+            or self.detectBlackBerryWebKit()
+
+    def detectPalmOS(self):
+        """Return detection of a PalmOS device
+
+        Detects if the current browser is on a PalmOS device.
+        """
+        #Most devices nowadays report as 'Palm', but some older ones reported as Blazer or Xiino.
+        if UAgentInfo.devicePalm in self.__userAgent \
+           or  UAgentInfo.engineBlazer in self.__userAgent \
+           or  UAgentInfo.engineXiino in self.__userAgent:
+            # Make sure it's not WebOS
+            return not self.detectPalmWebOS()
+        return False
+
+    def detectPalmWebOS(self):
+        """Return detection of a Palm WebOS device
+
+        Detects if the current browser is on a Palm device
+        running the new WebOS.
+        """
+        return UAgentInfo.deviceWebOS in self.__userAgent
+
+    def detectWebOSTablet(self):
+        """Return detection of an HP WebOS tablet
+
+        Detects if the current browser is on an HP tablet running WebOS.
+        """
+        return UAgentInfo.deviceWebOShp in self.__userAgent \
+            and UAgentInfo.deviceTablet in self.__userAgent
+
+    def detectWebOSTV(self):
+        """Return detection of a WebOS smart TV
+
+        Detects if the current browser is on a WebOS smart TV.
+        """
+        return UAgentInfo.deviceWebOStv in self.__userAgent \
+            and UAgentInfo.smartTV2 in self.__userAgent
+
+    def detectGarminNuvifone(self):
+        """Return detection of a Garmin Nuvifone
+
+        Detects if the current browser is a
+        Garmin Nuvifone.
+        """
+        return UAgentInfo.deviceNuvifone in self.__userAgent
+
+    def detectBada(self):
+        """Return detection of a Bada device
+
+        Detects a device running the Bada OS from Samsung.
+        """
+        return UAgentInfo.deviceBada in self.__userAgent
+
+    def detectTizen(self):
+        """Return detection of a Tizen device
+
+        Detects a device running the Tizen smartphone OS.
+        """
+        return UAgentInfo.deviceTizen in self.__userAgent \
+            and UAgentInfo.mobile in self.__userAgent
+
+    def detectTizenTV(self):
+        """Return detection of a Tizen smart TV
+
+        Detects if the current browser is on a Tizen smart TV.
+        """
+        return UAgentInfo.deviceTizen in self.__userAgent \
+            and UAgentInfo.smartTV1 in self.__userAgent
+
+    def detectMeego(self):
+        """Return detection of a Meego device
+
+        Detects a device running the Meego OS.
+        """
+        return UAgentInfo.deviceMeego in self.__userAgent 
+
+    def detectMeegoPhone(self):
+        """Return detection of a Meego phone
+
+        Detects a phone running the Meego OS.
+        """
+        return UAgentInfo.deviceMeego in self.__userAgent \
+            and UAgentInfo.mobi in self.__userAgent
+
+    def detectFirefoxOS(self):
+        """Return detection of a Firefox OS mobile device
+
+        Detects a mobile device (probably) running the Firefox OS.
+        """
+        return self.detectFirefoxOSPhone() \
+            or self.detectFirefoxOSTablet()
+
+    def detectFirefoxOSPhone(self):
+        """Return detection of a Firefox OS phone
+
+        Detects a phone (probably) running the Firefox OS.
+        """
+        if self.detectIos() \
+            or self.detectAndroid() \
+            or self.detectSailfish():
+            return False
+
+        if UAgentInfo.engineFirefox in self.__userAgent \
+           and UAgentInfo.mobile in self.__userAgent:
+            return True
+
+        return False
+
+    def detectFirefoxOSTablet(self):
+        """Return detection of a Firefox OS tablet
+
+        Detects a tablet (probably) running the Firefox OS.
+        """
+        if self.detectIos() \
+            or self.detectAndroid() \
+            or self.detectSailfish():
+            return False
+
+        if UAgentInfo.engineFirefox in self.__userAgent \
+           and UAgentInfo.deviceTablet in self.__userAgent:
+            return True
+
+        return False
+
+    def detectSailfish(self):
+        """Return detection of a Sailfish OS device.
+
+        Detects a device running the Sailfish OS.
+        """
+        return UAgentInfo.deviceSailfish in self.__userAgent
+
+    def detectSailfishPhone(self):
+        """Return detection of a Sailfish phone
+
+        Detects a phone running the Sailfish OS.
+        """
+        if self.detectSailfish() \
+           and UAgentInfo.mobile in self.__userAgent:
+            return True
+
+        return False
+
+    def detectUbuntu(self):
+        """Return detection of an Ubuntu Mobile OS mobile device
+
+        Detects a mobile device running the Ubuntu Mobile OS.
+        """
+        return self.detectUbuntuPhone() \
+            or self.detectUbuntuTablet()
+
+    def detectUbuntuPhone(self):
+        """Return detection of an Ubuntu Mobile OS phone
+
+        Detects a phone running the Ubuntu Mobile OS.
+        """
+        if UAgentInfo.deviceUbuntu in self.__userAgent \
+           and UAgentInfo.mobile in self.__userAgent:
+            return True
+
+        return False
+
+    def detectUbuntuTablet(self):
+        """Return detection of an Ubuntu Mobile OS tablet
+
+        Detects a tablet running the Ubuntu Mobile OS.
+        """
+        if UAgentInfo.deviceUbuntu in self.__userAgent \
+           and UAgentInfo.deviceTablet in self.__userAgent:
+            return True
+
+        return False
+
+
+    def detectBrewDevice(self):
+        """Return detection of a Brew device
+
+        Detects whether the device is a Brew-powered device.
+        """
+        return UAgentInfo.deviceBrew in self.__userAgent
+
+    def detectDangerHiptop(self):
+        """Return detection of a Danger Hiptop
+
+        Detects the Danger Hiptop device.
+        """
+        return UAgentInfo.deviceDanger in self.__userAgent \
+            or UAgentInfo.deviceHiptop in self.__userAgent
+
+    def detectOperaMobile(self):
+        """Return detection of an Opera browser for a mobile device
+
+        Detects Opera Mobile or Opera Mini.
+        """
+        return UAgentInfo.engineOpera in self.__userAgent \
+            and (UAgentInfo.mini in self.__userAgent \
+                or UAgentInfo.mobi in self.__userAgent)
+
+
+    def detectWapWml(self):
+        """Return detection of a WAP- or WML-capable device
+
+        Detects whether the device supports WAP or WML.
+        """
+        return UAgentInfo.vndwap in self.__httpAccept \
+            or UAgentInfo.wml in self.__httpAccept
+
+    def detectKindle(self):
+        """Return detection of a Kindle
+
+        Detects if the current device is an Amazon Kindle (eInk devices only).
+        Note: For the Kindle Fire, use the normal Android methods.
+        """
+        return UAgentInfo.deviceKindle in self.__userAgent \
+            and not self.detectAndroid()
+
+    def detectAmazonSilk(self):
+        """Return detection of an Amazon Kindle Fire in Silk mode.
+
+        Detects if the current Amazon device is using the Silk Browser.
+        Note: Typically used by the the Kindle Fire.
+        """
+        return UAgentInfo.engineSilk in self.__userAgent
+
+    def detectSonyPlaystation(self):
+        """Return detection of Sony Playstation
+
+        Detects if the current device is a Sony Playstation.
+        """
+        return UAgentInfo.devicePlaystation in self.__userAgent
+
+    def detectGamingHandheld(self):
+        """Return detection of a gaming handheld with a modern iPhone-class browser
+
+        Detects if the current device is a handheld gaming device with
+   		a touchscreen and modern iPhone-class browser. Includes the Playstation Vita.
+        """
+        return UAgentInfo.devicePlaystation in self.__userAgent \
+            and UAgentInfo.devicePlaystationVita in self.__userAgent
+
+    def detectNintendo(self):
+        """Return detection of Nintendo
+
+        Detects if the current device is a Nintendo game device.
+        """
+        return UAgentInfo.deviceNintendo in self.__userAgent \
+            or UAgentInfo.deviceNintendo in self.__userAgent \
+            or UAgentInfo.deviceNintendo in self.__userAgent
+
+    def detectXbox(self):
+        """Return detection of Xbox
+
+        Detects if the current device is a Microsoft Xbox.
+        """
+        return UAgentInfo.deviceXbox in self.__userAgent
+
+    def detectGameConsole(self):
+        """Return detection of any Game Console
+
+        Detects if the current device is an Internet-capable game console.
+        """
+        return self.detectSonyPlaystation() \
+            or self.detectNintendo() \
+            or self.detectXbox()
+
+    def detectMidpCapable(self):
+        """Return detection of a MIDP mobile Java-capable device
+
+        Detects if the current device supports MIDP, a mobile Java technology.
+        """
+        return UAgentInfo.deviceMidp in self.__userAgent \
+            or UAgentInfo.deviceMidp in self.__httpAccept
+
+    def detectMaemoTablet(self):
+        """Return detection of a Maemo OS tablet
+
+        Detects if the current device is on one of the Maemo-based Nokia Internet Tablets.
+        """
+        if UAgentInfo.maemo in self.__userAgent:
+            return True
+
+        return UAgentInfo.linux in self.__userAgent \
+            and UAgentInfo.deviceTablet in self.__userAgent \
+            and not self.detectWebOSTablet() \
+            and not self.detectAndroid()
+
+    def detectArchos(self):
+        """Return detection of an Archos media player
+
+        Detects if the current device is an Archos media player/Internet tablet.
+        """
+        return UAgentInfo.deviceArchos in self.__userAgent
+
+    def detectSonyMylo(self):
+        """Return detection of a Sony Mylo device
+
+        Detects if the current browser is a Sony Mylo device.
+        """
+        return UAgentInfo.manuSony in self.__userAgent \
+            and (UAgentInfo.qtembedded in self.__userAgent 
+                or UAgentInfo.mylocom2 in self.__userAgent)
+
+    #*****************************
+    # Device Classes
+    #*****************************
+    def detectSmartphone(self):
+        """Return detection of a general smartphone device
+
+        Checks to see whether the device is *any* 'smartphone'.
+        Note: It's better to use DetectTierIphone() for modern touchscreen devices.
+        """
+        return self.detectTierIphone() \
+            or self.detectS60OssBrowser() \
+            or self.detectSymbianOS() \
+            or self.detectWindowsMobile() \
+            or self.detectBlackBerry() \
+            or self.detectMeegoPhone() \
+            or self.detectPalmWebOS()
+
+    def detectMobileQuick(self):
+        """Return detection of any mobile device using the quicker method
+
+        Detects if the current device is a mobile device.
+        This method catches most of the popular modern devices.
+        Excludes Apple iPads and other modern tablets.
+        """
+        #Let's exclude tablets
+        if self.__isTierTablet:
+            return False
+
+        #Most mobile browsing is done on smartphones
+        if self.detectSmartphone():
+            return True
+
+        #Catch-all for many mobile devices
+        if UAgentInfo.mobile in self.__userAgent:
+            return True
+
+        if self.detectOperaMobile():
+            return True
+
+        #We also look for Kindle devices
+        if self.detectKindle() \
+            or self.detectAmazonSilk():
+            return True
+
+        if self.detectWapWml() \
+           or self.detectMidpCapable() \
+           or self.detectBrewDevice():
+            return True
+
+        if UAgentInfo.engineNetfront in self.__userAgent \
+           or UAgentInfo.engineUpBrowser in self.__userAgent:
+            return True
+
+        return False
+
+    def detectMobileLong(self):
+        """Return detection of any mobile device using the more thorough method
+
+        The longer and more thorough way to detect for a mobile device.
+        Will probably detect most feature phones,
+        smartphone-class devices, Internet Tablets,
+        Internet-enabled game consoles, etc.
+        This ought to catch a lot of the more obscure and older devices, also --
+        but no promises on thoroughness!
+        """
+        
+        if self.detectMobileQuick() \
+           or self.detectGameConsole():
+            return True
+
+        if self.detectDangerHiptop() \
+           or self.detectMaemoTablet() \
+           or self.detectSonyMylo() \
+           or self.detectArchos():
+            return True
+
+        if UAgentInfo.devicePda in self.__userAgent \
+           and UAgentInfo.disUpdate not in self.__userAgent:
+            return True
+        
+        #detect older phones from certain manufacturers and operators.
+        return UAgentInfo.uplink in self.__userAgent \
+            or UAgentInfo.engineOpenWeb in self.__userAgent \
+            or UAgentInfo.manuSamsung1 in self.__userAgent \
+            or UAgentInfo.manuSonyEricsson in self.__userAgent \
+            or UAgentInfo.manuericsson in self.__userAgent \
+            or UAgentInfo.svcDocomo in self.__userAgent \
+            or UAgentInfo.svcKddi in self.__userAgent \
+            or UAgentInfo.svcVodafone in self.__userAgent
+
+
+    #*****************************
+    # For Mobile Web Site Design
+    #*****************************
+    def detectTierTablet(self):
+        """Return detection of any device in the Tablet Tier
+
+        The quick way to detect for a tier of devices.
+        This method detects for the new generation of
+        HTML 5 capable, larger screen tablets.
+        Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
+        """
+        return self.detectIpad() \
+            or self.detectAndroidTablet() \
+            or self.detectBlackBerryTablet() \
+            or self.detectFirefoxOSTablet() \
+            or self.detectUbuntuTablet() \
+            or self.detectWebOSTablet()
+
+    def detectTierIphone(self):
+        """Return detection of any device in the iPhone/Android/WP7/WebOS Tier
+
+        The quick way to detect for a tier of devices.
+        This method detects for devices which can
+        display iPhone-optimized web content.
+        Includes iPhone, iPod Touch, Android, Windows Phone 7, Palm WebOS, etc.
+        """
+        return self.__isIphone \
+            or self.__isAndroidPhone \
+            or self.detectWindowsPhone() \
+            or self.detectBlackBerry10Phone() \
+            or self.detectPalmWebOS() \
+            or self.detectBada() \
+            or self.detectTizen() \
+            or self.detectFirefoxOSPhone() \
+            or self.detectSailfishPhone() \
+            or self.detectUbuntuPhone() \
+            or self.detectGamingHandheld()
+
+    def detectTierRichCss(self):
+        """Return detection of any device in the 'Rich CSS' Tier
+
+        The quick way to detect for a tier of devices.
+        This method detects for devices which are likely to be capable
+        of viewing CSS content optimized for the iPhone,
+        but may not necessarily support JavaScript.
+        Excludes all iPhone Tier devices.
+        """
+        #The following devices are explicitly ok.
+        #Note: 'High' BlackBerry devices ONLY
+        if not self.detectMobileQuick():
+            return False
+        #Exclude iPhone Tier and e-Ink Kindle devices
+        if self.detectTierIphone() \
+            or self.detectKindle():
+            return False
+        #The following devices are explicitly ok.
+        #Note: 'High' BlackBerry devices ONLY
+        #Older Windows 'Mobile' isn't good enough for iPhone Tier.
+        return self.detectWebkit() \
+            or self.detectS60OssBrowser() \
+            or self.detectBlackBerryHigh() \
+            or self.detectWindowsMobile() \
+            or UAgentInfo.engineTelecaQ in self.__userAgent
+
+    def detectTierOtherPhones(self):
+        """Return detection of a mobile device in the less capable tier
+
+        The quick way to detect for a tier of devices.
+        This method detects for all other types of phones,
+        but excludes the iPhone and RichCSS Tier devices.
+        """
+        #Exclude devices in the other 2 categories
+        return self.detectMobileLong() \
+            and not self.detectTierIphone() \
+            and not self.detectTierRichCss()
diff --git a/vendor/ahand/mobileesp/README.md b/vendor/ahand/mobileesp/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..0ba416ca94387ef32cfb4f92ff6893a23c69917f
--- /dev/null
+++ b/vendor/ahand/mobileesp/README.md
@@ -0,0 +1,91 @@
+#MobileESP
+[![License](https://img.shields.io/hexpm/l/plug.svg?style=flat)](http://blog.mobileesp.com/?page_id=13)
+
+[![Platform](https://img.shields.io/badge/platform-PHP-orange.svg?style=flat)](http://blog.mobileesp.com/?page_id=53)
+[![Platform](https://img.shields.io/badge/platform-Java-orange.svg?style=flat)](http://blog.mobileesp.com/?page_id=53)
+[![Platform](https://img.shields.io/badge/platform-ASP.NET-orange.svg?style=flat)](http://blog.mobileesp.com/?page_id=53)
+[![Platform](https://img.shields.io/badge/platform-Python-orange.svg?style=flat)](http://blog.mobileesp.com/?page_id=53)
+[![Platform](https://img.shields.io/badge/platform-C++-orange.svg?style=flat)](http://blog.mobileesp.com/?page_id=53)
+[![Platform](https://img.shields.io/badge/platform-JavaScript-orange.svg?style=flat)](http://blog.mobileesp.com/?page_id=53)
+
+
+
+At last, a dead simple way for web site publishers to detect visitors on mobile web sites! 
+
+MobileESP is free, open source and lightweight. MobileESP has a simple API for detecting mobile devices. The API returns the simple Boolean result of TRUE if the device is the specified type, or FALSE if it isn't. For example, want to know if your visitor is on an iPhone, Android or Windows Phone device? Simply use the method DetectTierIphone(). It's that easy.
+
+Visit the MobileESP web site for tons more information: <a href="http://www.mobileesp.org">www.MobileESP.org</a>.
+
+
+##Core Principles
+MobileESP believes in making it dead easy for a website publisher to detect mobile visitors. As a result, the API follows the DetectXXX() pattern and returns a simple Boolean (true or false) for the type of mobile device or platform desired. The API DetectXXX() methods are consistent by design across supported platforms. 
+
+In addition, a second core principle is that the code is easy for the user to read and understand. Therefore, we believe it's easier for the user to change, update or extend the library, if desired. 
+
+The code is also purposefully written to be modular so that it is not only easier to maintain, but also easier to extend. 
+
+
+##Server-Side Platforms
+> <a href="http://blog.mobileesp.com/?page_id=53">API Documentation</a>
+
+MobileESP started with PHP (and JavaScript) and has been extended by the community to a bunch of other platforms:
+- PHP
+- Java
+- ASP.NET (C#) 
+- Python
+- C++
+
+Also available in separate repositories: 
+- <a href="https://github.com/eimermusic/mobileesp">Ruby</a>: This project was ported by Martin, who separately maintains the Ruby codebase on GitHub.
+- <a href="https://bitbucket.org/mbarrero/mobileesp-classic-asp">Classic ASP (VBscript)</a>: This project was ported by Miguel Barrero, who separately maintains the codebase on BitBucket.
+
+
+##Client-Side Platforms
+> <a href="http://blog.mobileesp.com/?page_id=60">JavaScript API Documentation</a>
+
+MobileESP is also available for JavaScript to be run in the browser. Support for client-side JavaScript processing on phones is very poor to completely non-existent. Though much better on modern smartphones, JavaScript is still not quite at the desktop level. Generally speaking, JavaScript is probably reliable only for distinguishing between devices among modern smartphones and tablets. So if you want to know whether your visitor is one of these devices, the JavaScript probably works fine: iPhone, Android, Windows Phone, and BlackBerry 10+. A few other modern smartphone OSes such as Sailfish and Ubuntu are also expected to perform well.
+
+A server-side library is recommended for pretty much everything else: from older smartphone OSes to all feature phones, plus smart TVs, gaming devices, and ereaders.
+
+
+##Live Demo
+Anthony updates the live demo pages when he updates the library. The live demo pages show the results of each of the API calls. Point your mobile device browser to the parent demo page: <a href="http://www.hand-interactive.com/detect/">http://www.hand-interactive.com/detect/</a>
+- <a href="http://www.hand-interactive.com/detect/mobileesp_demo_php.htm">PHP Demo Page</a>
+- <a href="http://www.hand-interactive.com/detect/mobileesp_demo_javascript.htm">JavaScript Demo Page</a>
+
+
+##Useragent Test Strings
+The MobileESP project tests the PHP and JavaScript live demos with the included spreadsheet of useragent strings. This set of useragent strings isn't meant to be exhaustive, but rather to feature a wide variety of strings to verify that each of the DetectXXX() methods work as expected. Feel free to use this list of useragent strings on your own project, as well.
+
+
+##Updated May 2015!
+Anthony provided a much-needed update in May 2015. Please see the change log in the beginning of each file for full details. 
+
+Anthony tested the PHP and JavaScript libraries with the new useragent strings in the spreadsheet. However, Anthony doesn't have the environments set up to test the Java, C#, Python and C++ libraries. Can you help to test these? 
+
+In addition, the Ruby and Classic ASP (VBScript) libraries haven't been updated in several years. Would anyone be interested in updating them?
+
+##Python Question
+We've been notified that the Python library doesn't follow the Python community coding standards regarding method names in lower case with underscores separating elements rather than camel case. What do y'all think about this? Would it be better to conform to the Python standards or keep the method names consistent between libraries? Please let Anthony know. 
+
+##Backstory
+This project maintains and extends the original code created in 2008 by Anthony Hand of Hand Interactive (<a href="http://www.hand-interactive.com">http://www.hand-interactive.com</a>). Anthony was working on a web site project for a client and wanted an easy way to customize some of the content for smartphones, especially that era's flagship iPhone, Symbian, and BlackBerry devices. However, commonly used Grep-style algorithms at the time were dumb, blunt force tools treating all devices as equal. Thus the PHP and JavaScript libraries were originally born.
+
+NOTE: The MobileESP project was previously hosted on the Google Code web site. Because Google closed down that site and there had been many user requests, MobileESP is now hosted with GitHub. 
+
+##YouTube Quick Talk Video
+MobileESP founder, Anthony Hand, gave a short 6 minute talk on the origin and basics of MobileESP at a Silicon Valley event in 2012. Check it out!
+<a href="https://youtu.be/F_mFNTbe9lQ">https://youtu.be/F_mFNTbe9lQ</a>
+
+
+##License
+Apache v2.0. More info and the link to the Apache v2.0 license page in each code file. 
+
+
+##Important Caveat
+The MobileESP project code is lightweight and ideal for many web sites. However, this project is not meant to replace other projects offering greater specificity and control, such as <a href="http://wurfl.sourceforge.net/">WURFL</a> or <a href="http://www.handsetdetection.com//">HandsetDetection.com</a>.
+
+
+##Donations
+Yes, usage of the MobileESP code is FREE, so no worries about that. But a donation to the cause helps provide motivation for Anthony to frequently update the code and continue to enhance the cross-platform APIs. And get new phones to do new tests with!
+> <a href="http://blog.mobileesp.com/?page_id=25">Donation Info</a>
diff --git a/vendor/ahand/mobileesp/composer.json b/vendor/ahand/mobileesp/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..97ee2fc32298102d439e78260fe600b5dd6f0366
--- /dev/null
+++ b/vendor/ahand/mobileesp/composer.json
@@ -0,0 +1,24 @@
+{
+    "name": "ahand/mobileesp",
+    "type": "library",
+    "version": "3.0.0",
+    "description": "Since 2008, MobileESP provides web site developers an easy-to-use and lightweight API for detecting whether visitors are using a mobile device, and if so, what kind. The APIs provide simple boolean results ('true' or 'false') for identifying individual device categories (such as iPhone, BlackBerry, Android, and Windows Mobile), device capabilities (e.g., J2ME), and broad classes of devices, such as 'iPhone Tier' (iPhone/Android/Tizen) or 'Tablet Tier.' APIs are available in PHP, JavaScript, Java, C#, Ruby Python, and more.",
+    "keywords": ["mobile","mobile detect","mobile esp","mobile redirect","mobile view managing","mobile-detect","mobile detector","mobile device","detect iphone","detect ipad","detect tablet","detect android","mobiledetect","responsive web","useragent","browser","user agent"],
+    "authors": [
+        {
+            "name": "Anthony Hand",
+            "email": "anthony.hand@gmail.com",
+            "role": "Maintainer"
+        }
+    ],
+    "homepage": "http://www.mobileesp.org",
+    "license": "Apache-2.0",
+    "support": {
+        "issues": "https://github.com/ahand/mobileesp/issues",
+        "source": "https://github.com/ahand/mobileesp/"
+    },
+    "autoload": {
+        "classmap": ["PHP"]
+    },
+    "minimum-stability": "stable"
+}
diff --git a/vendor/autoload.php b/vendor/autoload.php
index ef36b7c89f7f850936a57c30ec0689b0a4d42e7c..923c8dcfb1a6d27a9cd89ded5ec0665c131dc4f8 100644
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer' . '/autoload_real.php';
 
-return ComposerAutoloaderInitd6bb6ced69275a18e1e319c66d1169ab::getLoader();
+return ComposerAutoloaderInit3a47b6a0a6aba66870ea75e8ef6a7551::getLoader();
diff --git a/vendor/behat/mink-selenium2-driver/src/Selenium2Driver.php b/vendor/behat/mink-selenium2-driver/src/Selenium2Driver.php
old mode 100644
new mode 100755
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 940237b3316d89f638968e78415e2c18afae0e90..3e976676cdeb1503b028c175a6ee7a528e1eef9a 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -151,5 +151,5 @@ return array(
     'lessc' => $vendorDir . '/oyejorge/less.php/lessc.inc.php',
     'phpCAS' => $vendorDir . '/jasig/phpcas/source/CAS.php',
     'sip2' => $vendorDir . '/cap60552/php-sip2/sip2.class.php',
-    'uagent_info' => $vendorDir . '/mobileesp/mdetect/mdetect.php',
+    'uagent_info' => $vendorDir . '/ahand/mobileesp/PHP/mdetect.php',
 );
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 32cb1c52fd260d308f41cfdcb56cd8514ba9a32a..fabfebf819c37eec6fbc2be12311e84e76137a84 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -11,6 +11,6 @@ return array(
     'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
     'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
     'LosReCaptcha\\' => array($vendorDir . '/los/losrecaptcha/src'),
-    'Behat\\Mink\\Driver\\' => array($vendorDir . '/behat/mink-zombie-driver/src', $vendorDir . '/behat/mink-selenium2-driver/src'),
+    'Behat\\Mink\\Driver\\' => array($vendorDir . '/behat/mink-selenium2-driver/src', $vendorDir . '/behat/mink-zombie-driver/src'),
     'Behat\\Mink\\' => array($vendorDir . '/behat/mink/src'),
 );
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index e6f8a0ea0af9fc9334edb63328e1d137d26b4f82..94b2e150fb1b8b10ff21336e0f088d914c86eb3b 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php @generated by Composer
 
-class ComposerAutoloaderInitd6bb6ced69275a18e1e319c66d1169ab
+class ComposerAutoloaderInit3a47b6a0a6aba66870ea75e8ef6a7551
 {
     private static $loader;
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInitd6bb6ced69275a18e1e319c66d1169ab
             return self::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInitd6bb6ced69275a18e1e319c66d1169ab', 'loadClassLoader'), true, true);
+        spl_autoload_register(array('ComposerAutoloaderInit3a47b6a0a6aba66870ea75e8ef6a7551', 'loadClassLoader'), true, true);
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInitd6bb6ced69275a18e1e319c66d1169ab', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInit3a47b6a0a6aba66870ea75e8ef6a7551', 'loadClassLoader'));
 
         $includePaths = require __DIR__ . '/include_paths.php';
         array_push($includePaths, get_include_path());
@@ -48,7 +48,7 @@ class ComposerAutoloaderInitd6bb6ced69275a18e1e319c66d1169ab
     }
 }
 
-function composerRequired6bb6ced69275a18e1e319c66d1169ab($file)
+function composerRequire3a47b6a0a6aba66870ea75e8ef6a7551($file)
 {
     require $file;
 }
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 6b753a4cc4862dbf00310a0b5e1260f68e6cca42..e6e5c6873d60ee14e1dff3da63d0425345ae757c 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -100,6 +100,43 @@
             "jasig"
         ]
     },
+    {
+        "name": "cap60552/php-sip2",
+        "version": "v1.0.0",
+        "version_normalized": "1.0.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/cap60552/php-sip2.git",
+            "reference": "9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/cap60552/php-sip2/zipball/9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1",
+            "reference": "9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1",
+            "shasum": ""
+        },
+        "time": "2015-11-03 04:42:39",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "classmap": [
+                "/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "GPL-3.0"
+        ],
+        "authors": [
+            {
+                "name": "John Wohlers",
+                "email": "john@wohlershome.net",
+                "role": "Maintainer"
+            }
+        ],
+        "description": "PHP class library to facilitate communication with Integrated Library System (ILS) servers via 3M's SIP2.",
+        "homepage": "https://github.com/cap60552/php-sip2"
+    },
     {
         "name": "zendframework/zendxml",
         "version": "1.0.1",
@@ -336,24 +373,6 @@
             "zf2"
         ]
     },
-    {
-        "name": "mobileesp/mdetect",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "dist": {
-            "type": "file",
-            "url": "https://raw.githubusercontent.com/ahand/mobileesp/master/PHP/mdetect.php",
-            "reference": null,
-            "shasum": null
-        },
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "classmap": [
-                "/"
-            ]
-        }
-    },
     {
         "name": "ocramius/proxy-manager",
         "version": "1.0.2",
@@ -1040,83 +1059,98 @@
         ]
     },
     {
-        "name": "symfony/process",
-        "version": "v2.7.6",
-        "version_normalized": "2.7.6.0",
+        "name": "instaclick/php-webdriver",
+        "version": "1.4.3",
+        "version_normalized": "1.4.3.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/process.git",
-            "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7"
+            "url": "https://github.com/instaclick/php-webdriver.git",
+            "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7",
-            "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7",
+            "url": "https://api.github.com/repos/instaclick/php-webdriver/zipball/0c20707dcf30a32728fd6bdeeab996c887fdb2fb",
+            "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.9"
+            "ext-curl": "*",
+            "php": ">=5.3.2"
+        },
+        "require-dev": {
+            "satooshi/php-coveralls": "dev-master"
         },
-        "time": "2015-10-23 14:47:27",
+        "time": "2015-06-15 20:19:33",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.7-dev"
+                "dev-master": "1.4.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\Process\\": ""
+            "psr-0": {
+                "WebDriver": "lib/"
             }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "MIT"
+            "Apache-2.0"
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
+                "name": "Justin Bishop",
+                "email": "jubishop@gmail.com",
+                "role": "Developer"
             },
             {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
+                "name": "Anthon Pang",
+                "email": "apang@softwaredevelopment.ca",
+                "role": "Fork Maintainer"
             }
         ],
-        "description": "Symfony Process Component",
-        "homepage": "https://symfony.com"
+        "description": "PHP WebDriver for Selenium 2",
+        "homepage": "http://instaclick.com/",
+        "keywords": [
+            "browser",
+            "selenium",
+            "webdriver",
+            "webtest"
+        ]
     },
     {
         "name": "symfony/css-selector",
-        "version": "v2.7.6",
-        "version_normalized": "2.7.6.0",
+        "version": "v2.8.0",
+        "version_normalized": "2.8.0.0",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/css-selector.git",
-            "reference": "e1b865b26be4a56d22a8dee398375044a80c865b"
+            "reference": "b600fec37c0efca08046d481d79e7eabc07108ff"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b865b26be4a56d22a8dee398375044a80c865b",
-            "reference": "e1b865b26be4a56d22a8dee398375044a80c865b",
+            "url": "https://api.github.com/repos/symfony/css-selector/zipball/b600fec37c0efca08046d481d79e7eabc07108ff",
+            "reference": "b600fec37c0efca08046d481d79e7eabc07108ff",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.9"
         },
-        "time": "2015-10-11 09:39:48",
+        "time": "2015-10-30 20:15:42",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.7-dev"
+                "dev-master": "2.8-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
                 "Symfony\\Component\\CssSelector\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -1199,6 +1233,120 @@
             "web"
         ]
     },
+    {
+        "name": "behat/mink-selenium2-driver",
+        "version": "v1.3.0",
+        "version_normalized": "1.3.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/minkphp/MinkSelenium2Driver.git",
+            "reference": "bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9",
+            "reference": "bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9",
+            "shasum": ""
+        },
+        "require": {
+            "behat/mink": "~1.7@dev",
+            "instaclick/php-webdriver": "~1.1",
+            "php": ">=5.3.1"
+        },
+        "require-dev": {
+            "symfony/phpunit-bridge": "~2.7"
+        },
+        "time": "2015-09-21 21:02:54",
+        "type": "mink-driver",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.3.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Behat\\Mink\\Driver\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Konstantin Kudryashov",
+                "email": "ever.zet@gmail.com",
+                "homepage": "http://everzet.com"
+            },
+            {
+                "name": "Pete Otaqui",
+                "email": "pete@otaqui.com",
+                "homepage": "https://github.com/pete-otaqui"
+            }
+        ],
+        "description": "Selenium2 (WebDriver) driver for Mink framework",
+        "homepage": "http://mink.behat.org/",
+        "keywords": [
+            "ajax",
+            "browser",
+            "javascript",
+            "selenium",
+            "testing",
+            "webdriver"
+        ]
+    },
+    {
+        "name": "symfony/process",
+        "version": "v2.8.0",
+        "version_normalized": "2.8.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/process.git",
+            "reference": "1b988a88e3551102f3c2d9e1d47a18c3a78d6312"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/process/zipball/1b988a88e3551102f3c2d9e1d47a18c3a78d6312",
+            "reference": "1b988a88e3551102f3c2d9e1d47a18c3a78d6312",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.9"
+        },
+        "time": "2015-11-30 12:35:10",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.8-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Component\\Process\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony Process Component",
+        "homepage": "https://symfony.com"
+    },
     {
         "name": "behat/mink-zombie-driver",
         "version": "v1.3.0",
@@ -1263,6 +1411,65 @@
             "zombie"
         ]
     },
+    {
+        "name": "ahand/mobileesp",
+        "version": "dev-master",
+        "version_normalized": "9999999-dev",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/ahand/mobileesp.git",
+            "reference": "098bc79938fceec7bbb298456ed1aba6271a0bac"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/ahand/mobileesp/zipball/098bc79938fceec7bbb298456ed1aba6271a0bac",
+            "reference": "098bc79938fceec7bbb298456ed1aba6271a0bac",
+            "shasum": ""
+        },
+        "time": "2015-12-03 05:20:25",
+        "type": "library",
+        "installation-source": "source",
+        "autoload": {
+            "classmap": [
+                "PHP"
+            ]
+        },
+        "license": [
+            "Apache-2.0"
+        ],
+        "authors": [
+            {
+                "name": "Anthony Hand",
+                "email": "anthony.hand@gmail.com",
+                "role": "Maintainer"
+            }
+        ],
+        "description": "Since 2008, MobileESP provides web site developers an easy-to-use and lightweight API for detecting whether visitors are using a mobile device, and if so, what kind. The APIs provide simple boolean results ('true' or 'false') for identifying individual device categories (such as iPhone, BlackBerry, Android, and Windows Mobile), device capabilities (e.g., J2ME), and broad classes of devices, such as 'iPhone Tier' (iPhone/Android/Tizen) or 'Tablet Tier.' APIs are available in PHP, JavaScript, Java, C#, Ruby Python, and more.",
+        "homepage": "http://www.mobileesp.org",
+        "keywords": [
+            "browser",
+            "detect android",
+            "detect ipad",
+            "detect iphone",
+            "detect tablet",
+            "mobile",
+            "mobile detect",
+            "mobile detector",
+            "mobile device",
+            "mobile esp",
+            "mobile redirect",
+            "mobile view managing",
+            "mobile-detect",
+            "mobiledetect",
+            "responsive web",
+            "user agent",
+            "useragent"
+        ],
+        "support": {
+            "issues": "https://github.com/ahand/mobileesp/issues",
+            "source": "https://github.com/ahand/mobileesp/"
+        }
+    },
     {
         "name": "zendframework/zendrest",
         "version": "2.0.2",
@@ -1364,165 +1571,5 @@
             "sqs",
             "zf2"
         ]
-    },
-    {
-        "name": "cap60552/php-sip2",
-        "version": "v1.0.0",
-        "version_normalized": "1.0.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/cap60552/php-sip2.git",
-            "reference": "9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/cap60552/php-sip2/zipball/9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1",
-            "reference": "9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1",
-            "shasum": ""
-        },
-        "time": "2015-11-03 04:42:39",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "classmap": [
-                "/"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "GPL-3.0"
-        ],
-        "authors": [
-            {
-                "name": "John Wohlers",
-                "email": "john@wohlershome.net",
-                "role": "Maintainer"
-            }
-        ],
-        "description": "PHP class library to facilitate communication with Integrated Library System (ILS) servers via 3M's SIP2.",
-        "homepage": "https://github.com/cap60552/php-sip2"
-    },
-    {
-        "name": "instaclick/php-webdriver",
-        "version": "1.4.3",
-        "version_normalized": "1.4.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/instaclick/php-webdriver.git",
-            "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/instaclick/php-webdriver/zipball/0c20707dcf30a32728fd6bdeeab996c887fdb2fb",
-            "reference": "0c20707dcf30a32728fd6bdeeab996c887fdb2fb",
-            "shasum": ""
-        },
-        "require": {
-            "ext-curl": "*",
-            "php": ">=5.3.2"
-        },
-        "require-dev": {
-            "satooshi/php-coveralls": "dev-master"
-        },
-        "time": "2015-06-15 20:19:33",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.4.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-0": {
-                "WebDriver": "lib/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "Justin Bishop",
-                "email": "jubishop@gmail.com",
-                "role": "Developer"
-            },
-            {
-                "name": "Anthon Pang",
-                "email": "apang@softwaredevelopment.ca",
-                "role": "Fork Maintainer"
-            }
-        ],
-        "description": "PHP WebDriver for Selenium 2",
-        "homepage": "http://instaclick.com/",
-        "keywords": [
-            "browser",
-            "selenium",
-            "webdriver",
-            "webtest"
-        ]
-    },
-    {
-        "name": "behat/mink-selenium2-driver",
-        "version": "v1.3.0",
-        "version_normalized": "1.3.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/minkphp/MinkSelenium2Driver.git",
-            "reference": "bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9",
-            "reference": "bedbf1999c7ba1bc6921b30ee2eadf383e7ff5c9",
-            "shasum": ""
-        },
-        "require": {
-            "behat/mink": "~1.7@dev",
-            "instaclick/php-webdriver": "~1.1",
-            "php": ">=5.3.1"
-        },
-        "require-dev": {
-            "symfony/phpunit-bridge": "~2.7"
-        },
-        "time": "2015-09-21 21:02:54",
-        "type": "mink-driver",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.3.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Behat\\Mink\\Driver\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Konstantin Kudryashov",
-                "email": "ever.zet@gmail.com",
-                "homepage": "http://everzet.com"
-            },
-            {
-                "name": "Pete Otaqui",
-                "email": "pete@otaqui.com",
-                "homepage": "https://github.com/pete-otaqui"
-            }
-        ],
-        "description": "Selenium2 (WebDriver) driver for Mink framework",
-        "homepage": "http://mink.behat.org/",
-        "keywords": [
-            "ajax",
-            "browser",
-            "javascript",
-            "selenium",
-            "testing",
-            "webdriver"
-        ]
     }
 ]
diff --git a/vendor/instaclick/php-webdriver/lib/WebDriver/Service/CurlService.php b/vendor/instaclick/php-webdriver/lib/WebDriver/Service/CurlService.php
old mode 100644
new mode 100755
diff --git a/vendor/instaclick/php-webdriver/lib/WebDriver/Service/CurlServiceInterface.php b/vendor/instaclick/php-webdriver/lib/WebDriver/Service/CurlServiceInterface.php
old mode 100644
new mode 100755
diff --git a/vendor/instaclick/php-webdriver/lib/WebDriver/ServiceFactory.php b/vendor/instaclick/php-webdriver/lib/WebDriver/ServiceFactory.php
old mode 100644
new mode 100755
diff --git a/vendor/symfony/css-selector/CHANGELOG.md b/vendor/symfony/css-selector/CHANGELOG.md
index be10abee924cefbb9c75643bf588a292ba051cb7..4061ff20c3d2ac1d5ad0cc1297dec2144cfb8060 100644
--- a/vendor/symfony/css-selector/CHANGELOG.md
+++ b/vendor/symfony/css-selector/CHANGELOG.md
@@ -1,6 +1,12 @@
 CHANGELOG
 =========
 
+2.8.0
+-----
+
+ * Added the `CssSelectorConverter` class as a non-static API for the component.
+ * Deprecated the `CssSelector` static API of the component.
+
 2.1.0
 -----
 
diff --git a/vendor/symfony/css-selector/CssSelector.php b/vendor/symfony/css-selector/CssSelector.php
index 579700a61c600f31050b3783043b56ddf9a56d2e..6900c6493d9b938d1411a1ddbdc2de43e58d0acb 100644
--- a/vendor/symfony/css-selector/CssSelector.php
+++ b/vendor/symfony/css-selector/CssSelector.php
@@ -11,12 +11,7 @@
 
 namespace Symfony\Component\CssSelector;
 
-use Symfony\Component\CssSelector\Parser\Shortcut\ClassParser;
-use Symfony\Component\CssSelector\Parser\Shortcut\ElementParser;
-use Symfony\Component\CssSelector\Parser\Shortcut\EmptyStringParser;
-use Symfony\Component\CssSelector\Parser\Shortcut\HashParser;
-use Symfony\Component\CssSelector\XPath\Extension\HtmlExtension;
-use Symfony\Component\CssSelector\XPath\Translator;
+@trigger_error('The '.__NAMESPACE__.'\CssSelector class is deprecated since version 2.8 and will be removed in 3.0. Use directly the \Symfony\Component\CssSelector\CssSelectorConverter class instead.', E_USER_DEPRECATED);
 
 /**
  * CssSelector is the main entry point of the component and can convert CSS
@@ -61,6 +56,8 @@ use Symfony\Component\CssSelector\XPath\Translator;
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated as of 2.8, will be removed in 3.0. Use the \Symfony\Component\CssSelector\CssSelectorConverter class instead.
  */
 class CssSelector
 {
@@ -78,20 +75,9 @@ class CssSelector
      */
     public static function toXPath($cssExpr, $prefix = 'descendant-or-self::')
     {
-        $translator = new Translator();
-
-        if (self::$html) {
-            $translator->registerExtension(new HtmlExtension($translator));
-        }
-
-        $translator
-            ->registerParserShortcut(new EmptyStringParser())
-            ->registerParserShortcut(new ElementParser())
-            ->registerParserShortcut(new ClassParser())
-            ->registerParserShortcut(new HashParser())
-        ;
+        $converter = new CssSelectorConverter(self::$html);
 
-        return $translator->cssToXPath($cssExpr, $prefix);
+        return $converter->toXPath($cssExpr, $prefix);
     }
 
     /**
diff --git a/vendor/symfony/css-selector/CssSelectorConverter.php b/vendor/symfony/css-selector/CssSelectorConverter.php
new file mode 100644
index 0000000000000000000000000000000000000000..e31ac1917afbac725234ef9a627731e8b2b40683
--- /dev/null
+++ b/vendor/symfony/css-selector/CssSelectorConverter.php
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\CssSelector;
+
+use Symfony\Component\CssSelector\Parser\Shortcut\ClassParser;
+use Symfony\Component\CssSelector\Parser\Shortcut\ElementParser;
+use Symfony\Component\CssSelector\Parser\Shortcut\EmptyStringParser;
+use Symfony\Component\CssSelector\Parser\Shortcut\HashParser;
+use Symfony\Component\CssSelector\XPath\Extension\HtmlExtension;
+use Symfony\Component\CssSelector\XPath\Translator;
+
+/**
+ * CssSelectorConverter is the main entry point of the component and can convert CSS
+ * selectors to XPath expressions.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class CssSelectorConverter
+{
+    private $translator;
+
+    /**
+     * @param bool $html Whether HTML support should be enabled. Disable it for XML documents.
+     */
+    public function __construct($html = true)
+    {
+        $this->translator = new Translator();
+
+        if ($html) {
+            $this->translator->registerExtension(new HtmlExtension($this->translator));
+        }
+
+        $this->translator
+            ->registerParserShortcut(new EmptyStringParser())
+            ->registerParserShortcut(new ElementParser())
+            ->registerParserShortcut(new ClassParser())
+            ->registerParserShortcut(new HashParser())
+        ;
+    }
+
+    /**
+     * Translates a CSS expression to its XPath equivalent.
+     *
+     * Optionally, a prefix can be added to the resulting XPath
+     * expression with the $prefix parameter.
+     *
+     * @param string $cssExpr The CSS expression.
+     * @param string $prefix  An optional prefix for the XPath expression.
+     *
+     * @return string
+     */
+    public function toXPath($cssExpr, $prefix = 'descendant-or-self::')
+    {
+        return $this->translator->cssToXPath($cssExpr, $prefix);
+    }
+}
diff --git a/vendor/symfony/css-selector/Node/AbstractNode.php b/vendor/symfony/css-selector/Node/AbstractNode.php
index b1c8e9508d9b914cda6db369b2b5d04ea6fe7943..7477e9119df32b0ec0e7f81625e54473bab8a41f 100644
--- a/vendor/symfony/css-selector/Node/AbstractNode.php
+++ b/vendor/symfony/css-selector/Node/AbstractNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 abstract class AbstractNode implements NodeInterface
 {
diff --git a/vendor/symfony/css-selector/Node/AttributeNode.php b/vendor/symfony/css-selector/Node/AttributeNode.php
index b10a4dd5b341faa748f9637d302ea4d66f23cf7c..af872b79e9f2d25286a40a4f84ccab16d3c245d8 100644
--- a/vendor/symfony/css-selector/Node/AttributeNode.php
+++ b/vendor/symfony/css-selector/Node/AttributeNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class AttributeNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/ClassNode.php b/vendor/symfony/css-selector/Node/ClassNode.php
index 544342f871f67f7fe952f0871ed7c2879b00fe7c..f965e7773e89a534037407088d865984c7bc2cab 100644
--- a/vendor/symfony/css-selector/Node/ClassNode.php
+++ b/vendor/symfony/css-selector/Node/ClassNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class ClassNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
index 6d00db431c5b560b2c22b31384ef4bd3731cc424..39f659977779c5ac817d9d6442fbfadb13c3b3e3 100644
--- a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
+++ b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class CombinedSelectorNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/ElementNode.php b/vendor/symfony/css-selector/Node/ElementNode.php
index 71ef121741eb109ea0b2d6a906ade1fdfe90aee0..06e343e969c117b2360c0b46936967d7287d5531 100644
--- a/vendor/symfony/css-selector/Node/ElementNode.php
+++ b/vendor/symfony/css-selector/Node/ElementNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class ElementNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/FunctionNode.php b/vendor/symfony/css-selector/Node/FunctionNode.php
index f94af8dafce56c906967170d17316427b85c7a5e..612f348c5e419ceb1ff024e012f830c40310fa0a 100644
--- a/vendor/symfony/css-selector/Node/FunctionNode.php
+++ b/vendor/symfony/css-selector/Node/FunctionNode.php
@@ -20,6 +20,8 @@ use Symfony\Component\CssSelector\Parser\Token;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class FunctionNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/HashNode.php b/vendor/symfony/css-selector/Node/HashNode.php
index ddbe76477adc5b8f261ddc948099222f9eacdb02..20db46516280610384a6091e3f73caa1429eb58b 100644
--- a/vendor/symfony/css-selector/Node/HashNode.php
+++ b/vendor/symfony/css-selector/Node/HashNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class HashNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/NegationNode.php b/vendor/symfony/css-selector/Node/NegationNode.php
index 0fafb0a120bc7156fe76995c80d2c54ef0b56b2c..4b5aa2260d005d6249b9b3ee598172510a336bd8 100644
--- a/vendor/symfony/css-selector/Node/NegationNode.php
+++ b/vendor/symfony/css-selector/Node/NegationNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class NegationNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/NodeInterface.php b/vendor/symfony/css-selector/Node/NodeInterface.php
index dd300e23cded0a1c5c63e9f96a75e1ed860d052e..d919e20c7107af85f35e386bafe11fd033b06e92 100644
--- a/vendor/symfony/css-selector/Node/NodeInterface.php
+++ b/vendor/symfony/css-selector/Node/NodeInterface.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 interface NodeInterface
 {
diff --git a/vendor/symfony/css-selector/Node/PseudoNode.php b/vendor/symfony/css-selector/Node/PseudoNode.php
index 0e413adc5488da85ff7ce1432b388888e4003c8a..c23ddd5912a6685cbf0b12d96d9ee0a9382709b7 100644
--- a/vendor/symfony/css-selector/Node/PseudoNode.php
+++ b/vendor/symfony/css-selector/Node/PseudoNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class PseudoNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/SelectorNode.php b/vendor/symfony/css-selector/Node/SelectorNode.php
index 4958da55afaf7a3124e5c7a9727dc5d3a0ae6ee2..729e0911b3c76d6e331af21272ec240b5f8d3917 100644
--- a/vendor/symfony/css-selector/Node/SelectorNode.php
+++ b/vendor/symfony/css-selector/Node/SelectorNode.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Node;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class SelectorNode extends AbstractNode
 {
diff --git a/vendor/symfony/css-selector/Node/Specificity.php b/vendor/symfony/css-selector/Node/Specificity.php
index 0ce0c3f3049ddf2253eb06eb35bfcc54e99d1eb8..a24b4fdf8403b98fc4d99fe27558896ac75b661c 100644
--- a/vendor/symfony/css-selector/Node/Specificity.php
+++ b/vendor/symfony/css-selector/Node/Specificity.php
@@ -20,6 +20,8 @@ namespace Symfony\Component\CssSelector\Node;
  * @see http://www.w3.org/TR/selectors/#specificity
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class Specificity
 {
diff --git a/vendor/symfony/css-selector/Parser/Handler/CommentHandler.php b/vendor/symfony/css-selector/Parser/Handler/CommentHandler.php
index f480776d2c446d4b5fdd3aedc345a73e6e025828..a29775cab370f46f7fa2594c64181b8f33d501a0 100644
--- a/vendor/symfony/css-selector/Parser/Handler/CommentHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/CommentHandler.php
@@ -21,6 +21,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class CommentHandler implements HandlerInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php b/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php
index 049ddd3ec4ca7735c604629e7bc7eab8238efc0c..a1297c80c089b8572346b3259b64b980b45d3944 100644
--- a/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php
+++ b/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php
@@ -21,6 +21,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 interface HandlerInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
index b144223fbd6fe3aa5c40708dafa5c4d348108af9..f74bda51262ac8e78f1b3ad673c2b438e10ff00d 100644
--- a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
@@ -24,6 +24,8 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class HashHandler implements HandlerInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
index 86739eab99acab0870a52a55eb37f8630056f803..358c7c14ad28adedb7dddde1476e8a396885b6f1 100644
--- a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
@@ -24,6 +24,8 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class IdentifierHandler implements HandlerInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
index 97a9387b18532cf45e1ae70777d25ee2e23106f5..4ea5c484b26fb5cbd3202579282d998fe246df7a 100644
--- a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
@@ -23,6 +23,8 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class NumberHandler implements HandlerInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
index 9f7a5946b02b17a251663cea3d56bc1f2b214a55..420529601609d0d1da608175f31bb25242472d03 100644
--- a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
@@ -26,6 +26,8 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class StringHandler implements HandlerInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php b/vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php
index 234bbd84cf668f5529dc6e64dc036ca66540b41c..4c2d3354fb83e9d6cb77129cb4799692b65cec32 100644
--- a/vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php
@@ -22,6 +22,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class WhitespaceHandler implements HandlerInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Parser.php b/vendor/symfony/css-selector/Parser/Parser.php
index 9625e3e8a1100432c87ce6b876eef9e639ae27d1..f94aea36a60429671ba65b002b68473b6f668e46 100644
--- a/vendor/symfony/css-selector/Parser/Parser.php
+++ b/vendor/symfony/css-selector/Parser/Parser.php
@@ -22,6 +22,8 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\Tokenizer;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class Parser implements ParserInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/ParserInterface.php b/vendor/symfony/css-selector/Parser/ParserInterface.php
index 3b43a52fde524312a10cf8cfb25c88777f43818f..c5af20367de8c889060c9eb952c3931311c2bf42 100644
--- a/vendor/symfony/css-selector/Parser/ParserInterface.php
+++ b/vendor/symfony/css-selector/Parser/ParserInterface.php
@@ -20,6 +20,8 @@ use Symfony\Component\CssSelector\Node\SelectorNode;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 interface ParserInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Reader.php b/vendor/symfony/css-selector/Parser/Reader.php
index ba2a7f0da95886d9251a4660ce22ed917e60e4e9..41136367d8600889d24948dd5d1f4f55430e6044 100644
--- a/vendor/symfony/css-selector/Parser/Reader.php
+++ b/vendor/symfony/css-selector/Parser/Reader.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Parser;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class Reader
 {
diff --git a/vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php b/vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php
index 83f8d13d9ccf22075df0e985487eab2bd51cb165..c513de5ff12ee68da5e992656be44a341a1b5b9e 100644
--- a/vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php
+++ b/vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php
@@ -23,6 +23,8 @@ use Symfony\Component\CssSelector\Parser\ParserInterface;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class ClassParser implements ParserInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php b/vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php
index 00e443553b4858eb008db8e53d86539f3fd435ea..c29f5e442e739960d88c0757bf1131c18cf8596c 100644
--- a/vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php
+++ b/vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php
@@ -22,6 +22,8 @@ use Symfony\Component\CssSelector\Parser\ParserInterface;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class ElementParser implements ParserInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php b/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php
index 98a08fde069ea82fa7dd647f497773df65d7279d..016cf0a848207d107c5fee3082fa8991eb8b19b5 100644
--- a/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php
+++ b/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php
@@ -26,6 +26,8 @@ use Symfony\Component\CssSelector\Parser\ParserInterface;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class EmptyStringParser implements ParserInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Shortcut/HashParser.php b/vendor/symfony/css-selector/Parser/Shortcut/HashParser.php
index 3dbad79d5b471c8da42716529914f3bdceea2501..3f3883bb8d2e91af8cbc3a5a79dfb387dc1d2259 100644
--- a/vendor/symfony/css-selector/Parser/Shortcut/HashParser.php
+++ b/vendor/symfony/css-selector/Parser/Shortcut/HashParser.php
@@ -23,6 +23,8 @@ use Symfony\Component\CssSelector\Parser\ParserInterface;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class HashParser implements ParserInterface
 {
diff --git a/vendor/symfony/css-selector/Parser/Token.php b/vendor/symfony/css-selector/Parser/Token.php
index 6f7586f612ed2568efd17cb66cfc0b8bcb0b1c93..68fac59b03a32bb4f70b0ce17515fdaaa42f3418 100644
--- a/vendor/symfony/css-selector/Parser/Token.php
+++ b/vendor/symfony/css-selector/Parser/Token.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Parser;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class Token
 {
diff --git a/vendor/symfony/css-selector/Parser/TokenStream.php b/vendor/symfony/css-selector/Parser/TokenStream.php
index c0525d7a833642e279016d779d12c2ba4dc9a32f..1ec727febfe0f7e6121c4781512151d458758151 100644
--- a/vendor/symfony/css-selector/Parser/TokenStream.php
+++ b/vendor/symfony/css-selector/Parser/TokenStream.php
@@ -21,6 +21,8 @@ use Symfony\Component\CssSelector\Exception\SyntaxErrorException;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class TokenStream
 {
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
index 79fa7b77d06fa7325ae55255e389c01dc9ff9baf..aa9fc5077341a329fd54b33742343e8c5a41fa6d 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
@@ -23,6 +23,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class Tokenizer
 {
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
index bf5096be9fde86ebeb723c91e68b69bc3bd5c71a..af4c31e5b09b82261d8a07d592c19822c75583f5 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Parser\Tokenizer;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class TokenizerEscaping
 {
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
index 326f0208219a648ddfbf5508da5d187ecb3dcefe..5b071cd090f84ffba64e24b3729eec6416e560b4 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\Parser\Tokenizer;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class TokenizerPatterns
 {
diff --git a/vendor/symfony/css-selector/README.md b/vendor/symfony/css-selector/README.md
index ffe6c890f6b350a8468a4fd139c46af4b8280497..eef2885898bc4e123063e98edef5fd0350652dea 100644
--- a/vendor/symfony/css-selector/README.md
+++ b/vendor/symfony/css-selector/README.md
@@ -7,9 +7,10 @@ The component only goal is to convert CSS selectors to their XPath
 equivalents:
 
 ```php
-use Symfony\Component\CssSelector\CssSelector;
+use Symfony\Component\CssSelector\CssSelectorConverter;
 
-print CssSelector::toXPath('div.item > h4 > a');
+$converter = new CssSelectorConverter();
+print $converter->toXPath('div.item > h4 > a');
 ```
 
 HTML and XML are different
@@ -17,15 +18,12 @@ HTML and XML are different
 
 The `CssSelector` component comes with an `HTML` extension which is enabled by
 default. If you need to use this component with `XML` documents, you have to
-disable this `HTML` extension. That's because, `HTML` tag & attribute names
-are always lower-cased, but case-sensitive in `XML`:
+disable this `HTML` extension. That's because, `HTML` tag & attribute names are
+always lower-cased, but case-sensitive in `XML`:
 
 ```php
 // disable `HTML` extension:
-CssSelector::disableHtmlExtension();
-
-// re-enable `HTML` extension:
-CssSelector::enableHtmlExtension();
+$converter = new CssSelectorConverter(false);
 ```
 
 When the `HTML` extension is enabled, tag names are lower-cased, attribute
@@ -45,3 +43,42 @@ You can run the unit tests with the following command:
     $ cd path/to/Symfony/Component/CssSelector/
     $ composer install
     $ phpunit
+
+License
+-------
+
+This component is a port of the Python cssselect library,
+which is copyright Ian Bicking, https://github.com/SimonSapin/cssselect.
+
+Copyright (c) 2007-2012 Ian Bicking and contributors. See AUTHORS
+for more details.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+
+3. Neither the name of Ian Bicking nor the names of its contributors may
+be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IAN BICKING OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/symfony/css-selector/Tests/CssSelectorConverterTest.php b/vendor/symfony/css-selector/Tests/CssSelectorConverterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..624909b41d2c522db018a6032f9ae9ebdbe64350
--- /dev/null
+++ b/vendor/symfony/css-selector/Tests/CssSelectorConverterTest.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\CssSelector\Tests;
+
+use Symfony\Component\CssSelector\CssSelectorConverter;
+
+class CssSelectorConverterTest extends \PHPUnit_Framework_TestCase
+{
+    public function testCssToXPath()
+    {
+        $converter = new CssSelectorConverter();
+
+        $this->assertEquals('descendant-or-self::*', $converter->toXPath(''));
+        $this->assertEquals('descendant-or-self::h1', $converter->toXPath('h1'));
+        $this->assertEquals("descendant-or-self::h1[@id = 'foo']", $converter->toXPath('h1#foo'));
+        $this->assertEquals("descendant-or-self::h1[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]", $converter->toXPath('h1.foo'));
+        $this->assertEquals('descendant-or-self::foo:h1', $converter->toXPath('foo|h1'));
+        $this->assertEquals('descendant-or-self::h1', $converter->toXPath('H1'));
+    }
+
+    public function testCssToXPathXml()
+    {
+        $converter = new CssSelectorConverter(false);
+
+        $this->assertEquals('descendant-or-self::H1', $converter->toXPath('H1'));
+    }
+
+    /**
+     * @expectedException \Symfony\Component\CssSelector\Exception\ParseException
+     * @expectedExceptionMessage Expected identifier, but <eof at 3> found.
+     */
+    public function testParseExceptions()
+    {
+        $converter = new CssSelectorConverter();
+        $converter->toXPath('h1:');
+    }
+
+    /** @dataProvider getCssToXPathWithoutPrefixTestData */
+    public function testCssToXPathWithoutPrefix($css, $xpath)
+    {
+        $converter = new CssSelectorConverter();
+
+        $this->assertEquals($xpath, $converter->toXPath($css, ''), '->parse() parses an input string and returns a node');
+    }
+
+    public function getCssToXPathWithoutPrefixTestData()
+    {
+        return array(
+            array('h1', 'h1'),
+            array('foo|h1', 'foo:h1'),
+            array('h1, h2, h3', 'h1 | h2 | h3'),
+            array('h1:nth-child(3n+1)', "*/*[name() = 'h1' and (position() - 1 >= 0 and (position() - 1) mod 3 = 0)]"),
+            array('h1 > p', 'h1/p'),
+            array('h1#foo', "h1[@id = 'foo']"),
+            array('h1.foo', "h1[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"),
+            array('h1[class*="foo bar"]', "h1[@class and contains(@class, 'foo bar')]"),
+            array('h1[foo|class*="foo bar"]', "h1[@foo:class and contains(@foo:class, 'foo bar')]"),
+            array('h1[class]', 'h1[@class]'),
+            array('h1 .foo', "h1/descendant-or-self::*/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"),
+            array('h1 #foo', "h1/descendant-or-self::*/*[@id = 'foo']"),
+            array('h1 [class*=foo]', "h1/descendant-or-self::*/*[@class and contains(@class, 'foo')]"),
+            array('div>.foo', "div/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"),
+            array('div > .foo', "div/*[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]"),
+        );
+    }
+}
diff --git a/vendor/symfony/css-selector/Tests/CssSelectorTest.php b/vendor/symfony/css-selector/Tests/CssSelectorTest.php
index 61ab80eec8d0b7fc3961cf6058c1b38e35b84fda..06eb0d2306b50f4c4c735383e6006d8575b81056 100644
--- a/vendor/symfony/css-selector/Tests/CssSelectorTest.php
+++ b/vendor/symfony/css-selector/Tests/CssSelectorTest.php
@@ -13,6 +13,9 @@ namespace Symfony\Component\CssSelector\Tests;
 
 use Symfony\Component\CssSelector\CssSelector;
 
+/**
+ * @group legacy
+ */
 class CssSelectorTest extends \PHPUnit_Framework_TestCase
 {
     public function testCssToXPath()
diff --git a/vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php b/vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php
index c70609c695d316f8f9748f6ad2312f3f1e5527cd..026ac06c79f21a657f80bc00ade72fe8ed1a2e2a 100644
--- a/vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\XPath\Extension;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 abstract class AbstractExtension implements ExtensionInterface
 {
diff --git a/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php b/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php
index cbe48c57a9a378dcd1cf75e612521cbe5d97c599..6ace8b5925969ccc11d4323b7eff474760e73f6d 100644
--- a/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php
@@ -21,6 +21,8 @@ use Symfony\Component\CssSelector\XPath\XPathExpr;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class AttributeMatchingExtension extends AbstractExtension
 {
diff --git a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
index 9ce018f13a73b7d7e209c5d87f4ee4026be92ea8..0d2d658b65c64fbeaac55bbd28f7f57273df7826 100644
--- a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
@@ -20,6 +20,8 @@ use Symfony\Component\CssSelector\XPath\XPathExpr;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class CombinationExtension extends AbstractExtension
 {
diff --git a/vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php b/vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php
index 9b47f24f361ba3d40465aca097baa85c29a4102f..3607022891f95d3de665822bffd828af948a34c0 100644
--- a/vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php
+++ b/vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\XPath\Extension;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 interface ExtensionInterface
 {
diff --git a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
index 41ece8a42208cb418bf96aba86f193e243e0b25a..ea05523055f65b7e32bb2cbbe6131fc912558b1d 100644
--- a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
@@ -25,6 +25,8 @@ use Symfony\Component\CssSelector\XPath\XPathExpr;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class FunctionExtension extends AbstractExtension
 {
diff --git a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
index 0da74d47273fb9b5c1fe0af4971f3ca4fd4d4306..de6ce41621bd4a23f015d7f8fe9409161eeb0730 100644
--- a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
@@ -23,6 +23,8 @@ use Symfony\Component\CssSelector\XPath\XPathExpr;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class HtmlExtension extends AbstractExtension
 {
diff --git a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
index 2b8920f1ab502601d73ab4c6d79a062c718e719a..9d7f8fa3f08ddb05b07e593d009c4bd42688a1bd 100644
--- a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
@@ -22,6 +22,8 @@ use Symfony\Component\CssSelector\XPath\XPathExpr;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class NodeExtension extends AbstractExtension
 {
diff --git a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
index 008ec2b4b15bbe3fa473719a05e82f8ba018d5a3..1c8b217e39c09857b4ef0590cabf59ed0392cb5d 100644
--- a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
@@ -21,6 +21,8 @@ use Symfony\Component\CssSelector\XPath\XPathExpr;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class PseudoClassExtension extends AbstractExtension
 {
diff --git a/vendor/symfony/css-selector/XPath/Translator.php b/vendor/symfony/css-selector/XPath/Translator.php
index 5053793ea06c9a19e7c495a645ea35ca1a733a32..8c021b3beea0ce7a5484b3a00e488251023483f5 100644
--- a/vendor/symfony/css-selector/XPath/Translator.php
+++ b/vendor/symfony/css-selector/XPath/Translator.php
@@ -25,6 +25,8 @@ use Symfony\Component\CssSelector\Parser\ParserInterface;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class Translator implements TranslatorInterface
 {
diff --git a/vendor/symfony/css-selector/XPath/TranslatorInterface.php b/vendor/symfony/css-selector/XPath/TranslatorInterface.php
index bc19ae86346c4d4d24ff581f966ccb1642a40097..0b5de83d5712487a6fdb7b8b403fe1e4314cf3a4 100644
--- a/vendor/symfony/css-selector/XPath/TranslatorInterface.php
+++ b/vendor/symfony/css-selector/XPath/TranslatorInterface.php
@@ -20,6 +20,8 @@ use Symfony\Component\CssSelector\Node\SelectorNode;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 interface TranslatorInterface
 {
diff --git a/vendor/symfony/css-selector/XPath/XPathExpr.php b/vendor/symfony/css-selector/XPath/XPathExpr.php
index c7ef97cb9a12e9879bd72ca931995efe4d16a6ad..420ef3d85c0b0d5d39eb43ece9ed67b9d788761c 100644
--- a/vendor/symfony/css-selector/XPath/XPathExpr.php
+++ b/vendor/symfony/css-selector/XPath/XPathExpr.php
@@ -18,6 +18,8 @@ namespace Symfony\Component\CssSelector\XPath;
  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
  *
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
  */
 class XPathExpr
 {
diff --git a/vendor/symfony/css-selector/composer.json b/vendor/symfony/css-selector/composer.json
index 99eb4da2da9d9835e18d29d32f10c92271da4b66..e5bbdcc0d7e0ac2fd9e2bbc53ddbd6531ea8b4e8 100644
--- a/vendor/symfony/css-selector/composer.json
+++ b/vendor/symfony/css-selector/composer.json
@@ -23,12 +23,15 @@
         "php": ">=5.3.9"
     },
     "autoload": {
-        "psr-4": { "Symfony\\Component\\CssSelector\\": "" }
+        "psr-4": { "Symfony\\Component\\CssSelector\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "2.7-dev"
+            "dev-master": "2.8-dev"
         }
     }
 }
diff --git a/vendor/symfony/process/Exception/ProcessFailedException.php b/vendor/symfony/process/Exception/ProcessFailedException.php
index 7523a5e9cd4ea2c16390e0904968777941f3df02..328acfde5e88358313c365de13738d70a66755f1 100644
--- a/vendor/symfony/process/Exception/ProcessFailedException.php
+++ b/vendor/symfony/process/Exception/ProcessFailedException.php
@@ -28,10 +28,11 @@ class ProcessFailedException extends RuntimeException
             throw new InvalidArgumentException('Expected a failed process, but the given process was successful.');
         }
 
-        $error = sprintf('The command "%s" failed.'."\nExit Code: %s(%s)",
+        $error = sprintf('The command "%s" failed.'."\n\nExit Code: %s(%s)\n\nWorking directory: %s",
             $process->getCommandLine(),
             $process->getExitCode(),
-            $process->getExitCodeText()
+            $process->getExitCodeText(),
+            $process->getWorkingDirectory()
         );
 
         if (!$process->isOutputDisabled()) {
diff --git a/vendor/symfony/process/PhpExecutableFinder.php b/vendor/symfony/process/PhpExecutableFinder.php
index f8f57cc536a2532246852078ec1228552a233176..fb297825fe364326262976c7c6d4b6fbc69bcfbb 100644
--- a/vendor/symfony/process/PhpExecutableFinder.php
+++ b/vendor/symfony/process/PhpExecutableFinder.php
@@ -35,14 +35,17 @@ class PhpExecutableFinder
      */
     public function find($includeArgs = true)
     {
+        $args = $this->findArguments();
+        $args = $includeArgs && $args ? ' '.implode(' ', $args) : '';
+
         // HHVM support
         if (defined('HHVM_VERSION')) {
-            return (getenv('PHP_BINARY') ?: PHP_BINARY).($includeArgs ? ' '.implode(' ', $this->findArguments()) : '');
+            return (getenv('PHP_BINARY') ?: PHP_BINARY).$args;
         }
 
         // PHP_BINARY return the current sapi executable
-        if (defined('PHP_BINARY') && PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server')) && is_file(PHP_BINARY)) {
-            return PHP_BINARY;
+        if (defined('PHP_BINARY') && PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server', 'phpdbg')) && is_file(PHP_BINARY)) {
+            return PHP_BINARY.$args;
         }
 
         if ($php = getenv('PHP_PATH')) {
@@ -76,9 +79,10 @@ class PhpExecutableFinder
     {
         $arguments = array();
 
-        // HHVM support
         if (defined('HHVM_VERSION')) {
             $arguments[] = '--php';
+        } elseif ('phpdbg' === PHP_SAPI) {
+            $arguments[] = '-qrr';
         }
 
         return $arguments;
diff --git a/vendor/symfony/process/PhpProcess.php b/vendor/symfony/process/PhpProcess.php
index 1adbd977adf8842accbb61d5cf776263ea29bde8..4a2a2625ffae03ffc69192d0917ce2592384d4b8 100644
--- a/vendor/symfony/process/PhpProcess.php
+++ b/vendor/symfony/process/PhpProcess.php
@@ -39,6 +39,13 @@ class PhpProcess extends Process
         if (false === $php = $executableFinder->find()) {
             $php = null;
         }
+        if ('phpdbg' === PHP_SAPI) {
+            $file = tempnam(sys_get_temp_dir(), 'dbg');
+            file_put_contents($file, $script);
+            register_shutdown_function('unlink', $file);
+            $php .= ' '.ProcessUtils::escapeArgument($file);
+            $script = null;
+        }
 
         parent::__construct($php, $cwd, $env, $script, $timeout, $options);
     }
diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php
index 699151f384921e7f4237752c075286545b85b844..c1e732170f9220dca10bd0ae4c83751a66e6db14 100644
--- a/vendor/symfony/process/Process.php
+++ b/vendor/symfony/process/Process.php
@@ -280,8 +280,20 @@ class Process
             }
         }
 
+        $ptsWorkaround = null;
+
+        if (!$this->useFileHandles && $this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
+            // Workaround for the bug, when PTS functionality is enabled.
+            // @see : https://bugs.php.net/69442
+            $ptsWorkaround = fopen(__FILE__, 'r');
+        }
+
         $this->process = proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $this->env, $this->options);
 
+        if ($ptsWorkaround) {
+            fclose($ptsWorkaround);
+        }
+
         if (!is_resource($this->process)) {
             throw new RuntimeException('Unable to launch a new process.');
         }
@@ -763,22 +775,14 @@ class Process
      * Stops the process.
      *
      * @param int|float $timeout The timeout in seconds
-     * @param int       $signal  A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL
+     * @param int       $signal  A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL (9)
      *
      * @return int The exit-code of the process
-     *
-     * @throws RuntimeException if the process got signaled
      */
     public function stop($timeout = 10, $signal = null)
     {
         $timeoutMicro = microtime(true) + $timeout;
         if ($this->isRunning()) {
-            if ('\\' === DIRECTORY_SEPARATOR && !$this->isSigchildEnabled()) {
-                exec(sprintf('taskkill /F /T /PID %d 2>&1', $this->getPid()), $output, $exitCode);
-                if ($exitCode > 0) {
-                    throw new RuntimeException('Unable to kill the process');
-                }
-            }
             // given `SIGTERM` may not be defined and that `proc_terminate` uses the constant value and not the constant itself, we use the same here
             $this->doSignal(15, false);
             do {
@@ -786,13 +790,9 @@ class Process
             } while ($this->isRunning() && microtime(true) < $timeoutMicro);
 
             if ($this->isRunning() && !$this->isSigchildEnabled()) {
-                if (null !== $signal || defined('SIGKILL')) {
-                    // avoid exception here :
-                    // process is supposed to be running, but it might have stop
-                    // just after this line.
-                    // in any case, let's silently discard the error, we can not do anything
-                    $this->doSignal($signal ?: SIGKILL, false);
-                }
+                // Avoid exception here: process is supposed to be running, but it might have stopped just
+                // after this line. In any case, let's silently discard the error, we cannot do anything.
+                $this->doSignal($signal ?: 9, false);
             }
         }
 
@@ -1461,7 +1461,18 @@ class Process
             return false;
         }
 
-        if (true !== @proc_terminate($this->process, $signal)) {
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            exec(sprintf('taskkill /F /T /PID %d 2>&1', $this->getPid()), $output, $exitCode);
+            if ($exitCode) {
+                if ($throwException) {
+                    throw new RuntimeException(sprintf('Unable to kill the process (%s).', implode(' ', $output)));
+                }
+
+                return false;
+            }
+        }
+
+        if (true !== @proc_terminate($this->process, $signal) && '\\' !== DIRECTORY_SEPARATOR) {
             if ($throwException) {
                 throw new RuntimeException(sprintf('Error while sending signal `%s`.', $signal));
             }
diff --git a/vendor/symfony/process/Tests/AbstractProcessTest.php b/vendor/symfony/process/Tests/AbstractProcessTest.php
index b2f60f9ffd98417b87b84e38797fd15d88e9d5e7..fca3729be8e2045dd5762ffe46c55d6254c07d5b 100644
--- a/vendor/symfony/process/Tests/AbstractProcessTest.php
+++ b/vendor/symfony/process/Tests/AbstractProcessTest.php
@@ -28,7 +28,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
     public static function setUpBeforeClass()
     {
         $phpBin = new PhpExecutableFinder();
-        self::$phpBin = $phpBin->find();
+        self::$phpBin = 'phpdbg' === PHP_SAPI ? 'php' : $phpBin->find();
     }
 
     public function testThatProcessDoesNotThrowWarningDuringRun()
@@ -81,7 +81,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
         // exec is mandatory here since we send a signal to the process
         // see https://github.com/symfony/symfony/issues/5030 about prepending
         // command with exec
-        $p = $this->getProcess('exec php '.__DIR__.'/NonStopableProcess.php 3');
+        $p = $this->getProcess('exec '.self::$phpBin.' '.__DIR__.'/NonStopableProcess.php 3');
         $p->start();
         usleep(100000);
         $start = microtime(true);
@@ -470,7 +470,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
             $this->markTestSkipped('Windows does have /dev/tty support');
         }
 
-        $process = $this->getProcess('echo "foo" >> /dev/null && php -r "usleep(100000);"');
+        $process = $this->getProcess('echo "foo" >> /dev/null && '.self::$phpBin.' -r "usleep(100000);"');
         $process->setTty(true);
         $process->start();
         $this->assertTrue($process->isRunning());
@@ -730,7 +730,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
 
         $termSignal = defined('SIGKILL') ? SIGKILL : 9;
 
-        $process = $this->getProcess('exec php -r "while (true) {}"');
+        $process = $this->getProcess('exec '.self::$phpBin.' -r "while (true) {}"');
         $process->start();
         posix_kill($process->getPid(), $termSignal);
 
@@ -756,18 +756,6 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
         $this->assertNotEquals($process1->getOutput(), $process2->getOutput());
     }
 
-    public function testPhpDeadlock()
-    {
-        $this->markTestSkipped('Can cause PHP to hang');
-
-        // Sleep doesn't work as it will allow the process to handle signals and close
-        // file handles from the other end.
-        $process = $this->getProcess(self::$phpBin.' -r "while (true) {}"');
-        $process->start();
-
-        // PHP will deadlock when it tries to cleanup $process
-    }
-
     public function testRunProcessWithTimeout()
     {
         $timeout = 0.5;
diff --git a/vendor/symfony/process/Tests/PhpExecutableFinderTest.php b/vendor/symfony/process/Tests/PhpExecutableFinderTest.php
index cd4abedc9df73641adf58559c7c85c45ad80ed73..87d0efe9ebf1f6ad8c469d1f989a305492b05207 100644
--- a/vendor/symfony/process/Tests/PhpExecutableFinderTest.php
+++ b/vendor/symfony/process/Tests/PhpExecutableFinderTest.php
@@ -43,7 +43,27 @@ class PhpExecutableFinderTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * tests find() with the env var PHP_PATH.
+     * tests find() with the constant PHP_BINARY.
+     *
+     * @requires PHP 5.4
+     */
+    public function testFind()
+    {
+        if (defined('HHVM_VERSION')) {
+            $this->markTestSkipped('Should not be executed in HHVM context.');
+        }
+
+        $f = new PhpExecutableFinder();
+
+        $current = PHP_BINARY;
+        $args = 'phpdbg' === PHP_SAPI ? ' -qrr' : '';
+
+        $this->assertEquals($current.$args, $f->find(), '::find() returns the executable PHP');
+        $this->assertEquals($current, $f->find(false), '::find() returns the executable PHP');
+    }
+
+    /**
+     * tests find() with the env var / constant PHP_BINARY with HHVM.
      */
     public function testFindWithHHVM()
     {
@@ -68,6 +88,8 @@ class PhpExecutableFinderTest extends \PHPUnit_Framework_TestCase
 
         if (defined('HHVM_VERSION')) {
             $this->assertEquals($f->findArguments(), array('--php'), '::findArguments() returns HHVM arguments');
+        } elseif ('phpdbg' === PHP_SAPI) {
+            $this->assertEquals($f->findArguments(), array('-qrr'), '::findArguments() returns phpdbg arguments');
         } else {
             $this->assertEquals($f->findArguments(), array(), '::findArguments() returns no arguments');
         }
diff --git a/vendor/symfony/process/Tests/PhpProcessTest.php b/vendor/symfony/process/Tests/PhpProcessTest.php
index 5dc546cc1ce6e47f63d1739d1558595573c9f7db..2cf79aa1a6d15306d215884258d3adc9ce51e729 100644
--- a/vendor/symfony/process/Tests/PhpProcessTest.php
+++ b/vendor/symfony/process/Tests/PhpProcessTest.php
@@ -30,6 +30,10 @@ PHP
 
     public function testCommandLine()
     {
+        if ('phpdbg' === PHP_SAPI) {
+            $this->markTestSkipped('phpdbg SAPI is not supported by this test.');
+        }
+
         $process = new PhpProcess(<<<PHP
 <?php echo 'foobar';
 PHP
diff --git a/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php b/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php
index de37353f9175276b8673f50855d27628c1cb4ac8..0d763a470d19edc33ddce653d6acaea7eb8290ef 100644
--- a/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php
+++ b/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php
@@ -51,10 +51,11 @@ class ProcessFailedExceptionTest extends \PHPUnit_Framework_TestCase
         $exitText = 'General error';
         $output = 'Command output';
         $errorOutput = 'FATAL: Unexpected error';
+        $workingDirectory = getcwd();
 
         $process = $this->getMock(
             'Symfony\Component\Process\Process',
-            array('isSuccessful', 'getOutput', 'getErrorOutput', 'getExitCode', 'getExitCodeText', 'isOutputDisabled'),
+            array('isSuccessful', 'getOutput', 'getErrorOutput', 'getExitCode', 'getExitCodeText', 'isOutputDisabled', 'getWorkingDirectory'),
             array($cmd)
         );
         $process->expects($this->once())
@@ -81,10 +82,14 @@ class ProcessFailedExceptionTest extends \PHPUnit_Framework_TestCase
             ->method('isOutputDisabled')
             ->will($this->returnValue(false));
 
+        $process->expects($this->once())
+            ->method('getWorkingDirectory')
+            ->will($this->returnValue($workingDirectory));
+
         $exception = new ProcessFailedException($process);
 
         $this->assertEquals(
-            "The command \"$cmd\" failed.\nExit Code: $exitCode($exitText)\n\nOutput:\n================\n{$output}\n\nError Output:\n================\n{$errorOutput}",
+            "The command \"$cmd\" failed.\n\nExit Code: $exitCode($exitText)\n\nWorking directory: {$workingDirectory}\n\nOutput:\n================\n{$output}\n\nError Output:\n================\n{$errorOutput}",
             $exception->getMessage()
         );
     }
@@ -98,10 +103,11 @@ class ProcessFailedExceptionTest extends \PHPUnit_Framework_TestCase
         $cmd = 'php';
         $exitCode = 1;
         $exitText = 'General error';
+        $workingDirectory = getcwd();
 
         $process = $this->getMock(
             'Symfony\Component\Process\Process',
-            array('isSuccessful', 'isOutputDisabled', 'getExitCode', 'getExitCodeText', 'getOutput', 'getErrorOutput'),
+            array('isSuccessful', 'isOutputDisabled', 'getExitCode', 'getExitCodeText', 'getOutput', 'getErrorOutput', 'getWorkingDirectory'),
             array($cmd)
         );
         $process->expects($this->once())
@@ -126,10 +132,14 @@ class ProcessFailedExceptionTest extends \PHPUnit_Framework_TestCase
             ->method('isOutputDisabled')
             ->will($this->returnValue(true));
 
+		$process->expects($this->once())
+            ->method('getWorkingDirectory')
+            ->will($this->returnValue($workingDirectory));
+
         $exception = new ProcessFailedException($process);
 
         $this->assertEquals(
-            "The command \"$cmd\" failed.\nExit Code: $exitCode($exitText)",
+            "The command \"$cmd\" failed.\n\nExit Code: $exitCode($exitText)\n\nWorking directory: {$workingDirectory}",
             $exception->getMessage()
         );
     }
diff --git a/vendor/symfony/process/Tests/SimpleProcessTest.php b/vendor/symfony/process/Tests/SimpleProcessTest.php
index b3ee5c00f8894cc68f1059ccb1ac7cf6206918b8..78f20eb100a03cbcae46a6e69476e2066d21fb2b 100644
--- a/vendor/symfony/process/Tests/SimpleProcessTest.php
+++ b/vendor/symfony/process/Tests/SimpleProcessTest.php
@@ -152,46 +152,37 @@ class SimpleProcessTest extends AbstractProcessTest
 
     public function testStopTerminatesProcessCleanly()
     {
-        try {
-            $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
-            $process->run(function () use ($process) {
-                $process->stop();
-            });
-        } catch (\RuntimeException $e) {
-            $this->fail('A call to stop() is not expected to cause wait() to throw a RuntimeException');
-        }
+        $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
+        $process->run(function () use ($process) {
+            $process->stop();
+        });
+        $this->assertTrue(true, 'A call to stop() is not expected to cause wait() to throw a RuntimeException');
     }
 
     public function testKillSignalTerminatesProcessCleanly()
     {
         $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
 
-        try {
-            $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
-            $process->run(function () use ($process) {
-                if ($process->isRunning()) {
-                    $process->signal(defined('SIGKILL') ? SIGKILL : 9);
-                }
-            });
-        } catch (\RuntimeException $e) {
-            $this->fail('A call to signal() is not expected to cause wait() to throw a RuntimeException');
-        }
+        $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
+        $process->run(function () use ($process) {
+            if ($process->isRunning()) {
+                $process->signal(defined('SIGKILL') ? SIGKILL : 9);
+            }
+        });
+        $this->assertTrue(true, 'A call to signal() is not expected to cause wait() to throw a RuntimeException');
     }
 
     public function testTermSignalTerminatesProcessCleanly()
     {
         $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
 
-        try {
-            $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
-            $process->run(function () use ($process) {
-                if ($process->isRunning()) {
-                    $process->signal(defined('SIGTERM') ? SIGTERM : 15);
-                }
-            });
-        } catch (\RuntimeException $e) {
-            $this->fail('A call to signal() is not expected to cause wait() to throw a RuntimeException');
-        }
+        $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
+        $process->run(function () use ($process) {
+            if ($process->isRunning()) {
+                $process->signal(defined('SIGTERM') ? SIGTERM : 15);
+            }
+        });
+        $this->assertTrue(true, 'A call to signal() is not expected to cause wait() to throw a RuntimeException');
     }
 
     public function testStopWithTimeoutIsActuallyWorking()
diff --git a/vendor/symfony/process/composer.json b/vendor/symfony/process/composer.json
index 8d21bafccaccde16586d9b628447abd4bea56212..b3cb5186fc9408d5849399c1e2b958899eb82ba7 100644
--- a/vendor/symfony/process/composer.json
+++ b/vendor/symfony/process/composer.json
@@ -19,12 +19,15 @@
         "php": ">=5.3.9"
     },
     "autoload": {
-        "psr-4": { "Symfony\\Component\\Process\\": "" }
+        "psr-4": { "Symfony\\Component\\Process\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "2.7-dev"
+            "dev-master": "2.8-dev"
         }
     }
 }
diff --git a/vendor/symfony/process/phpunit.xml.dist b/vendor/symfony/process/phpunit.xml.dist
index b5d605c2efbbe78d98abc9802518245914f422c3..788500084abf8474b65b4c16cbd7b141f0cd6253 100644
--- a/vendor/symfony/process/phpunit.xml.dist
+++ b/vendor/symfony/process/phpunit.xml.dist
@@ -21,6 +21,7 @@
             <directory>./</directory>
             <exclude>
                 <directory>./Tests</directory>
+                <directory>./vendor</directory>
             </exclude>
         </whitelist>
     </filter>