You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ja...@apache.org on 2018/10/09 09:09:05 UTC

[01/27] lucene-solr:solr7896-login-page: WIP testing HTTP interceptors

Repository: lucene-solr
Updated Branches:
  refs/heads/solr7896-login-page [created] 954cbf127


WIP testing HTTP interceptors


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/0fc0ff23
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/0fc0ff23
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/0fc0ff23

Branch: refs/heads/solr7896-login-page
Commit: 0fc0ff23ae91509cc135dfa425df469559dd76a0
Parents: 1c8ab33
Author: Jan Høydahl <ja...@apache.org>
Authored: Thu Apr 19 11:23:43 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Thu Apr 19 11:23:43 2018 +0200

----------------------------------------------------------------------
 solr/bin/solr.in.sh               |  8 ++++++++
 solr/webapp/web/js/angular/app.js | 24 ++++++++++++++++++++++++
 2 files changed, 32 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0fc0ff23/solr/bin/solr.in.sh
----------------------------------------------------------------------
diff --git a/solr/bin/solr.in.sh b/solr/bin/solr.in.sh
index 7cf6a84..04ac46c 100644
--- a/solr/bin/solr.in.sh
+++ b/solr/bin/solr.in.sh
@@ -171,3 +171,11 @@
 #SOLR_RECOMMENDED_MAX_PROCESSES=
 #SOLR_ULIMIT_CHECKS=
 
+
+# The following lines added by ./solr for enabling BasicAuth
+# SOLR_AUTH_TYPE="basic"
+# SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/Users/janhoy/git/lucene-solr/solr/server/solr/basicAuth.conf"
+
+# The following lines added by ./solr for enabling BasicAuth
+SOLR_AUTH_TYPE="basic"
+SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/Users/janhoy/git/lucene-solr/solr/server/solr/basicAuth.conf"

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0fc0ff23/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index ad96ce0..ee420d3 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -369,8 +369,32 @@ solrAdminApp.config([
 
   return {request: started, response: ended, responseError: failed};
 })
+.factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
+  var started = function(config) {
+    config.headers['Authorization'] = "Basic c29scjpTb2xyUm9ja3M="; // solr / solrRocks
+    console.log("Added authorization header");
+    return config || $q.when(config);
+  };
+
+  var ended = function(response) {
+    if (response.headers['WWW-Authenticate'] != null) {
+      console.log("Got WWW-Authenticate header");
+      alert("WWW-Authenticate: " + response.headers['WWW-Authenticate']);
+    }
+    return response || $q.when(response);
+  };
+
+  var failed = function(rejection) {
+    console.log("Failed with rejection " + rejection);
+    $rootScope.$broadcast('loadingStatusInactive');
+    return $q.reject(rejection);
+  };
+
+  return {request: started, response: ended, responseError: failed};
+})
 .config(function($httpProvider) {
   $httpProvider.interceptors.push("httpInterceptor");
+  $httpProvider.interceptors.push("authInterceptor");
 })
 .directive('fileModel', function ($parse) {
     return {


[10/27] lucene-solr:solr7896-login-page: Enable auth interceptor and hardcoded pw

Posted by ja...@apache.org.
Enable auth interceptor and hardcoded pw


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/d531b923
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/d531b923
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/d531b923

Branch: refs/heads/solr7896-login-page
Commit: d531b92358ceb6317bfe2ad041e53c9d1d04a6c6
Parents: 4457de3
Author: Jan Høydahl <ja...@apache.org>
Authored: Wed Aug 8 16:24:47 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Wed Aug 8 16:24:47 2018 +0200

----------------------------------------------------------------------
 solr/webapp/web/js/angular/app.js | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d531b923/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 9be1ee5..3f781cd 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -371,7 +371,7 @@ solrAdminApp.config([
 })
 .factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
   var started = function(config) {
-    var ah = "Basic c29scjpzb2xyUm9ja3M=";  // solr / solrRocks
+    var ah = "Basic c29scjpTb2xyUm9ja3M=";  // solr / SolrRocks
     config.headers['Authorization'] = ah;
     console.log("Added authorization header " + ah);
     return config || $q.when(config);
@@ -389,6 +389,8 @@ solrAdminApp.config([
     console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
     if (rejection.status === 401) {
       console.log("Status code is 401");
+    } else {
+      console.log("Rejection status is " + rejection.status)
     }
     $rootScope.$broadcast('loadingStatusInactive');
     return $q.reject(rejection);
@@ -398,7 +400,7 @@ solrAdminApp.config([
 })
 .config(function($httpProvider) {
   $httpProvider.interceptors.push("httpInterceptor");
-  //$httpProvider.interceptors.push("authInterceptor");
+  $httpProvider.interceptors.push("authInterceptor");
   // Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
   // so that the browser will not intercept the login dialogue
   $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';


[09/27] lucene-solr:solr7896-login-page: Merge branch 'master' into solr7896-login-page

Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page

# Conflicts:
#	solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/4457de36
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/4457de36
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/4457de36

Branch: refs/heads/solr7896-login-page
Commit: 4457de36b1d5795cb774621afd6358c8c41ee62b
Parents: 5728c9b 6845bbf
Author: Jan Høydahl <ja...@apache.org>
Authored: Wed Aug 8 16:02:19 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Wed Aug 8 16:02:19 2018 +0200

----------------------------------------------------------------------
 build.xml                                       |     4 +-
 dev-tools/doap/lucene.rdf                       |    28 +
 dev-tools/doap/solr.rdf                         |    28 +
 dev-tools/idea/.idea/ant.xml                    |     2 -
 dev-tools/idea/.idea/modules.xml                |     2 -
 dev-tools/idea/.idea/workspace.xml              |    18 -
 .../idea/lucene/analysis/uima/analysis-uima.iml |    30 -
 dev-tools/idea/solr/contrib/uima/uima.iml       |    36 -
 .../maven/lucene/analysis/pom.xml.template      |     1 -
 .../maven/lucene/analysis/uima/pom.xml.template |    74 -
 dev-tools/maven/solr/contrib/pom.xml.template   |     1 -
 .../maven/solr/contrib/uima/pom.xml.template    |    83 -
 dev-tools/scripts/SOLR-2452.patch.hack.pl       |    15 -
 dev-tools/scripts/addVersion.py                 |     1 -
 dev-tools/scripts/jenkins.build.ref.guide.sh    |     6 +-
 dev-tools/scripts/reproduceJenkinsFailures.py   |    12 +-
 .../test-patch/lucene-solr-yetus-personality.sh |     2 +-
 lucene/CHANGES.txt                              |   325 +-
 lucene/MIGRATE.txt                              |    56 +
 lucene/analysis/README.txt                      |     6 -
 lucene/analysis/build.xml                       |     7 +-
 lucene/analysis/common/build.xml                |     1 +
 .../lucene/analysis/bg/BulgarianAnalyzer.java   |    10 +-
 .../lucene/analysis/bn/BengaliAnalyzer.java     |    17 +-
 .../lucene/analysis/br/BrazilianAnalyzer.java   |     8 +-
 .../lucene/analysis/ca/CatalanAnalyzer.java     |    11 +-
 .../lucene/analysis/ckb/SoraniAnalyzer.java     |     9 +-
 .../commongrams/CommonGramsFilterFactory.java   |     8 +-
 .../lucene/analysis/core/StopAnalyzer.java      |    12 -
 .../lucene/analysis/core/StopFilterFactory.java |     7 +-
 .../lucene/analysis/custom/CustomAnalyzer.java  |   208 +-
 .../lucene/analysis/cz/CzechAnalyzer.java       |    13 +-
 .../lucene/analysis/da/DanishAnalyzer.java      |    10 +-
 .../lucene/analysis/de/GermanAnalyzer.java      |     9 +-
 .../lucene/analysis/el/GreekAnalyzer.java       |     8 +-
 .../lucene/analysis/en/EnglishAnalyzer.java     |    42 +-
 .../lucene/analysis/es/SpanishAnalyzer.java     |    10 +-
 .../lucene/analysis/eu/BasqueAnalyzer.java      |    10 +-
 .../lucene/analysis/fa/PersianAnalyzer.java     |     4 +-
 .../lucene/analysis/fi/FinnishAnalyzer.java     |    10 +-
 .../lucene/analysis/fr/FrenchAnalyzer.java      |    11 +-
 .../lucene/analysis/ga/IrishAnalyzer.java       |     9 +-
 .../lucene/analysis/gl/GalicianAnalyzer.java    |    10 +-
 .../lucene/analysis/hi/HindiAnalyzer.java       |     4 +-
 .../lucene/analysis/hu/HungarianAnalyzer.java   |    10 +-
 .../lucene/analysis/hunspell/Dictionary.java    |     8 +-
 .../lucene/analysis/hy/ArmenianAnalyzer.java    |    10 +-
 .../lucene/analysis/id/IndonesianAnalyzer.java  |    10 +-
 .../lucene/analysis/it/ItalianAnalyzer.java     |     9 +-
 .../lucene/analysis/lt/LithuanianAnalyzer.java  |    10 +-
 .../lucene/analysis/lv/LatvianAnalyzer.java     |    10 +-
 .../miscellaneous/ConcatenateGraphFilter.java   |   375 +
 .../ConcatenateGraphFilterFactory.java          |    70 +
 .../miscellaneous/ConditionalTokenFilter.java   |   233 +
 .../ConditionalTokenFilterFactory.java          |    85 +
 .../miscellaneous/FingerprintFilter.java        |     4 +-
 .../miscellaneous/ProtectedTermFilter.java      |    53 +
 .../ProtectedTermFilterFactory.java             |   163 +
 .../miscellaneous/WordDelimiterFilter.java      |    20 +-
 .../miscellaneous/WordDelimiterGraphFilter.java |    19 +-
 .../analysis/ngram/EdgeNGramFilterFactory.java  |    10 +-
 .../analysis/ngram/EdgeNGramTokenFilter.java    |    91 +-
 .../analysis/ngram/NGramFilterFactory.java      |    10 +-
 .../lucene/analysis/ngram/NGramTokenFilter.java |    99 +-
 .../lucene/analysis/nl/DutchAnalyzer.java       |    12 +-
 .../lucene/analysis/no/NorwegianAnalyzer.java   |    10 +-
 .../lucene/analysis/pt/PortugueseAnalyzer.java  |    10 +-
 .../lucene/analysis/ro/RomanianAnalyzer.java    |    10 +-
 .../lucene/analysis/ru/RussianAnalyzer.java     |    10 +-
 .../analysis/shingle/FixedShingleFilter.java    |     1 +
 .../analysis/standard/ASCIITLD.jflex-macro      |   263 +-
 .../analysis/standard/ClassicAnalyzer.java      |     4 +-
 .../standard/StandardFilterFactory.java         |    50 -
 .../standard/UAX29URLEmailAnalyzer.java         |    10 +-
 .../standard/UAX29URLEmailTokenizerImpl.java    | 47679 +++++++++--------
 .../standard/UAX29URLEmailTokenizerImpl.jflex   |    26 +-
 .../lucene/analysis/standard/package.html       |     6 +-
 .../lucene/analysis/sv/SwedishAnalyzer.java     |    10 +-
 .../lucene/analysis/synonym/SynonymFilter.java  |     4 +-
 .../analysis/synonym/WordnetSynonymParser.java  |     7 +-
 .../lucene/analysis/tr/TurkishAnalyzer.java     |    10 +-
 .../analysis/util/AbstractAnalysisFactory.java  |    20 +-
 .../lucene/analysis/util/UnicodeProps.java      |     6 +-
 ...ache.lucene.analysis.util.TokenFilterFactory |     3 +-
 .../lucene/analysis/core/TestAnalyzers.java     |     9 +-
 .../analysis/core/TestBugInSomething.java       |     2 +-
 .../lucene/analysis/core/TestRandomChains.java  |    86 +-
 .../lucene/analysis/core/TestStopAnalyzer.java  |     5 +-
 .../analysis/core/TestStopFilterFactory.java    |     3 +-
 .../analysis/custom/TestCustomAnalyzer.java     |    56 +-
 .../TestConcatenateGraphFilter.java             |   168 +
 .../TestConcatenateGraphFilterFactory.java      |    83 +
 .../TestConditionalTokenFilter.java             |   468 +
 .../miscellaneous/TestFingerprintFilter.java    |     9 +
 .../miscellaneous/TestProtectedTermFilter.java  |    48 +
 .../TestProtectedTermFilterFactory.java         |   128 +
 .../miscellaneous/TestWordDelimiterFilter.java  |    71 +-
 .../TestWordDelimiterGraphFilter.java           |    80 +-
 .../analysis/miscellaneous/protected-1.txt      |    17 +
 .../analysis/miscellaneous/protected-2.txt      |    17 +
 .../ngram/EdgeNGramTokenFilterTest.java         |   132 +-
 .../analysis/ngram/NGramTokenFilterTest.java    |   139 +-
 .../analysis/ngram/NGramTokenizerTest.java      |     3 +-
 .../lucene/analysis/ngram/TestNGramFilters.java |    18 +-
 .../analysis/sinks/TestTeeSinkTokenFilter.java  |    11 +-
 .../standard/TestStandardFactories.java         |     5 -
 .../standard/TestUAX29URLEmailTokenizer.java    |   158 +
 .../lucene/analysis/th/TestThaiAnalyzer.java    |     4 +-
 .../TestWikipediaTokenizerFactory.java          |     6 +-
 .../standard/GenerateJflexTLDMacros.java        |   148 +-
 lucene/analysis/icu/src/data/uax29/Default.rbbi |    46 +-
 .../icu/src/data/utr30/DiacriticFolding.txt     |     4 +
 .../icu/src/data/utr30/NativeDigitFolding.txt   |    20 +
 .../icu/segmentation/BreakIteratorWrapper.java  |    12 +-
 lucene/analysis/icu/src/java/overview.html      |     2 +-
 .../analysis/icu/segmentation/Default.brk       |   Bin 50760 -> 43176 bytes
 .../icu/segmentation/MyanmarSyllable.brk        |   Bin 21272 -> 21808 bytes
 .../org/apache/lucene/analysis/icu/utr30.nrm    |   Bin 59056 -> 59232 bytes
 .../Latin-dont-break-on-hyphens.rbbi            |   187 +-
 .../icu/segmentation/TestICUTokenizer.java      |    15 +
 .../analysis/ja/TestJapaneseAnalyzer.java       |     2 +-
 .../analysis/ja/TestJapaneseTokenizer.java      |    12 +-
 .../analysis/morfologik/MorfologikAnalyzer.java |    11 +-
 .../uk/UkrainianMorfologikAnalyzer.java         |     9 +-
 .../morfologik/TestMorfologikAnalyzer.java      |     4 +-
 ...ache.lucene.analysis.util.TokenFilterFactory |     1 +
 lucene/analysis/opennlp/build.xml               |    16 +-
 lucene/analysis/opennlp/ivy.xml                 |     1 -
 .../lucene/analysis/opennlp/en-test-chunker.bin |   Bin 89915 -> 89914 bytes
 .../analysis/opennlp/en-test-lemmatizer.bin     |   Bin 7370 -> 7370 bytes
 .../analysis/opennlp/en-test-ner-person.bin     |   Bin 1700 -> 0 bytes
 .../lucene/analysis/opennlp/en-test-ner.bin     |   Bin 0 -> 2049 bytes
 .../analysis/opennlp/en-test-pos-maxent.bin     |   Bin 18424 -> 18494 bytes
 .../lucene/analysis/opennlp/en-test-sent.bin    |   Bin 1050 -> 1051 bytes
 .../analysis/opennlp/en-test-tokenizer.bin      |   Bin 15096 -> 15100 bytes
 .../opennlp/src/tools/test-model-data/ner.txt   |   143 +
 .../src/tools/test-model-data/ner_flashman.txt  |   143 -
 .../lucene/analysis/cn/smart/CharType.java      |     5 +
 .../lucene/analysis/cn/smart/Utility.java       |     4 +
 .../analysis/cn/smart/hhmm/HHMMSegmenter.java   |    18 +-
 .../cn/smart/TestSmartChineseAnalyzer.java      |    53 +-
 .../lucene/analysis/pl/PolishAnalyzer.java      |    10 +-
 .../src/java/org/egothor/stemmer/Trie.java      |    16 +-
 lucene/analysis/uima/build.xml                  |    50 -
 lucene/analysis/uima/ivy.xml                    |    30 -
 .../lucene/analysis/uima/BaseUIMATokenizer.java |    96 -
 .../analysis/uima/UIMAAnnotationsTokenizer.java |    90 -
 .../uima/UIMAAnnotationsTokenizerFactory.java   |    47 -
 .../lucene/analysis/uima/UIMABaseAnalyzer.java  |    44 -
 .../analysis/uima/UIMATypeAwareAnalyzer.java    |    44 -
 .../uima/UIMATypeAwareAnnotationsTokenizer.java |   113 -
 ...IMATypeAwareAnnotationsTokenizerFactory.java |    50 -
 .../lucene/analysis/uima/ae/AEProvider.java     |    34 -
 .../analysis/uima/ae/AEProviderFactory.java     |    76 -
 .../analysis/uima/ae/BasicAEProvider.java       |    87 -
 .../uima/ae/OverridingParamsAEProvider.java     |    69 -
 .../lucene/analysis/uima/ae/package-info.java   |    21 -
 .../lucene/analysis/uima/package-info.java      |    21 -
 lucene/analysis/uima/src/java/overview.html     |    29 -
 ...apache.lucene.analysis.util.TokenizerFactory |    17 -
 .../src/resources/uima/AggregateSentenceAE.xml  |    70 -
 .../test-files/uima/TestAggregateSentenceAE.xml |    55 -
 .../test-files/uima/TestEntityAnnotatorAE.xml   |    66 -
 .../src/test-files/uima/TestPoSTaggerAE.xml     |    44 -
 .../src/test-files/uima/TestWSTokenizerAE.xml   |    78 -
 .../analysis/uima/UIMABaseAnalyzerTest.java     |   137 -
 .../uima/UIMATypeAwareAnalyzerTest.java         |    70 -
 .../analysis/uima/ae/AEProviderFactoryTest.java |    44 -
 .../analysis/uima/ae/BasicAEProviderTest.java   |    36 -
 .../uima/ae/OverridingParamsAEProviderTest.java |    59 -
 .../analysis/uima/an/SampleEntityAnnotator.java |    64 -
 .../analysis/uima/an/SamplePoSTagger.java       |    57 -
 .../uima/an/SampleWSTokenizerAnnotator.java     |    66 -
 .../index/TestBackwardsCompatibility.java       |    16 +-
 .../org/apache/lucene/index/index.7.3.1-cfs.zip |   Bin 0 -> 15652 bytes
 .../apache/lucene/index/index.7.3.1-nocfs.zip   |   Bin 0 -> 15640 bytes
 .../org/apache/lucene/index/index.7.4.0-cfs.zip |   Bin 0 -> 15484 bytes
 .../apache/lucene/index/index.7.4.0-nocfs.zip   |   Bin 0 -> 15493 bytes
 .../org/apache/lucene/index/sorted.7.3.1.zip    |   Bin 0 -> 80784 bytes
 .../org/apache/lucene/index/sorted.7.4.0.zip    |   Bin 0 -> 158939 bytes
 .../lucene/index/unsupported.6.6.4-cfs.zip      |   Bin 0 -> 15782 bytes
 .../lucene/index/unsupported.6.6.4-nocfs.zip    |   Bin 0 -> 15771 bytes
 .../lucene/index/unsupported.6.6.5-cfs.zip      |   Bin 0 -> 15765 bytes
 .../lucene/index/unsupported.6.6.5-nocfs.zip    |   Bin 0 -> 15763 bytes
 .../conf/english-porter-comparison.alg          |     6 +-
 .../lucene/benchmark/byTask/tasks/ReadTask.java |    18 +-
 .../byTask/tasks/SearchWithCollectorTask.java   |     2 +-
 .../byTask/tasks/SearchWithSortTask.java        |    18 -
 .../lucene/benchmark/byTask/utils/Config.java   |     2 +-
 .../benchmark/byTask/feeds/DocMakerTest.java    |     2 +-
 .../byTask/feeds/LineDocSourceTest.java         |     2 +-
 lucene/build.xml                                |     1 -
 .../lucene/classification/BM25NBClassifier.java |     4 +-
 .../classification/KNearestFuzzyClassifier.java |     2 +-
 .../KNearestNeighborClassifier.java             |     2 +-
 .../classification/utils/DatasetSplitter.java   |     4 +-
 .../classification/BM25NBClassifierTest.java    |     2 +-
 .../CachingNaiveBayesClassifierTest.java        |     2 +-
 .../SimpleNaiveBayesClassifierTest.java         |     2 +-
 .../codecs/blockterms/BlockTermsReader.java     |     7 +-
 .../codecs/blockterms/BlockTermsWriter.java     |    10 +-
 .../blocktreeords/OrdsIntersectTermsEnum.java   |     5 +-
 .../blocktreeords/OrdsSegmentTermsEnum.java     |     5 +-
 .../bloom/BloomFilteringPostingsFormat.java     |     7 +-
 .../codecs/memory/DirectPostingsFormat.java     |     9 +-
 .../lucene/codecs/memory/FSTOrdTermsReader.java |     7 +-
 .../lucene/codecs/memory/FSTTermsReader.java    |     5 +-
 .../codecs/memory/MemoryDocValuesConsumer.java  |   539 -
 .../codecs/memory/MemoryDocValuesFormat.java    |    72 -
 .../codecs/memory/MemoryDocValuesProducer.java  |   878 -
 .../codecs/memory/MemoryPostingsFormat.java     |  1038 -
 .../codecs/simpletext/SimpleTextBKDWriter.java  |    10 +-
 .../simpletext/SimpleTextFieldInfosFormat.java  |    11 +-
 .../simpletext/SimpleTextFieldsReader.java      |     5 +-
 .../simpletext/SimpleTextLiveDocsFormat.java    |    43 +-
 .../simpletext/SimpleTextSegmentInfoFormat.java |     3 +-
 .../simpletext/SimpleTextTermVectorsReader.java |     7 +-
 .../org.apache.lucene.codecs.DocValuesFormat    |     1 -
 .../org.apache.lucene.codecs.PostingsFormat     |     2 +-
 .../memory/TestMemoryDocValuesFormat.java       |    39 -
 .../codecs/memory/TestMemoryPostingsFormat.java |    35 -
 .../TestSimpleTextLiveDocsFormat.java           |    29 +
 lucene/common-build.xml                         |     2 -
 .../org/apache/lucene/analysis/Analyzer.java    |     2 -
 .../lucene/analysis/FilteringTokenFilter.java   |     2 -
 .../lucene/analysis/TokenStreamToAutomaton.java |     8 +-
 .../analysis/standard/StandardAnalyzer.java     |    38 +-
 .../analysis/standard/StandardFilter.java       |    39 -
 .../lucene/analysis/standard/package-info.java  |     1 -
 .../codecs/CompetitiveFreqNormAccumulator.java  |   163 -
 .../codecs/CompetitiveImpactAccumulator.java    |   127 +
 .../apache/lucene/codecs/LiveDocsFormat.java    |     9 +-
 .../lucene/codecs/PostingsReaderBase.java       |     3 +-
 .../codecs/blocktree/IntersectTermsEnum.java    |     5 +-
 .../codecs/blocktree/SegmentTermsEnum.java      |     5 +-
 .../CompressingStoredFieldsIndexReader.java     |    25 +-
 .../CompressingStoredFieldsWriter.java          |     5 +-
 .../CompressingTermVectorsReader.java           |     6 +-
 .../CompressingTermVectorsWriter.java           |     8 +-
 .../lucene50/Lucene50FieldInfosFormat.java      |     2 +-
 .../codecs/lucene50/Lucene50LiveDocsFormat.java |    42 +-
 .../codecs/lucene50/Lucene50PostingsReader.java |    39 +-
 .../codecs/lucene50/Lucene50PostingsWriter.java |     4 +-
 .../lucene50/Lucene50ScoreSkipReader.java       |   141 +-
 .../codecs/lucene50/Lucene50SkipReader.java     |     3 +-
 .../codecs/lucene50/Lucene50SkipWriter.java     |    36 +-
 .../lucene60/Lucene60FieldInfosFormat.java      |     8 +-
 .../lucene70/Lucene70DocValuesProducer.java     |     3 +-
 .../apache/lucene/document/FeatureField.java    |   107 +-
 .../apache/lucene/document/FeatureQuery.java    |    37 +-
 .../document/LatLonDocValuesBoxQuery.java       |   153 +
 .../document/LatLonDocValuesDistanceQuery.java  |   140 +
 .../lucene/document/LatLonDocValuesField.java   |   181 +
 .../org/apache/lucene/document/LatLonPoint.java |   255 +
 .../document/LatLonPointDistanceComparator.java |   229 +
 .../document/LatLonPointDistanceQuery.java      |   390 +
 .../document/LatLonPointInPolygonQuery.java     |   214 +
 .../lucene/document/LatLonPointSortField.java   |   100 +
 .../lucene/document/NumericDocValuesField.java  |    12 +-
 .../java/org/apache/lucene/geo/GeoUtils.java    |    38 +
 .../src/java/org/apache/lucene/geo/Polygon.java |    79 +-
 .../java/org/apache/lucene/geo/Polygon2D.java   |   169 +-
 .../index/BinaryDocValuesFieldUpdates.java      |   174 +-
 .../lucene/index/BinaryDocValuesWriter.java     |     5 +
 .../apache/lucene/index/BufferedUpdates.java    |    62 +-
 .../lucene/index/BufferedUpdatesStream.java     |   134 +-
 .../org/apache/lucene/index/CheckIndex.java     |   265 +-
 .../lucene/index/DefaultIndexingChain.java      |    68 +
 .../org/apache/lucene/index/DocConsumer.java    |     9 +
 .../lucene/index/DocValuesFieldUpdates.java     |   328 +-
 .../apache/lucene/index/DocValuesUpdate.java    |   116 +-
 .../apache/lucene/index/DocValuesWriter.java    |     3 +
 .../apache/lucene/index/DocumentsWriter.java    |   270 +-
 .../index/DocumentsWriterDeleteQueue.java       |     7 +-
 .../index/DocumentsWriterFlushControl.java      |     4 +-
 .../lucene/index/DocumentsWriterFlushQueue.java |   180 +-
 .../lucene/index/DocumentsWriterPerThread.java  |    74 +-
 .../java/org/apache/lucene/index/FieldInfo.java |    18 +-
 .../org/apache/lucene/index/FieldInfos.java     |    53 +-
 .../apache/lucene/index/FilterCodecReader.java  |    23 +
 .../apache/lucene/index/FilterLeafReader.java   |    10 +-
 .../apache/lucene/index/FilterMergePolicy.java  |    24 +-
 .../apache/lucene/index/FilteredTermsEnum.java  |     5 +-
 .../lucene/index/FlushByRamOrCountsPolicy.java  |     5 +-
 .../org/apache/lucene/index/FreqProxFields.java |     3 +-
 .../lucene/index/FreqProxTermsWriter.java       |     4 +-
 .../lucene/index/FrozenBufferedUpdates.java     |   252 +-
 .../java/org/apache/lucene/index/Impact.java    |    61 +
 .../java/org/apache/lucene/index/Impacts.java   |    54 +
 .../org/apache/lucene/index/ImpactsEnum.java    |    30 +-
 .../org/apache/lucene/index/ImpactsSource.java  |    54 +
 .../apache/lucene/index/IndexFileDeleter.java   |     8 +-
 .../org/apache/lucene/index/IndexWriter.java    |  1158 +-
 .../apache/lucene/index/LeafReaderContext.java  |     4 +-
 .../lucene/index/LogByteSizeMergePolicy.java    |     4 +-
 .../apache/lucene/index/LogDocMergePolicy.java  |     4 +-
 .../org/apache/lucene/index/LogMergePolicy.java |   134 +-
 .../org/apache/lucene/index/MergePolicy.java    |   135 +-
 .../org/apache/lucene/index/MergeTrigger.java   |     2 +-
 .../org/apache/lucene/index/MultiFields.java    |     6 +-
 .../org/apache/lucene/index/MultiTermsEnum.java |     5 +-
 .../org/apache/lucene/index/NoMergePolicy.java  |    14 +-
 .../index/NumericDocValuesFieldUpdates.java     |   155 +-
 .../lucene/index/NumericDocValuesWriter.java    |     5 +
 .../index/OneMergeWrappingMergePolicy.java      |    12 +-
 .../apache/lucene/index/ParallelLeafReader.java |     7 +-
 .../org/apache/lucene/index/PendingDeletes.java |   121 +-
 .../apache/lucene/index/PendingSoftDeletes.java |   111 +-
 .../org/apache/lucene/index/PointValues.java    |     3 +-
 .../org/apache/lucene/index/PostingsEnum.java   |     9 -
 .../org/apache/lucene/index/ReaderPool.java     |   412 +
 .../apache/lucene/index/ReadersAndUpdates.java  |   437 +-
 .../apache/lucene/index/SegmentCommitInfo.java  |    34 +-
 .../org/apache/lucene/index/SegmentInfos.java   |    19 +-
 .../org/apache/lucene/index/SegmentMerger.java  |     1 +
 .../org/apache/lucene/index/SegmentReader.java  |    70 +-
 .../apache/lucene/index/SegmentWriteState.java  |    10 +-
 .../apache/lucene/index/SlowImpactsEnum.java    |    39 +-
 .../SoftDeletesDirectoryReaderWrapper.java      |    70 +-
 .../index/SoftDeletesRetentionMergePolicy.java  |    60 +-
 .../lucene/index/SortedDocValuesTermsEnum.java  |     3 +-
 .../lucene/index/SortedDocValuesWriter.java     |     5 +
 .../index/SortedNumericDocValuesWriter.java     |     5 +
 .../index/SortedSetDocValuesTermsEnum.java      |     3 +-
 .../lucene/index/SortedSetDocValuesWriter.java  |     6 +-
 .../apache/lucene/index/SortingLeafReader.java  |     6 +-
 .../index/SortingStoredFieldsConsumer.java      |     6 +-
 .../index/SortingTermVectorsConsumer.java       |     6 +-
 .../lucene/index/StandardDirectoryReader.java   |    20 +-
 .../java/org/apache/lucene/index/TermsEnum.java |     7 +-
 .../apache/lucene/index/TieredMergePolicy.java  |   638 +-
 .../lucene/index/UpgradeIndexMergePolicy.java   |    23 +-
 .../apache/lucene/search/BlendedTermQuery.java  |     8 +-
 .../search/BlockMaxConjunctionScorer.java       |    17 +
 .../org/apache/lucene/search/BlockMaxDISI.java  |    94 +
 .../lucene/search/Boolean2ScorerSupplier.java   |     2 +-
 .../org/apache/lucene/search/BooleanWeight.java |     2 +-
 .../apache/lucene/search/CachingCollector.java  |     9 +-
 .../search/DisjunctionMatchesIterator.java      |    19 +-
 .../lucene/search/DisjunctionMaxQuery.java      |     2 +-
 .../lucene/search/DisjunctionMaxScorer.java     |    71 +-
 .../apache/lucene/search/DisjunctionScorer.java |    22 +-
 .../lucene/search/DisjunctionSumScorer.java     |    22 +-
 .../apache/lucene/search/DocIdSetIterator.java  |    41 +
 .../lucene/search/DocValuesRewriteMethod.java   |     2 +-
 .../lucene/search/ExactPhraseMatcher.java       |   152 +
 .../apache/lucene/search/ExactPhraseScorer.java |   191 -
 .../lucene/search/FieldValueHitQueue.java       |     4 +-
 .../apache/lucene/search/FuzzyTermsEnum.java    |     5 +-
 .../java/org/apache/lucene/search/HitQueue.java |    20 +-
 .../org/apache/lucene/search/ImpactsDISI.java   |   149 +
 .../org/apache/lucene/search/IndexSearcher.java |    60 +-
 .../org/apache/lucene/search/LeafSimScorer.java |    15 +-
 .../java/org/apache/lucene/search/Matches.java  |    13 +-
 .../apache/lucene/search/MatchesIterator.java   |    22 +-
 .../org/apache/lucene/search/MaxScoreCache.java |   126 +
 .../apache/lucene/search/MultiCollector.java    |    14 +
 .../apache/lucene/search/MultiPhraseQuery.java  |   320 +-
 .../MultiTermQueryConstantScoreWrapper.java     |     2 +-
 .../org/apache/lucene/search/PhraseMatcher.java |    92 +
 .../org/apache/lucene/search/PhraseQuery.java   |   213 +-
 .../org/apache/lucene/search/PhraseScorer.java  |   102 +
 .../org/apache/lucene/search/PhraseWeight.java  |   144 +
 .../apache/lucene/search/PointInSetQuery.java   |     2 +-
 .../apache/lucene/search/PointRangeQuery.java   |     5 +-
 .../lucene/search/QueryCachingPolicy.java       |    13 -
 .../org/apache/lucene/search/QueryRescorer.java |     2 +-
 .../org/apache/lucene/search/ReqExclScorer.java |     5 +
 .../apache/lucene/search/ReqOptSumScorer.java   |     9 +
 .../java/org/apache/lucene/search/Scorer.java   |     4 +-
 .../lucene/search/SloppyPhraseMatcher.java      |   599 +
 .../lucene/search/SloppyPhraseScorer.java       |   591 -
 .../org/apache/lucene/search/SortRescorer.java  |    26 +-
 .../org/apache/lucene/search/SynonymQuery.java  |   314 +-
 .../apache/lucene/search/TermInSetQuery.java    |     2 +-
 .../lucene/search/TermMatchesIterator.java      |    16 +-
 .../org/apache/lucene/search/TermQuery.java     |    32 +-
 .../org/apache/lucene/search/TermScorer.java    |    96 +-
 .../java/org/apache/lucene/search/TopDocs.java  |    48 +-
 .../apache/lucene/search/TopDocsCollector.java  |     9 +-
 .../apache/lucene/search/TopFieldCollector.java |   286 +-
 .../org/apache/lucene/search/TopFieldDocs.java  |     5 +-
 .../lucene/search/TopScoreDocCollector.java     |   106 +-
 .../org/apache/lucene/search/TotalHits.java     |    71 +
 .../org/apache/lucene/search/WANDScorer.java    |     1 +
 .../search/similarities/BM25Similarity.java     |     5 +-
 .../search/similarities/BooleanSimilarity.java  |     5 +-
 .../search/similarities/MultiSimilarity.java    |     5 +-
 .../lucene/search/similarities/Similarity.java  |    12 +-
 .../search/similarities/SimilarityBase.java     |     3 +-
 .../search/similarities/TFIDFSimilarity.java    |     5 +-
 .../lucene/search/spans/SpanPositionQueue.java  |     2 +-
 .../lucene/search/spans/SpanTermQuery.java      |     7 +
 .../apache/lucene/search/spans/SpanWeight.java  |   146 +-
 .../java/org/apache/lucene/store/Directory.java |   201 +-
 .../org/apache/lucene/store/FSDirectory.java    |    32 +-
 .../lucene/store/FileSwitchDirectory.java       |    15 +
 .../apache/lucene/store/FilterDirectory.java    |     5 +
 .../org/apache/lucene/store/IndexOutput.java    |    13 +-
 .../java/org/apache/lucene/util/ArrayUtil.java  |   200 +-
 .../src/java/org/apache/lucene/util/BitSet.java |     5 +-
 .../java/org/apache/lucene/util/BitUtil.java    |     2 +-
 .../java/org/apache/lucene/util/BytesRef.java   |     9 +-
 .../org/apache/lucene/util/BytesRefBuilder.java |     4 +-
 .../org/apache/lucene/util/BytesRefHash.java    |     4 +-
 .../java/org/apache/lucene/util/CharsRef.java   |     3 +-
 .../org/apache/lucene/util/CharsRefBuilder.java |     4 +-
 .../org/apache/lucene/util/DocIdSetBuilder.java |     5 +-
 .../org/apache/lucene/util/FixedBitSet.java     |    39 +-
 .../java/org/apache/lucene/util/FixedBits.java  |    47 +
 .../java/org/apache/lucene/util/IntsRef.java    |     4 +-
 .../java/org/apache/lucene/util/LongsRef.java   |     4 +-
 .../org/apache/lucene/util/MutableBits.java     |    31 -
 .../java/org/apache/lucene/util/PagedBytes.java |     7 +-
 .../org/apache/lucene/util/PriorityQueue.java   |   117 +-
 .../org/apache/lucene/util/QueryBuilder.java    |     4 +-
 .../org/apache/lucene/util/RoaringDocIdSet.java |     3 +-
 .../apache/lucene/util/SparseFixedBitSet.java   |     3 +-
 .../org/apache/lucene/util/StringHelper.java    |     2 +-
 .../java/org/apache/lucene/util/Version.java    |    14 +
 .../automaton/DaciukMihovAutomatonBuilder.java  |    16 +-
 .../org/apache/lucene/util/bkd/BKDWriter.java   |    10 +-
 .../apache/lucene/util/bkd/HeapPointWriter.java |     7 +-
 .../lucene/util/fst/PositiveIntOutputs.java     |     3 +-
 .../util/packed/DeltaPackedLongValues.java      |     9 +-
 .../lucene/util/packed/MonotonicLongValues.java |    11 +-
 .../lucene/util/packed/PackedLongValues.java    |     6 +-
 .../src/test/org/apache/lucene/TestDemo.java    |     6 +-
 .../org/apache/lucene/TestExternalCodecs.java   |    19 +-
 .../lucene/analysis/TestCharArraySet.java       |     4 +-
 .../lucene/analysis/TestCharacterUtils.java     |     4 +-
 .../TestCompetitiveFreqNormAccumulator.java     |    44 +-
 .../AbstractTestCompressionMode.java            |    11 +-
 .../lucene50/TestBlockPostingsFormat.java       |    57 +-
 .../lucene/codecs/lucene50/TestForUtil.java     |    14 +-
 .../lucene50/TestLucene50LiveDocsFormat.java    |    30 +
 .../perfield/TestPerFieldDocValuesFormat.java   |     6 +-
 .../perfield/TestPerFieldPostingsFormat2.java   |    26 +-
 .../lucene/document/TestFeatureField.java       |    47 +-
 .../org/apache/lucene/document/TestField.java   |     2 +-
 .../document/TestLatLonDocValuesField.java      |    30 +
 .../apache/lucene/document/TestLatLonPoint.java |    37 +
 .../document/TestLatLonPointDistanceSort.java   |   264 +
 .../org/apache/lucene/geo/TestPolygon2D.java    |    43 +
 .../lucene/index/Test2BBinaryDocValues.java     |     2 +-
 .../org/apache/lucene/index/Test2BDocs.java     |     2 +-
 .../lucene/index/Test2BNumericDocValues.java    |     2 +-
 .../org/apache/lucene/index/Test2BPoints.java   |     2 +-
 .../apache/lucene/index/Test2BPositions.java    |     2 +-
 .../org/apache/lucene/index/Test2BPostings.java |     2 +-
 .../lucene/index/Test2BPostingsBytes.java       |     2 +-
 .../index/Test2BSortedDocValuesFixedSorted.java |     2 +-
 .../lucene/index/Test2BSortedDocValuesOrds.java |     2 +-
 .../org/apache/lucene/index/Test2BTerms.java    |     4 +-
 .../org/apache/lucene/index/TestAddIndexes.java |    53 +-
 .../apache/lucene/index/TestBagOfPositions.java |     2 +-
 .../apache/lucene/index/TestBagOfPostings.java  |     2 +-
 .../index/TestBinaryDocValuesUpdates.java       |     5 +-
 .../apache/lucene/index/TestBinaryTerms.java    |     2 +-
 .../org/apache/lucene/index/TestCodecs.java     |     7 +-
 .../index/TestCrashCausesCorruptIndex.java      |     2 +-
 .../index/TestDemoParallelLeafReader.java       |    16 +-
 .../lucene/index/TestDirectoryReaderReopen.java |     8 +-
 .../test/org/apache/lucene/index/TestDoc.java   |     4 +-
 .../org/apache/lucene/index/TestDocValues.java  |    17 +
 .../lucene/index/TestDocValuesFieldUpdates.java |    72 +
 .../lucene/index/TestDuelingCodecsAtNight.java  |     2 +-
 .../apache/lucene/index/TestFieldsReader.java   |     2 +-
 .../lucene/index/TestFilterLeafReader.java      |    22 +
 .../lucene/index/TestFilterMergePolicy.java     |     4 +-
 .../lucene/index/TestForTooMuchCloning.java     |     2 +-
 .../lucene/index/TestForceMergeForever.java     |     2 +-
 .../apache/lucene/index/TestIndexSorting.java   |    67 +-
 .../apache/lucene/index/TestIndexWriter.java    |   476 +-
 .../lucene/index/TestIndexWriterCommit.java     |     1 -
 .../lucene/index/TestIndexWriterDelete.java     |    28 +-
 .../lucene/index/TestIndexWriterExceptions.java |    73 +-
 .../lucene/index/TestIndexWriterMaxDocs.java    |     6 +-
 .../lucene/index/TestIndexWriterOnDiskFull.java |     1 -
 .../TestIndexWriterOutOfFileDescriptors.java    |     2 -
 .../lucene/index/TestIndexWriterReader.java     |    15 +-
 .../index/TestIndexWriterThreadsToSegments.java |     2 +-
 .../index/TestIndexWriterWithThreads.java       |    62 +
 .../apache/lucene/index/TestIndexableField.java |     6 +-
 .../index/TestIndexingSequenceNumbers.java      |    12 +-
 .../org/apache/lucene/index/TestInfoStream.java |     8 +-
 .../lucene/index/TestLazyProxSkipping.java      |     1 -
 .../apache/lucene/index/TestLogMergePolicy.java |    17 +
 .../apache/lucene/index/TestLongPostings.java   |     2 +-
 .../org/apache/lucene/index/TestManyFields.java |     2 +-
 .../lucene/index/TestMaxTermFrequency.java      |     2 +-
 .../lucene/index/TestMixedDocValuesUpdates.java |   304 +-
 .../org/apache/lucene/index/TestNRTThreads.java |     2 +-
 .../apache/lucene/index/TestNoMergePolicy.java  |    25 +
 .../test/org/apache/lucene/index/TestNorms.java |     5 +-
 .../index/TestNumericDocValuesUpdates.java      |     3 +-
 .../index/TestOneMergeWrappingMergePolicy.java  |     8 +-
 .../apache/lucene/index/TestPendingDeletes.java |    16 +-
 .../lucene/index/TestPendingSoftDeletes.java    |   215 +-
 .../lucene/index/TestPerSegmentDeletes.java     |    17 +-
 .../apache/lucene/index/TestReadOnlyIndex.java  |     6 +-
 .../org/apache/lucene/index/TestReaderPool.java |   313 +
 .../apache/lucene/index/TestRollingUpdates.java |     8 +-
 .../apache/lucene/index/TestSegmentInfos.java   |     6 +-
 .../apache/lucene/index/TestSegmentMerger.java  |     4 +-
 .../TestSoftDeletesDirectoryReaderWrapper.java  |     5 +-
 .../TestSoftDeletesRetentionMergePolicy.java    |   266 +-
 .../apache/lucene/index/TestStressDeletes.java  |     4 +-
 .../org/apache/lucene/index/TestStressNRT.java  |    10 +-
 .../org/apache/lucene/index/TestTermsEnum.java  |     2 +-
 .../lucene/index/TestTieredMergePolicy.java     |   396 +-
 .../org/apache/lucene/index/TestTryDelete.java  |    16 +-
 .../index/TestUpgradeIndexMergePolicy.java      |    21 +-
 .../lucene/search/MultiCollectorTest.java       |     3 +
 .../lucene/search/TermInSetQueryTest.java       |     2 +-
 .../lucene/search/TestAutomatonQuery.java       |     2 +-
 .../search/TestAutomatonQueryUnicode.java       |     2 +-
 .../lucene/search/TestBlendedTermQuery.java     |     2 +-
 .../org/apache/lucene/search/TestBoolean2.java  |    27 +-
 .../search/TestBooleanMinShouldMatch.java       |     8 +-
 .../org/apache/lucene/search/TestBooleanOr.java |     2 +-
 .../apache/lucene/search/TestBooleanQuery.java  |    16 +-
 .../search/TestBooleanQueryVisitSubscorers.java |     4 +-
 .../lucene/search/TestBooleanRewrites.java      |     2 +-
 .../apache/lucene/search/TestBooleanScorer.java |     4 +-
 .../apache/lucene/search/TestConjunctions.java  |     4 +-
 .../lucene/search/TestConstantScoreQuery.java   |     4 +-
 .../TestControlledRealTimeReopenThread.java     |    14 +-
 .../lucene/search/TestDisjunctionMaxQuery.java  |    79 +-
 .../lucene/search/TestDocIdSetIterator.java     |    55 +
 .../lucene/search/TestDocValuesQueries.java     |     2 +-
 .../lucene/search/TestDoubleValuesSource.java   |     9 +-
 .../lucene/search/TestElevationComparator.java  |     2 +-
 .../lucene/search/TestFieldValueQuery.java      |     8 +-
 .../apache/lucene/search/TestFuzzyQuery.java    |     2 +-
 .../apache/lucene/search/TestIndexSearcher.java |    38 +-
 .../apache/lucene/search/TestLRUQueryCache.java |    71 +-
 .../search/TestLatLonDocValuesQueries.java      |    62 +
 .../lucene/search/TestLatLonPointQueries.java   |    91 +
 .../lucene/search/TestLiveFieldValues.java      |     4 +-
 .../lucene/search/TestLongValuesSource.java     |     9 +-
 .../lucene/search/TestMatchesIterator.java      |   319 +-
 .../lucene/search/TestMinShouldMatch2.java      |     2 +-
 .../lucene/search/TestMultiCollector.java       |    74 +-
 .../lucene/search/TestMultiPhraseQuery.java     |    16 +-
 .../apache/lucene/search/TestNeedsScores.java   |    10 +-
 .../search/TestNormsFieldExistsQuery.java       |     8 +-
 .../apache/lucene/search/TestPhraseQuery.java   |    13 +-
 .../search/TestPositiveScoresOnlyCollector.java |     4 +-
 .../lucene/search/TestPrefixInBooleanQuery.java |     8 +-
 .../apache/lucene/search/TestPrefixQuery.java   |     4 +-
 .../apache/lucene/search/TestQueryRescorer.java |    24 +-
 .../apache/lucene/search/TestRegexpQuery.java   |     4 +-
 .../apache/lucene/search/TestRegexpRandom.java  |     2 +-
 .../lucene/search/TestReqOptSumScorer.java      |     8 +-
 .../search/TestSameScoresWithThreads.java       |     2 +-
 .../apache/lucene/search/TestSearchAfter.java   |    15 +-
 .../lucene/search/TestSearchWithThreads.java    |     2 +-
 .../lucene/search/TestSearcherManager.java      |     5 +-
 .../lucene/search/TestShardSearching.java       |    12 +-
 .../lucene/search/TestSimilarityProvider.java   |     8 +-
 .../TestSimpleExplanationsWithFillerDocs.java   |     5 +-
 .../lucene/search/TestSloppyPhraseQuery.java    |    19 +-
 .../test/org/apache/lucene/search/TestSort.java |    50 +-
 .../apache/lucene/search/TestSortRandom.java    |     2 +-
 .../apache/lucene/search/TestSortRescorer.java  |     8 +-
 .../search/TestSortedNumericSortField.java      |    22 +-
 .../lucene/search/TestSortedSetSelector.java    |    32 +-
 .../lucene/search/TestSortedSetSortField.java   |    18 +-
 .../lucene/search/TestSubScorerFreqs.java       |     8 +-
 .../apache/lucene/search/TestSynonymQuery.java  |   238 +-
 .../org/apache/lucene/search/TestTermQuery.java |    30 +
 .../lucene/search/TestTermRangeQuery.java       |    12 +-
 .../apache/lucene/search/TestTermScorer.java    |    29 +-
 .../lucene/search/TestTopDocsCollector.java     |   124 +-
 .../apache/lucene/search/TestTopDocsMerge.java  |    47 +-
 .../lucene/search/TestTopFieldCollector.java    |   288 +-
 .../TestTopFieldCollectorEarlyTermination.java  |    15 +-
 .../lucene/search/TestWildcardRandom.java       |     2 +-
 .../similarities/TestBooleanSimilarity.java     |    10 +-
 .../similarities/TestClassicSimilarity.java     |    18 +-
 .../search/similarities/TestSimilarity2.java    |    14 +-
 .../search/similarities/TestSimilarityBase.java |     2 +-
 .../lucene/search/spans/TestSpanFirstQuery.java |     4 +-
 .../spans/TestSpanMultiTermQueryWrapper.java    |    56 +-
 .../apache/lucene/search/spans/TestSpans.java   |     4 +-
 .../lucene/store/TestFilterDirectory.java       |     2 +-
 .../lucene/store/TestSimpleFSDirectory.java     |    53 +
 .../apache/lucene/util/BaseSortTestCase.java    |     4 +-
 .../lucene/util/StressRamUsageEstimator.java    |     5 +-
 .../org/apache/lucene/util/TestArrayUtil.java   |    87 +
 .../org/apache/lucene/util/TestBytesRef.java    |     8 +
 .../org/apache/lucene/util/TestCharsRef.java    |     8 +
 .../org/apache/lucene/util/TestFixedBitSet.java |    51 +
 .../org/apache/lucene/util/TestIntsRef.java     |     8 +
 .../apache/lucene/util/TestLSBRadixSorter.java  |     4 +-
 .../org/apache/lucene/util/TestLongsRef.java    |    47 +
 .../apache/lucene/util/TestMSBRadixSorter.java  |     4 +-
 .../apache/lucene/util/TestPriorityQueue.java   |   171 +-
 .../org/apache/lucene/util/TestSetOnce.java     |    10 +-
 .../lucene/util/TestStringMSBRadixSorter.java   |     4 +-
 .../TestDaciukMihovAutomatonBuilder.java        |    39 +
 .../org/apache/lucene/util/bkd/TestBKD.java     |     7 +-
 .../org/apache/lucene/util/fst/TestFSTs.java    |     6 +-
 .../lucene/util/packed/TestPackedInts.java      |     5 +-
 lucene/demo/build.xml                           |    20 -
 lucene/demo/ivy.xml                             |     7 -
 .../org/apache/lucene/demo/SearchFiles.java     |     2 +-
 .../demo/xmlparser/FormBasedXmlQueryDemo.java   |   162 -
 .../lucene/demo/xmlparser/package-info.java     |    21 -
 .../lucene/demo/xmlparser/META-INF/MANIFEST.MF  |     3 -
 .../lucene/demo/xmlparser/WEB-INF/data.tsv      |     5 -
 .../lucene/demo/xmlparser/WEB-INF/query.xsl     |    74 -
 .../lucene/demo/xmlparser/WEB-INF/web.xml       |    49 -
 .../org/apache/lucene/demo/xmlparser/index.jsp  |   145 -
 .../apache/lucene/demo/xmlparser/stylesheet.css |    23 -
 .../demo/facet/TestDistanceFacetsExample.java   |     2 +-
 .../demo/facet/TestRangeFacetsExample.java      |     2 +-
 .../lucene/expressions/TestDemoExpressions.java |    10 +-
 .../expressions/TestExpressionRescorer.java     |     4 +-
 .../lucene/expressions/TestExpressionSorts.java |     9 +-
 .../org/apache/lucene/facet/DrillSideways.java  |    22 +-
 .../apache/lucene/facet/FacetsCollector.java    |    32 +-
 .../org/apache/lucene/facet/FacetsConfig.java   |    37 +-
 .../lucene/facet/TopOrdAndFloatQueue.java       |     2 +-
 .../apache/lucene/facet/TopOrdAndIntQueue.java  |     2 +-
 .../apache/lucene/facet/range/DoubleRange.java  |    16 +
 .../apache/lucene/facet/range/LongRange.java    |    16 +
 .../facet/taxonomy/SearcherTaxonomyManager.java |    12 +-
 .../directory/DirectoryTaxonomyWriter.java      |     5 +
 .../writercache/LruTaxonomyWriterCache.java     |     3 +-
 .../writercache/NameHashIntCacheLRU.java        |     4 +-
 .../writercache/UTF8TaxonomyWriterCache.java    |    30 +-
 .../apache/lucene/facet/TestDrillDownQuery.java |    54 +-
 .../apache/lucene/facet/TestDrillSideways.java  |    37 +-
 .../org/apache/lucene/facet/TestFacetQuery.java |     4 +-
 .../facet/range/TestRangeFacetCounts.java       |    40 +-
 .../sortedset/TestSortedSetDocValuesFacets.java |     2 +-
 .../taxonomy/TestSearcherTaxonomyManager.java   |    26 +
 .../TestTaxonomyFacetSumValueSource.java        |     2 +-
 .../directory/TestDirectoryTaxonomyWriter.java  |    58 +-
 .../TestUTF8TaxonomyWriterCache.java            |    12 +-
 .../search/grouping/BlockGroupingCollector.java |    27 +-
 .../grouping/FirstPassGroupingCollector.java    |    11 +-
 .../lucene/search/grouping/GroupDocs.java       |     5 +-
 .../lucene/search/grouping/GroupingSearch.java  |    33 +-
 .../lucene/search/grouping/TopGroups.java       |    13 +-
 .../search/grouping/TopGroupsCollector.java     |   103 +-
 .../grouping/DistinctValuesCollectorTest.java   |     4 +-
 .../lucene/search/grouping/TestGrouping.java    |   108 +-
 .../search/highlight/TermVectorLeafReader.java  |     2 +-
 .../highlight/TokenStreamFromTermVector.java    |     8 -
 .../search/uhighlight/FieldOffsetStrategy.java  |     2 +-
 .../lucene/search/uhighlight/PhraseHelper.java  |     4 +-
 .../search/highlight/HighlighterPhraseTest.java |    12 +-
 .../search/highlight/HighlighterTest.java       |    68 +-
 .../search/highlight/TokenSourcesTest.java      |     8 +-
 .../uhighlight/TestUnifiedHighlighter.java      |    56 +-
 .../uhighlight/TestUnifiedHighlighterMTQ.java   |    60 +-
 .../TestUnifiedHighlighterRanking.java          |     4 +-
 .../TestUnifiedHighlighterStrictPhrases.java    |    37 +-
 .../TestUnifiedHighlighterTermVec.java          |     2 +-
 .../FastVectorHighlighterTest.java              |     2 +-
 lucene/ivy-ignore-conflicts.properties          |     1 -
 lucene/ivy-versions.properties                  |    49 +-
 .../search/join/ToChildBlockJoinQuery.java      |     2 +-
 .../search/join/ToParentBlockJoinQuery.java     |     8 +-
 .../lucene/search/join/TestBlockJoin.java       |    62 +-
 .../search/join/TestBlockJoinSorting.java       |     8 +-
 .../apache/lucene/search/join/TestJoinUtil.java |    37 +-
 .../join/TestParentChildrenBlockJoinQuery.java  |     3 +-
 lucene/licenses/Tagger-2.3.1.jar.sha1           |     1 -
 lucene/licenses/Tagger-LICENSE-ASL.txt          |   202 -
 lucene/licenses/Tagger-NOTICE.txt               |     7 -
 .../licenses/WhitespaceTokenizer-2.3.1.jar.sha1 |     1 -
 .../WhitespaceTokenizer-LICENSE-ASL.txt         |   202 -
 lucene/licenses/WhitespaceTokenizer-NOTICE.txt  |     7 -
 lucene/licenses/commons-compress-1.14.jar.sha1  |     1 -
 .../licenses/commons-compress-1.16.1.jar.sha1   |     1 +
 lucene/licenses/hppc-0.7.3.jar.sha1             |     1 -
 lucene/licenses/hppc-0.8.1.jar.sha1             |     1 +
 lucene/licenses/icu4j-61.1.jar.sha1             |     1 -
 lucene/licenses/icu4j-62.1.jar.sha1             |     1 +
 ...jetty-continuation-9.4.11.v20180605.jar.sha1 |     1 +
 .../jetty-continuation-9.4.8.v20171121.jar.sha1 |     1 -
 .../jetty-http-9.4.11.v20180605.jar.sha1        |     1 +
 .../jetty-http-9.4.8.v20171121.jar.sha1         |     1 -
 .../licenses/jetty-io-9.4.11.v20180605.jar.sha1 |     1 +
 .../licenses/jetty-io-9.4.8.v20171121.jar.sha1  |     1 -
 .../jetty-server-9.4.11.v20180605.jar.sha1      |     1 +
 .../jetty-server-9.4.8.v20171121.jar.sha1       |     1 -
 .../jetty-servlet-9.4.11.v20180605.jar.sha1     |     1 +
 .../jetty-servlet-9.4.8.v20171121.jar.sha1      |     1 -
 .../jetty-util-9.4.11.v20180605.jar.sha1        |     1 +
 .../jetty-util-9.4.8.v20171121.jar.sha1         |     1 -
 lucene/licenses/morfologik-fsa-2.1.1.jar.sha1   |     1 -
 lucene/licenses/morfologik-fsa-2.1.5.jar.sha1   |     1 +
 .../licenses/morfologik-polish-2.1.1.jar.sha1   |     1 -
 .../licenses/morfologik-polish-2.1.5.jar.sha1   |     1 +
 .../licenses/morfologik-stemming-2.1.1.jar.sha1 |     1 -
 .../licenses/morfologik-stemming-2.1.5.jar.sha1 |     1 +
 lucene/licenses/opennlp-maxent-3.0.3.jar.sha1   |     1 -
 lucene/licenses/opennlp-maxent-LICENSE-ASL.txt  |   202 -
 lucene/licenses/opennlp-maxent-NOTICE.txt       |     6 -
 lucene/licenses/opennlp-tools-1.8.3.jar.sha1    |     1 -
 lucene/licenses/opennlp-tools-1.9.0.jar.sha1    |     1 +
 .../randomizedtesting-runner-2.5.3.jar.sha1     |     1 -
 .../randomizedtesting-runner-2.6.0.jar.sha1     |     1 +
 lucene/licenses/servlet-api-2.4.jar.sha1        |     1 -
 lucene/licenses/servlet-api-LICENSE-CDDL.txt    |   126 -
 lucene/licenses/servlet-api-NOTICE.txt          |     2 -
 lucene/licenses/uimaj-core-2.3.1.jar.sha1       |     1 -
 lucene/licenses/uimaj-core-LICENSE-ASL.txt      |   202 -
 lucene/licenses/uimaj-core-NOTICE.txt           |    13 -
 .../apache/lucene/index/memory/MemoryIndex.java |     9 +-
 .../memory/TestMemoryIndexAgainstRAMDir.java    |     4 +-
 .../org/apache/lucene/index/IndexSplitter.java  |     2 +-
 .../search/DiversifiedTopDocsCollector.java     |    16 +-
 .../util/fst/UpToTwoPositiveIntOutputs.java     |     2 +
 .../search/TestInetAddressRangeQueries.java     |     2 +
 .../store/TestHardLinkCopyDirectoryWrapper.java |    36 +
 lucene/module-build.xml                         |    22 -
 .../queries/function/FunctionScoreQuery.java    |    22 +
 .../function/valuesource/NormValueSource.java   |     2 +-
 .../apache/lucene/queries/mlt/MoreLikeThis.java |     8 +-
 .../lucene/queries/CommonTermsQueryTest.java    |    28 +-
 .../queries/function/TestFieldScoreQuery.java   |     2 +-
 .../function/TestFunctionMatchQuery.java        |     2 +-
 .../function/TestFunctionQueryExplanations.java |     2 +-
 .../function/TestFunctionScoreQuery.java        |    18 +-
 .../function/TestIndexReaderFunctions.java      |     2 +-
 .../queries/function/TestValueSources.java      |     2 +-
 .../queries/payloads/TestPayloadTermQuery.java  |    10 +-
 .../complexPhrase/ComplexPhraseQueryParser.java |     7 +
 .../queryparser/xml/QueryTemplateManager.java   |   202 -
 .../queryparser/classic/TestQueryParser.java    |     2 +-
 .../complexPhrase/TestComplexPhraseQuery.java   |     2 +
 .../flexible/standard/TestQPHelper.java         |     2 +-
 .../queryparser/util/QueryParserTestBase.java   |     2 +-
 .../lucene/queryparser/xml/TestCoreParser.java  |     6 +-
 .../xml/TestQueryTemplateManager.java           |   163 -
 .../queryparser/xml/albumBooleanQuery.xsl       |    48 -
 .../queryparser/xml/albumFilteredQuery.xsl      |    47 -
 .../queryparser/xml/albumLuceneClassicQuery.xsl |    29 -
 .../lucene/replicator/nrt/ReplicaNode.java      |     5 +-
 .../nrt/SegmentInfosSearcherManager.java        |     2 +-
 .../IndexAndTaxonomyReplicationClientTest.java  |     2 +-
 .../lucene/replicator/nrt/SimpleServer.java     |     2 +-
 .../replicator/nrt/TestNRTReplication.java      |     2 +-
 .../nrt/TestStressNRTReplication.java           |     2 +-
 .../idversion/IDVersionPostingsReader.java      |     5 +-
 .../idversion/IDVersionSegmentTermsEnum.java    |     5 +-
 .../document/FloatPointNearestNeighbor.java     |     3 +-
 .../document/LatLonDocValuesBoxQuery.java       |   153 -
 .../document/LatLonDocValuesDistanceQuery.java  |   140 -
 .../lucene/document/LatLonDocValuesField.java   |   181 -
 .../org/apache/lucene/document/LatLonPoint.java |   335 -
 .../document/LatLonPointDistanceComparator.java |   229 -
 .../document/LatLonPointDistanceQuery.java      |   390 -
 .../document/LatLonPointInPolygonQuery.java     |   214 -
 .../lucene/document/LatLonPointSortField.java   |   100 -
 .../org/apache/lucene/document/LatLonShape.java |   170 +
 .../document/LatLonShapeBoundingBoxQuery.java   |   422 +
 .../document/LatLonShapePolygonQuery.java       |   341 +
 .../apache/lucene/document/NearestNeighbor.java |   328 -
 .../src/java/org/apache/lucene/geo/Line.java    |   139 +
 .../java/org/apache/lucene/geo/Tessellator.java |   916 +
 .../src/java/org/apache/lucene/geo/package.html |    31 +
 .../search/LatLonPointPrototypeQueries.java     |   111 +
 .../apache/lucene/search/NearestNeighbor.java   |   329 +
 .../lucene/search/TermAutomatonQuery.java       |     2 +-
 .../lucene/search/TermAutomatonScorer.java      |     6 +-
 .../search/intervals/IntervalFunction.java      |    62 +-
 .../lucene/search/intervals/IntervalQuery.java  |     6 +-
 .../lucene/search/intervals/Intervals.java      |    23 +-
 .../document/BaseLatLonShapeTestCase.java       |   473 +
 .../document/TestFloatPointNearestNeighbor.java |     3 +-
 .../lucene/document/TestHalfFloatPoint.java     |     2 +-
 .../document/TestLatLonDocValuesField.java      |    30 -
 .../document/TestLatLonLineShapeQueries.java    |    94 +
 .../apache/lucene/document/TestLatLonPoint.java |    37 -
 .../document/TestLatLonPointDistanceSort.java   |   264 -
 .../document/TestLatLonPointShapeQueries.java   |    70 +
 .../document/TestLatLonPolygonShapeQueries.java |    82 +
 .../apache/lucene/document/TestLatLonShape.java |   202 +
 .../org/apache/lucene/document/TestNearest.java |   253 -
 .../org/apache/lucene/geo/TestTessellator.java  |    45 +
 .../search/TestDocValuesNumbersQuery.java       |     2 +-
 .../lucene/search/TestDocValuesTermsQuery.java  |     2 +-
 .../search/TestLatLonDocValuesQueries.java      |    62 -
 .../lucene/search/TestLatLonPointQueries.java   |    91 -
 .../org/apache/lucene/search/TestNearest.java   |   253 +
 .../lucene/search/TestTermAutomatonQuery.java   |    28 +-
 .../search/intervals/TestIntervalQuery.java     |    12 +
 .../lucene/search/intervals/TestIntervals.java  |    71 +-
 .../spatial/prefix/tree/QuadPrefixTree.java     |     4 +-
 .../spatial/spatial4j/Geo3dShapeFactory.java    |    10 +-
 .../lucene/spatial/DistanceStrategyTest.java    |     4 +-
 .../apache/lucene/spatial/SpatialExample.java   |     4 +-
 .../apache/lucene/spatial/SpatialTestCase.java  |     2 +-
 .../lucene/spatial/prefix/JtsPolygonTest.java   |     2 +-
 .../prefix/tree/SpatialPrefixTreeTest.java      |     2 +-
 .../lucene/spatial/spatial4j/Geo3dRptTest.java  |    23 +-
 .../spatial3d/geom/GeoComplexPolygon.java       |   941 +-
 .../spatial3d/geom/GeoDegeneratePath.java       |     2 +-
 .../spatial3d/geom/GeoPolygonFactory.java       |    20 +-
 .../lucene/spatial3d/geom/GeoStandardPath.java  |     2 +-
 .../org/apache/lucene/spatial3d/geom/Plane.java |    15 +-
 .../apache/lucene/spatial3d/geom/XYZBounds.java |    12 +-
 .../apache/lucene/spatial3d/TestGeo3DPoint.java |     2 +-
 .../lucene/spatial3d/geom/GeoPolygonTest.java   |   298 +-
 .../apache/lucene/spatial3d/geom/PlaneTest.java |     2 +-
 .../spatial3d/geom/RandomGeoPolygonTest.java    |   252 +-
 .../analyzing/AnalyzingInfixSuggester.java      |     4 +-
 .../analyzing/SuggestStopFilterFactory.java     |     8 +-
 .../suggest/document/CompletionAnalyzer.java    |    21 +-
 .../suggest/document/CompletionQuery.java       |     2 +-
 .../suggest/document/CompletionTokenStream.java |   297 +-
 .../search/suggest/document/ContextQuery.java   |    15 +-
 .../suggest/document/ContextSuggestField.java   |     1 +
 .../suggest/document/FuzzyCompletionQuery.java  |     7 +-
 .../suggest/document/NRTSuggesterBuilder.java   |     3 +-
 .../suggest/document/PrefixCompletionQuery.java |     5 +-
 .../suggest/document/RegexCompletionQuery.java  |     9 +-
 .../search/suggest/document/SuggestField.java   |     3 +-
 .../search/suggest/document/TopSuggestDocs.java |     9 +-
 .../document/TopSuggestDocsCollector.java       |     3 +-
 .../jaspell/JaspellTernarySearchTrie.java       |     6 +-
 .../analyzing/AnalyzingSuggesterTest.java       |    31 +-
 .../analyzing/TestSuggestStopFilterFactory.java |     4 +-
 .../document/CompletionTokenStreamTest.java     |   177 -
 .../suggest/document/TestContextQuery.java      |     3 +-
 .../document/TestContextSuggestField.java       |    13 +-
 .../document/TestPrefixCompletionQuery.java     |   183 +-
 .../document/TestRegexCompletionQuery.java      |    47 +
 .../suggest/document/TestSuggestField.java      |    41 +-
 .../analysis/BaseTokenStreamTestCase.java       |     8 +-
 .../lucene/analysis/ValidatingTokenFilter.java  |    17 +-
 .../asserting/AssertingLiveDocsFormat.java      |    61 +-
 .../codecs/cranky/CrankyLiveDocsFormat.java     |    13 +-
 .../codecs/ramonly/RAMOnlyPostingsFormat.java   |     5 +-
 .../apache/lucene/geo/BaseGeoPointTestCase.java |    23 +-
 .../java/org/apache/lucene/geo/GeoTestUtil.java |    39 +-
 .../lucene/index/AlcoholicMergePolicy.java      |     2 +-
 .../lucene/index/AssertingLeafReader.java       |    55 +-
 .../index/BaseDocValuesFormatTestCase.java      |    38 +-
 .../index/BaseFieldInfoFormatTestCase.java      |    14 +-
 .../index/BaseIndexFileFormatTestCase.java      |     2 +-
 .../index/BaseLiveDocsFormatTestCase.java       |   139 +
 .../lucene/index/BaseMergePolicyTestCase.java   |   359 +-
 .../index/BaseStoredFieldsFormatTestCase.java   |    10 +-
 .../apache/lucene/index/ForceMergePolicy.java   |     6 +-
 .../lucene/index/MismatchedLeafReader.java      |     3 +-
 .../lucene/index/MockRandomMergePolicy.java     |    18 +-
 .../org/apache/lucene/index/RandomCodec.java    |     7 +-
 .../apache/lucene/index/RandomIndexWriter.java  |    12 +-
 .../lucene/index/RandomPostingsTester.java      |   245 +-
 .../ThreadedIndexingAndSearchingTestCase.java   |    26 +-
 .../org/apache/lucene/mockfile/ExtrasFS.java    |    18 +-
 .../org/apache/lucene/mockfile/WindowsFS.java   |    66 +-
 .../lucene/search/AssertingMatchesIterator.java |    12 +-
 .../apache/lucene/search/AssertingScorer.java   |     7 +-
 .../lucene/search/BlockScoreQueryWrapper.java   |    10 +-
 .../org/apache/lucene/search/CheckHits.java     |     6 +-
 .../search/SearchEquivalenceTestBase.java       |     4 +-
 .../similarities/AssertingSimilarity.java       |     2 +-
 .../lucene/store/BaseDirectoryTestCase.java     |  1654 +-
 .../lucene/store/BaseLockFactoryTestCase.java   |    13 +-
 .../lucene/store/MockDirectoryWrapper.java      |    53 +-
 .../org/apache/lucene/util/LuceneTestCase.java  |    98 +-
 .../java/org/apache/lucene/util/TestUtil.java   |    20 +-
 .../util/automaton/AutomatonTestUtil.java       |     4 +-
 .../lucene/analysis/TestMockAnalyzer.java       |     8 +-
 .../lucene/index/TestAssertingLeafReader.java   |     2 +-
 .../apache/lucene/mockfile/TestWindowsFS.java   |    25 +-
 .../lucene/store/TestMockDirectoryWrapper.java  |     9 +-
 lucene/tools/forbiddenApis/base.txt             |    18 +
 lucene/tools/forbiddenApis/lucene.txt           |    24 +
 lucene/tools/junit4/cached-timehints.txt        |  1164 -
 lucene/tools/junit4/tests.policy                |     3 +-
 .../src/groovy/check-source-patterns.groovy     |     7 +
 .../dependencies/InterpolatedProperties.java    |   133 +-
 .../lucene/validation/LibVersionsCheckTask.java |     4 +-
 solr/CHANGES.txt                                |   555 +-
 solr/NOTICE.txt                                 |    26 +
 solr/bin-test/test_auth.sh                      |    40 +
 solr/bin-test/utils/assert.sh                   |    30 +-
 solr/bin/solr                                   |    73 +-
 solr/bin/solr.cmd                               |   116 +-
 solr/bin/solr.in.cmd                            |    12 +-
 solr/bin/solr.in.sh                             |    16 +-
 solr/common-build.xml                           |     3 +-
 solr/contrib/analysis-extras/ivy.xml            |     1 -
 ...ractNamedEntitiesUpdateProcessorFactory.java |    20 +-
 .../collection1/conf/en-test-ner-person.bin     |   Bin 1700 -> 0 bytes
 .../solr/collection1/conf/en-test-ner.bin       |   Bin 0 -> 2049 bytes
 .../solr/collection1/conf/en-test-sent.bin      |   Bin 1050 -> 1051 bytes
 .../solr/collection1/conf/en-test-tokenizer.bin |   Bin 15096 -> 15100 bytes
 .../conf/solrconfig-opennlp-extract.xml         |    30 +-
 ...ractNamedEntitiesUpdateProcessorFactory.java |     9 +-
 .../analytics/function/field/DoubleField.java   |     3 +-
 .../analytics/function/field/FloatField.java    |     3 +-
 .../analytics/util/FacetRangeGenerator.java     |     8 +-
 .../field/AbstractAnalyticsFieldTest.java       |    75 +-
 .../mapping/FillMissingFunctionTest.java        |    18 +-
 .../function/mapping/FilterFunctionTest.java    |    10 +-
 .../function/mapping/IfFunctionTest.java        |    26 +-
 .../function/mapping/RemoveFunctionTest.java    |    22 +-
 .../function/mapping/ReplaceFunctionTest.java   |    22 +-
 .../analytics/legacy/LegacyNoFacetTest.java     |     8 +-
 .../legacy/facet/LegacyFieldFacetTest.java      |    10 +-
 .../legacy/facet/LegacyQueryFacetTest.java      |     6 +-
 .../value/CastingBooleanValueStreamTest.java    |     2 +-
 .../value/CastingBooleanValueTest.java          |     6 +-
 .../value/CastingDoubleValueStreamTest.java     |     2 +-
 .../analytics/value/CastingDoubleValueTest.java |     6 +-
 .../value/CastingFloatValueStreamTest.java      |     2 +-
 .../analytics/value/CastingFloatValueTest.java  |     6 +-
 .../value/CastingIntValueStreamTest.java        |     2 +-
 .../analytics/value/CastingIntValueTest.java    |     6 +-
 .../value/CastingLongValueStreamTest.java       |     2 +-
 .../analytics/value/CastingLongValueTest.java   |     6 +-
 .../solr/analytics/value/ConstantValueTest.java |    24 +-
 solr/contrib/clustering/README.txt              |     2 +-
 .../handler/clustering/ClusteringComponent.java |     2 +-
 .../carrot2/CarrotClusteringEngine.java         |     2 +-
 .../carrot2/LuceneCarrot2StemmerFactory.java    |     8 +-
 .../carrot2/LuceneCarrot2TokenizerFactory.java  |     4 +-
 .../clustering/src/test-files/log4j2.xml        |    37 -
 .../clustering/ClusteringComponentTest.java     |    11 +-
 .../carrot2/CarrotClusteringEngineTest.java     |    16 +-
 .../handler/dataimport/SolrEntityProcessor.java |     2 +-
 .../dataimporthandler/src/test-files/log4j2.xml |    36 -
 .../dataimport/AbstractDIHCacheTestCase.java    |    16 +-
 .../dataimport/TestBuiltInEvaluators.java       |     2 +-
 .../dataimport/TestHierarchicalDocBuilder.java  |     2 +-
 .../dataimport/TestNumberFormatTransformer.java |    10 +-
 .../TestSolrEntityProcessorEndToEnd.java        |     3 +-
 .../dataimport/TestSortedMapBackedCache.java    |    12 +-
 solr/contrib/extraction/ivy.xml                 |     2 +-
 .../handler/extraction/ParseContextConfig.java  |    12 +-
 .../extraction/TestExtractionDateUtil.java      |     1 +
 ...anguageIdentifierUpdateProcessorFactory.java |     8 +-
 ...OpenNLPLangDetectUpdateProcessorFactory.java |     8 +-
 ...anguageIdentifierUpdateProcessorFactory.java |     8 +-
 .../langid/solr/collection1/conf/schema.xml     |     1 -
 .../java/org/apache/solr/ltr/LTRRescorer.java   |    10 +-
 .../org/apache/solr/ltr/model/AdapterModel.java |     2 +
 .../org/apache/solr/ltr/model/LinearModel.java  |     2 +-
 .../ltr/model/MultipleAdditiveTreesModel.java   |     4 +-
 .../LTRFeatureLoggerTransformerFactory.java     |     2 +-
 solr/contrib/ltr/src/test-files/log4j2.xml      |    40 -
 .../org/apache/solr/ltr/TestLTROnSolrCloud.java |     2 +
 .../solr/ltr/TestLTRReRankingPipeline.java      |    10 +-
 .../apache/solr/ltr/TestLTRScoringQuery.java    |     2 +-
 .../solr/ltr/TestSelectiveWeightCreation.java   |     2 +-
 ...stFeatureExtractionFromMultipleSegments.java |    36 +-
 .../prometheus-exporter/bin/solr-exporter       |     2 +-
 .../prometheus-exporter/bin/solr-exporter.cmd   |    10 +-
 .../contrib/prometheus-exporter/conf/log4j2.xml |    53 -
 .../prometheus/collector/SolrCollector.java     |    24 +-
 .../solr/prometheus/exporter/SolrExporter.java  |     6 +-
 .../solr/prometheus/scraper/SolrScraper.java    |    10 +-
 .../src/test-files/conf/log4j2.xml              |    35 -
 .../configsets/collection1/conf/managed-schema  |     2 +-
 .../configsets/collection1/conf/solrconfig.xml  |    20 +-
 solr/contrib/uima/README.txt                    |   109 -
 solr/contrib/uima/build.xml                     |    63 -
 solr/contrib/uima/ivy.xml                       |    35 -
 .../uima/processor/FieldMappingException.java   |    27 -
 .../uima/processor/SolrUIMAConfiguration.java   |   117 -
 .../processor/SolrUIMAConfigurationReader.java  |   116 -
 .../solr/uima/processor/UIMAToSolrMapper.java   |    87 -
 .../processor/UIMAUpdateRequestProcessor.java   |   189 -
 .../UIMAUpdateRequestProcessorFactory.java      |    72 -
 .../solr/uima/processor/package-info.java       |    25 -
 solr/contrib/uima/src/java/overview.html        |    21 -
 .../apache/uima/desc/AggregateSentenceAE.xml    |    41 -
 .../org/apache/uima/desc/HmmTagger.xml          |   121 -
 .../apache/uima/desc/OpenCalaisAnnotator.xml    |   194 -
 .../uima/desc/OverridingParamsExtServicesAE.xml |   147 -
 .../desc/TextCategorizationAEDescriptor.xml     |   102 -
 .../desc/TextConceptTaggingAEDescriptor.xml     |   196 -
 .../desc/TextKeywordExtractionAEDescriptor.xml  |   107 -
 .../desc/TextLanguageDetectionAEDescriptor.xml  |   107 -
 .../TextRankedEntityExtractionAEDescriptor.xml  |   403 -
 .../apache/uima/desc/WhitespaceTokenizer.xml    |   115 -
 .../desc/baseAlchemyTypeSystemDescriptor.xml    |    41 -
 .../collection1/conf/aggregate-uima-config.xml  |    48 -
 .../solr/collection1/conf/uima-fields.xml       |     9 -
 .../src/test-files/uima/AggregateSentenceAE.xml |    70 -
 .../test-files/uima/DummyEntityAEDescriptor.xml |    68 -
 .../uima/DummyExceptionAEDescriptor.xml         |    40 -
 .../uima/DummySentimentAnalysisAEDescriptor.xml |    60 -
 .../contrib/uima/src/test-files/uima/TestAE.xml |    72 -
 .../src/test-files/uima/TestExceptionAE.xml     |    54 -
 .../uima/solr/collection1/conf/protwords.txt    |    21 -
 .../uima/solr/collection1/conf/schema.xml       |   612 -
 .../uima/solr/collection1/conf/solrconfig.xml   |   773 -
 .../uima/solr/collection1/conf/spellings.txt    |     2 -
 .../uima/solr/collection1/conf/stopwords.txt    |    58 -
 .../uima/solr/collection1/conf/synonyms.txt     |    31 -
 .../uima/src/test-files/uima/stoptypes.txt      |    25 -
 .../test-files/uima/uima-tokenizers-schema.xml  |   613 -
 .../uima/uima-tokenizers-solrconfig.xml         |   653 -
 .../UIMATokenizersSolrIntegrationTest.java      |    72 -
 .../UIMAUpdateRequestProcessorTest.java         |   186 -
 .../uima/processor/an/DummyEntityAnnotator.java |    47 -
 .../processor/an/DummyExceptionAnnotator.java   |    30 -
 .../processor/an/DummySentimentAnnotator.java   |    60 -
 .../solr/uima/ts/DummySentimentAnnotation.java  |    81 -
 .../uima/ts/DummySentimentAnnotation_Type.java  |    80 -
 .../apache/solr/uima/ts/EntityAnnotation.java   |    99 -
 .../solr/uima/ts/EntityAnnotation_Type.java     |   102 -
 solr/contrib/velocity/ivy.xml                   |     1 -
 .../solr/response/VelocityResponseWriter.java   |     6 +
 .../velocity/VelocityResponseWriterTest.java    |     6 +
 solr/core/ivy.xml                               |     3 +-
 .../src/java/org/apache/solr/api/ApiBag.java    |     6 +-
 .../java/org/apache/solr/api/V2HttpCall.java    |    45 +-
 .../solrj/embedded/EmbeddedSolrServer.java      |    54 +-
 .../client/solrj/embedded/JettySolrRunner.java  |    10 +-
 .../org/apache/solr/cloud/ElectionContext.java  |     4 +-
 .../java/org/apache/solr/cloud/Overseer.java    |    37 +-
 .../solr/cloud/OverseerTaskProcessor.java       |     8 +-
 .../org/apache/solr/cloud/RecoveryStrategy.java |    45 +-
 .../apache/solr/cloud/ReplicateFromLeader.java  |     2 +-
 .../org/apache/solr/cloud/SyncStrategy.java     |     5 +-
 .../org/apache/solr/cloud/ZkController.java     |    60 +
 .../org/apache/solr/cloud/ZkShardTerms.java     |    18 +-
 .../cloud/api/collections/AddReplicaCmd.java    |    55 +-
 .../solr/cloud/api/collections/Assign.java      |     2 +-
 .../solr/cloud/api/collections/BackupCmd.java   |     2 +-
 .../api/collections/CreateCollectionCmd.java    |   145 +-
 .../api/collections/DeleteCollectionCmd.java    |    66 +-
 .../cloud/api/collections/DeleteReplicaCmd.java |     1 +
 .../api/collections/MaintainRoutedAliasCmd.java |     2 +-
 .../solr/cloud/api/collections/MigrateCmd.java  |     8 +-
 .../cloud/api/collections/MoveReplicaCmd.java   |    40 +-
 .../OverseerCollectionMessageHandler.java       |    30 +-
 .../solr/cloud/api/collections/RestoreCmd.java  |    37 +-
 .../cloud/api/collections/SetAliasPropCmd.java  |    45 +-
 .../cloud/api/collections/SplitShardCmd.java    |   274 +-
 .../cloud/api/collections/TimeRoutedAlias.java  |     2 +
 .../cloud/autoscaling/AutoScalingHandler.java   |     6 +-
 .../cloud/autoscaling/ComputePlanAction.java    |    19 +-
 .../cloud/autoscaling/IndexSizeTrigger.java     |    90 +-
 .../autoscaling/OverseerTriggerThread.java      |    12 +-
 .../cloud/autoscaling/SearchRateTrigger.java    |   487 +-
 .../cloud/overseer/ClusterStateMutator.java     |     4 +-
 .../solr/cloud/overseer/CollectionMutator.java  |    28 +-
 .../solr/cloud/overseer/ReplicaMutator.java     |    47 +-
 .../org/apache/solr/core/BlobRepository.java    |    16 +-
 .../org/apache/solr/core/ConfigSetService.java  |    15 +-
 .../org/apache/solr/core/CoreContainer.java     |   154 +-
 .../apache/solr/core/CorePropertiesLocator.java |    22 +-
 .../apache/solr/core/HdfsDirectoryFactory.java  |    15 +-
 .../apache/solr/core/MMapDirectoryFactory.java  |     2 +-
 .../org/apache/solr/core/MetricsConfig.java     |    17 +-
 .../solr/core/NRTCachingDirectoryFactory.java   |     2 +-
 .../java/org/apache/solr/core/NodeConfig.java   |    17 +-
 .../java/org/apache/solr/core/PluginBag.java    |    12 +-
 .../java/org/apache/solr/core/SolrConfig.java   |    45 +-
 .../src/java/org/apache/solr/core/SolrCore.java |   154 +-
 .../apache/solr/core/SolrResourceLoader.java    |    12 +-
 .../org/apache/solr/core/SolrXmlConfig.java     |     7 +
 .../org/apache/solr/handler/BlobHandler.java    |     8 +-
 .../apache/solr/handler/CdcrRequestHandler.java |     8 +-
 .../org/apache/solr/handler/ExportHandler.java  |     1 +
 .../org/apache/solr/handler/ExportWriter.java   |  1764 -
 .../org/apache/solr/handler/GraphHandler.java   |     4 +-
 .../org/apache/solr/handler/IndexFetcher.java   |    44 +-
 .../solr/handler/MoreLikeThisHandler.java       |    42 +-
 .../apache/solr/handler/ReplicationHandler.java |    27 +-
 .../apache/solr/handler/RequestHandlerBase.java |    16 +-
 .../org/apache/solr/handler/SQLHandler.java     |     4 +-
 .../org/apache/solr/handler/SnapShooter.java    |     7 +-
 .../apache/solr/handler/SolrConfigHandler.java  |    11 +-
 .../solr/handler/SolrDefaultStreamFactory.java  |    53 +
 .../org/apache/solr/handler/StreamHandler.java  |    15 +-
 .../solr/handler/UpdateRequestHandler.java      |     2 +-
 .../solr/handler/admin/AdminHandlersProxy.java  |   128 +
 .../admin/AutoscalingHistoryHandler.java        |     2 +-
 .../handler/admin/CollectionHandlerApi.java     |    56 +-
 .../solr/handler/admin/CollectionsHandler.java  |   228 +-
 .../solr/handler/admin/ConfigSetsHandler.java   |    23 +-
 .../solr/handler/admin/CoreAdminHandler.java    |     6 +
 .../solr/handler/admin/CoreAdminOperation.java  |    46 +-
 .../solr/handler/admin/CreateSnapshotOp.java    |     9 +-
 .../handler/admin/MetricsCollectorHandler.java  |     2 +-
 .../solr/handler/admin/MetricsHandler.java      |    81 +-
 .../handler/admin/MetricsHistoryHandler.java    |   964 +
 .../solr/handler/admin/RequestSyncShardOp.java  |     2 +-
 .../admin/SegmentsInfoRequestHandler.java       |     8 +-
 .../org/apache/solr/handler/admin/SplitOp.java  |    24 +-
 .../solr/handler/admin/SystemInfoHandler.java   |    11 +-
 .../handler/admin/ZookeeperStatusHandler.java   |   222 +
 .../solr/handler/component/ExpandComponent.java |    61 +-
 .../solr/handler/component/FacetComponent.java  |     2 +-
 .../handler/component/HttpShardHandler.java     |     2 +-
 .../component/HttpShardHandlerFactory.java      |     7 +-
 .../solr/handler/component/QueryComponent.java  |     1 +
 .../component/QueryElevationComponent.java      |  1314 +-
 .../handler/component/RangeFacetRequest.java    |     8 +-
 .../handler/component/RealTimeGetComponent.java |    35 +-
 .../solr/handler/component/SearchHandler.java   |    21 +-
 .../handler/component/SpatialHeatmapFacets.java |   405 +-
 .../handler/component/SpellCheckComponent.java  |     8 +-
 .../solr/handler/component/StatsComponent.java  |     2 +-
 .../handler/component/TermVectorComponent.java  |    91 +-
 .../solr/handler/export/BoolFieldWriter.java    |    52 +
 .../solr/handler/export/DateFieldWriter.java    |    46 +
 .../apache/solr/handler/export/DoubleCmp.java   |    43 +
 .../solr/handler/export/DoubleFieldWriter.java  |    45 +
 .../apache/solr/handler/export/DoubleValue.java |    81 +
 .../solr/handler/export/ExportWriter.java       |   448 +
 .../apache/solr/handler/export/FieldWriter.java |    27 +
 .../apache/solr/handler/export/FloatCmp.java    |    44 +
 .../solr/handler/export/FloatFieldWriter.java   |    45 +
 .../apache/solr/handler/export/FloatValue.java  |    78 +
 .../org/apache/solr/handler/export/IntComp.java |    45 +
 .../solr/handler/export/IntFieldWriter.java     |    45 +
 .../apache/solr/handler/export/IntValue.java    |    77 +
 .../org/apache/solr/handler/export/LongCmp.java |    45 +
 .../solr/handler/export/LongFieldWriter.java    |    45 +
 .../apache/solr/handler/export/LongValue.java   |    78 +
 .../solr/handler/export/MultiFieldWriter.java   |   104 +
 .../solr/handler/export/PriorityQueue.java      |   218 +
 .../org/apache/solr/handler/export/SortDoc.java |   114 +
 .../apache/solr/handler/export/SortQueue.java   |    52 +
 .../apache/solr/handler/export/SortValue.java   |    30 +
 .../solr/handler/export/StringFieldWriter.java  |    52 +
 .../apache/solr/handler/export/StringValue.java |    99 +
 .../solr/handler/export/package-info.java       |    23 +
 .../apache/solr/handler/loader/JsonLoader.java  |   167 +-
 .../apache/solr/handler/loader/XMLLoader.java   |    18 +-
 .../apache/solr/handler/sql/SolrEnumerator.java |     4 +-
 .../solr/handler/tagger/OffsetCorrector.java    |   178 +
 .../solr/handler/tagger/TagClusterReducer.java  |   103 +
 .../org/apache/solr/handler/tagger/TagLL.java   |   176 +
 .../org/apache/solr/handler/tagger/Tagger.java  |   230 +
 .../handler/tagger/TaggerRequestHandler.java    |   397 +
 .../solr/handler/tagger/TaggingAttribute.java   |    65 +
 .../handler/tagger/TaggingAttributeImpl.java    |    79 +
 .../solr/handler/tagger/TermPrefixCursor.java   |   189 +
 .../solr/handler/tagger/XmlOffsetCorrector.java |   113 +
 .../solr/handler/tagger/package-info.java       |    27 +
 .../solr/highlight/HighlightingPluginBase.java  |     2 +-
 .../apache/solr/logging/MDCLoggingContext.java  |     8 +-
 .../apache/solr/metrics/SolrMetricManager.java  |    18 +-
 .../metrics/reporters/SolrSlf4jReporter.java    |    63 +-
 .../reporters/solr/SolrClusterReporter.java     |    13 +-
 .../reporters/solr/SolrShardReporter.java       |     2 +-
 .../apache/solr/metrics/rrd/SolrRrdBackend.java |   138 +
 .../solr/metrics/rrd/SolrRrdBackendFactory.java |   451 +
 .../apache/solr/metrics/rrd/package-info.java   |    22 +
 .../org/apache/solr/query/SolrRangeQuery.java   |     7 +-
 .../solr/request/LocalSolrQueryRequest.java     |    10 +-
 .../org/apache/solr/request/SimpleFacets.java   |    35 +-
 .../solr/request/json/JsonQueryConverter.java   |    49 +-
 .../apache/solr/response/CSVResponseWriter.java |     2 +-
 .../solr/response/GeoJSONResponseWriter.java    |    11 +-
 .../solr/response/GraphMLResponseWriter.java    |     5 -
 .../solr/response/JSONResponseWriter.java       |   602 +-
 .../org/apache/solr/response/JSONWriter.java    |   181 +
 .../apache/solr/response/PHPResponseWriter.java |     4 +-
 .../response/PHPSerializedResponseWriter.java   |     2 +-
 .../solr/response/QueryResponseWriterUtil.java  |     2 +-
 .../solr/response/RetrieveFieldsOptimizer.java  |     8 +-
 .../solr/response/RubyResponseWriter.java       |     4 +-
 .../solr/response/SmileResponseWriter.java      |     4 +-
 .../solr/response/TextResponseWriter.java       |   222 +-
 .../apache/solr/response/WriteableValue.java    |    25 -
 .../solr/response/XSLTResponseWriter.java       |     2 +-
 .../transform/BaseEditorialTransformer.java     |    19 +-
 .../transform/ChildDocTransformerFactory.java   |    11 +-
 .../transform/ElevatedMarkerFactory.java        |     6 +-
 .../transform/ExcludedMarkerFactory.java        |     6 +-
 .../transform/RawValueTransformerFactory.java   |     9 +-
 .../response/transform/WriteableGeoJSON.java    |     6 +-
 .../apache/solr/schema/AbstractEnumField.java   |   101 +-
 .../apache/solr/schema/CurrencyFieldType.java   |    18 +-
 .../solr/schema/FileExchangeRateProvider.java   |   106 +-
 .../org/apache/solr/schema/IndexSchema.java     |     7 +-
 .../solr/schema/LatLonPointSpatialField.java    |     2 +-
 .../solr/schema/ManagedIndexSchemaFactory.java  |     2 +-
 .../apache/solr/search/AbstractReRankQuery.java |     7 +-
 .../solr/search/CollapsingQParserPlugin.java    |    27 +-
 .../java/org/apache/solr/search/DocSetUtil.java |     4 +-
 .../apache/solr/search/ExportQParserPlugin.java |    33 +-
 .../solr/search/GraphTermsQParserPlugin.java    |    27 +-
 .../java/org/apache/solr/search/Grouping.java   |    73 +-
 .../apache/solr/search/HashQParserPlugin.java   |     4 +-
 .../java/org/apache/solr/search/Insanity.java   |     2 +-
 .../apache/solr/search/JoinQParserPlugin.java   |     4 +-
 .../apache/solr/search/MaxScoreCollector.java   |    55 +
 .../java/org/apache/solr/search/QParser.java    |    30 +-
 .../org/apache/solr/search/QParserPlugin.java   |    80 +-
 .../apache/solr/search/QueryWrapperFilter.java  |   106 -
 .../org/apache/solr/search/ReRankCollector.java |    30 +-
 .../search/SignificantTermsQParserPlugin.java   |    32 +-
 .../apache/solr/search/SolrIndexSearcher.java   |    90 +-
 .../apache/solr/search/TermsQParserPlugin.java  |    22 +-
 .../apache/solr/search/ValueSourceParser.java   |    22 +
 .../apache/solr/search/facet/FacetField.java    |    13 +-
 .../solr/search/facet/FacetFieldMerger.java     |     8 +-
 .../solr/search/facet/FacetFieldProcessor.java  |    53 +-
 .../facet/FacetFieldProcessorByArray.java       |    27 +-
 .../facet/FacetFieldProcessorByArrayDV.java     |     4 +-
 .../FacetFieldProcessorByEnumTermsStream.java   |    25 +-
 .../facet/FacetFieldProcessorByHashDV.java      |    10 +-
 .../apache/solr/search/facet/FacetHeatmap.java  |   520 +
 .../apache/solr/search/facet/FacetMerger.java   |    14 +-
 .../apache/solr/search/facet/FacetModule.java   |    33 +-
 .../solr/search/facet/FacetProcessor.java       |   125 +-
 .../apache/solr/search/facet/FacetRange.java    |   389 +-
 .../solr/search/facet/FacetRangeMerger.java     |    68 +-
 .../apache/solr/search/facet/FacetRequest.java  |   333 +-
 .../search/facet/FacetRequestSortedMerger.java  |    82 +-
 .../org/apache/solr/search/facet/HLLAgg.java    |     3 +-
 .../org/apache/solr/search/facet/MinMaxAgg.java |     9 +-
 .../apache/solr/search/facet/PercentileAgg.java |     3 +-
 .../solr/search/facet/RelatednessAgg.java       |   504 +
 .../org/apache/solr/search/facet/SlotAcc.java   |    60 +-
 .../solr/search/facet/UnInvertedField.java      |    10 +-
 .../org/apache/solr/search/facet/UniqueAgg.java |     3 +-
 .../solr/search/facet/UniqueBlockAgg.java       |    91 +
 .../solr/search/facet/UniqueMultiDvSlotAcc.java |     3 +-
 .../search/facet/UniqueMultivaluedSlotAcc.java  |     5 +-
 .../search/facet/UniqueSinglevaluedSlotAcc.java |    19 +-
 .../apache/solr/search/grouping/Command.java    |     7 +
 .../solr/search/grouping/CommandHandler.java    |     8 +-
 .../distributed/command/QueryCommand.java       |    36 +-
 .../distributed/command/QueryCommandResult.java |     8 +-
 .../command/SearchGroupsFieldCommand.java       |     4 +-
 .../command/TopGroupsFieldCommand.java          |    44 +-
 .../SearchGroupShardResponseProcessor.java      |     2 +-
 .../TopGroupsShardResponseProcessor.java        |    16 +-
 .../TopGroupsResultTransformer.java             |    20 +-
 .../GroupedEndResultTransformer.java            |    13 +-
 .../apache/solr/search/join/FiltersQParser.java |    38 +-
 .../solr/search/mlt/SimpleMLTQParser.java       |     4 +-
 .../solr/security/PKIAuthenticationPlugin.java  |    49 +-
 .../solr/security/PermissionNameProvider.java   |     1 +
 .../apache/solr/security/PublicKeyHandler.java  |    47 +
 ...tContinuesRecorderAuthenticationHandler.java |     2 +-
 .../org/apache/solr/servlet/HttpSolrCall.java   |    14 +-
 .../apache/solr/servlet/LoadAdminUiServlet.java |    10 +-
 .../solr/servlet/ServletInputStreamWrapper.java |     2 +-
 .../servlet/ServletOutputStreamWrapper.java     |     2 +-
 .../apache/solr/servlet/SolrDispatchFilter.java |   185 +-
 .../apache/solr/servlet/SolrRequestParsers.java |     8 +-
 .../solr/spelling/DirectSolrSpellChecker.java   |     2 +-
 .../solr/spelling/SpellCheckCollator.java       |     4 +-
 .../solr/store/hdfs/HdfsLocalityReporter.java   |     8 +-
 .../apache/solr/uninverting/DocTermOrds.java    |     5 +-
 .../solr/uninverting/UninvertingReader.java     |     2 +-
 .../apache/solr/update/AddUpdateCommand.java    |   204 +-
 .../apache/solr/update/CdcrTransactionLog.java  |    20 +-
 .../org/apache/solr/update/CdcrUpdateLog.java   |     5 +-
 .../org/apache/solr/update/CommitTracker.java   |    66 +-
 .../apache/solr/update/CommitUpdateCommand.java |     2 +-
 .../solr/update/DefaultSolrCoreState.java       |     5 +-
 .../solr/update/DirectUpdateHandler2.java       |   151 +-
 .../org/apache/solr/update/DocumentBuilder.java |    37 +-
 .../apache/solr/update/HdfsTransactionLog.java  |    18 +-
 .../org/apache/solr/update/HdfsUpdateLog.java   |    85 +-
 .../java/org/apache/solr/update/PeerSync.java   |   796 +-
 .../apache/solr/update/PeerSyncWithLeader.java  |   372 +
 .../apache/solr/update/SolrCmdDistributor.java  |   238 +-
 .../org/apache/solr/update/SolrCoreState.java   |     9 +
 .../org/apache/solr/update/SolrIndexConfig.java |     4 +
 .../apache/solr/update/SolrIndexSplitter.java   |   469 +-
 .../apache/solr/update/SplitIndexCommand.java   |    22 +-
 .../solr/update/StreamingSolrClients.java       |    16 +-
 .../org/apache/solr/update/TransactionLog.java  |    67 +-
 .../java/org/apache/solr/update/UpdateLog.java  |   408 +-
 .../apache/solr/update/UpdateShardHandler.java  |    92 +-
 .../ClassificationUpdateProcessorFactory.java   |     2 +-
 .../processor/DistributedUpdateProcessor.java   |    78 +-
 .../DocBasedVersionConstraintsProcessor.java    |    19 +-
 ...BasedVersionConstraintsProcessorFactory.java |    20 +-
 ...oreCommitOptimizeUpdateProcessorFactory.java |     2 +-
 .../IgnoreLargeDocumentProcessorFactory.java    |   175 +
 .../processor/LogUpdateProcessorFactory.java    |     2 +-
 .../processor/NestedUpdateProcessorFactory.java |   137 +
 .../ParseDateFieldUpdateProcessorFactory.java   |    82 +-
 .../processor/RegexpBoostProcessorFactory.java  |     2 +-
 .../SignatureUpdateProcessorFactory.java        |     2 +-
 .../TimeRoutedAliasUpdateProcessor.java         |    34 +-
 .../processor/URLClassifyProcessorFactory.java  |     2 +-
 .../processor/UpdateRequestProcessorChain.java  |    39 +
 .../java/org/apache/solr/util/FastWriter.java   |   157 -
 .../java/org/apache/solr/util/IOFunction.java   |    29 +
 .../org/apache/solr/util/OrderedExecutor.java   |   116 +
 .../org/apache/solr/util/SafeXMLParsing.java    |   120 +
 .../src/java/org/apache/solr/util/SolrCLI.java  |    28 +-
 .../org/apache/solr/util/SystemIdResolver.java  |    14 +-
 .../org/apache/solr/util/TestInjection.java     |    68 +-
 .../src/test-files/runtimecode/TestURP.java     |    30 +
 .../test-files/runtimecode/runtimeurp.jar.bin   |   Bin 0 -> 753 bytes
 .../conf/bad-solrconfig-no-autocommit-tag.xml   |    52 +
 .../solr/collection1/conf/protected-1.txt       |    17 +
 .../solr/collection1/conf/protected-2.txt       |    17 +
 .../collection1/conf/schema-copyfield-test.xml  |     4 -
 .../solr/collection1/conf/schema-hash.xml       |     4 -
 .../conf/schema-luceneMatchVersion.xml          |     2 -
 .../conf/schema-not-required-unique-key.xml     |     1 -
 .../collection1/conf/schema-protected-term.xml  |    86 +
 .../collection1/conf/schema-required-fields.xml |     4 -
 .../solr/collection1/conf/schema-rest.xml       |     3 -
 .../collection1/conf/schema-sortingresponse.xml |     5 +-
 .../collection1/conf/schema-spellchecker.xml    |     3 -
 .../solr/collection1/conf/schema-sql.xml        |     4 -
 .../solr/collection1/conf/schema-tagger.xml     |   187 +
 .../test-files/solr/collection1/conf/schema.xml |     8 +-
 .../solr/collection1/conf/schema11.xml          |     1 -
 .../solr/collection1/conf/schema12.xml          |     3 -
 .../solr/collection1/conf/schema15.xml          |     6 +-
 .../solr/collection1/conf/schema_codec.xml      |     5 +-
 .../solr/collection1/conf/schema_latest.xml     |     2 +-
 .../solr/collection1/conf/schemasurround.xml    |     3 -
 ...dd-schema-fields-update-processor-chains.xml |    20 +-
 .../solrconfig-concurrentmergescheduler.xml     |    37 +
 .../solrconfig-externalversionconstraint.xml    |    25 +
 ...lrconfig-parsing-update-processor-chains.xml |    49 +-
 .../collection1/conf/solrconfig-schemaless.xml  |    20 +-
 .../solr/collection1/conf/solrconfig-tagger.xml |    59 +
 .../solr/collection1/conf/solrconfig-tlog.xml   |     4 +
 .../conf/solrconfig-update-processor-chains.xml |     5 +
 .../configsets/_default/conf/managed-schema     |     2 +-
 .../configsets/_default/conf/solrconfig.xml     |    22 +-
 .../cloud-minimal/conf/solrconfig.xml           |     3 +
 .../test-files/solr/crazy-path-to-schema.xml    |     1 -
 solr/core/src/test-files/solr/solr-50-all.xml   |     1 +
 .../src/test-files/solr/solr-slf4jreporter.xml  |     7 +
 .../org/apache/solr/BasicFunctionalityTest.java |     2 +-
 .../org/apache/solr/TestDistributedSearch.java  |    50 +-
 .../ProtectedTermFilterFactoryTest.java         |    84 +
 .../apache/solr/cloud/ActionThrottleTest.java   |     6 +
 .../org/apache/solr/cloud/AddReplicaTest.java   |     2 +-
 .../apache/solr/cloud/AliasIntegrationTest.java |    82 +-
 .../cloud/AssignBackwardCompatibilityTest.java  |     1 +
 .../solr/cloud/BasicDistributedZkTest.java      |    56 +-
 .../cloud/ChaosMonkeyNothingIsSafeTest.java     |     4 +-
 .../solr/cloud/ChaosMonkeySafeLeaderTest.java   |     2 +-
 ...aosMonkeySafeLeaderWithPullReplicasTest.java |     2 +-
 .../solr/cloud/ChaosMonkeyShardSplitTest.java   |    11 +-
 .../org/apache/solr/cloud/CloudTestUtils.java   |    21 +-
 .../solr/cloud/CollectionsAPISolrJTest.java     |    99 +
 .../cloud/ConcurrentCreateRoutedAliasTest.java  |     1 +
 .../solr/cloud/CreateRoutedAliasTest.java       |    39 +-
 .../apache/solr/cloud/DeleteReplicaTest.java    |     4 +-
 .../solr/cloud/DocValuesNotIndexedTest.java     |     7 +-
 .../org/apache/solr/cloud/ForceLeaderTest.java  |     2 +-
 .../cloud/FullSolrCloudDistribCmdsTest.java     |     2 +
 .../apache/solr/cloud/HttpPartitionTest.java    |     4 +-
 .../solr/cloud/LIRRollingUpdatesTest.java       |     4 +
 .../cloud/LeaderElectionIntegrationTest.java    |     3 +
 .../cloud/LeaderFailoverAfterPartitionTest.java |     2 +-
 .../solr/cloud/LeaderTragicEventTest.java       |   197 +
 .../solr/cloud/LeaderVoteWaitTimeoutTest.java   |     2 +
 .../solr/cloud/LegacyCloudClusterPropTest.java  |     2 +-
 .../cloud/MetricsHistoryIntegrationTest.java    |   194 +
 .../apache/solr/cloud/MigrateRouteKeyTest.java  |    18 +
 .../solr/cloud/MissingSegmentRecoveryTest.java  |     2 +-
 .../apache/solr/cloud/MoveReplicaHDFSTest.java  |     5 +-
 .../org/apache/solr/cloud/MoveReplicaTest.java  |     4 +-
 .../apache/solr/cloud/MultiThreadedOCPTest.java |     2 +-
 .../apache/solr/cloud/OverseerRolesTest.java    |     1 +
 .../solr/cloud/OverseerTaskQueueTest.java       |     3 +-
 .../solr/cloud/PeerSyncReplicationTest.java     |     2 +-
 .../org/apache/solr/cloud/RecoveryZkTest.java   |     1 +
 .../solr/cloud/ReplaceNodeNoTargetTest.java     |     2 +-
 .../solr/cloud/ReplicationFactorTest.java       |     4 +-
 .../solr/cloud/RestartWhileUpdatingTest.java    |     2 +-
 .../apache/solr/cloud/RollingRestartTest.java   |    11 +-
 .../solr/cloud/SaslZkACLProviderTest.java       |     1 +
 .../cloud/SegmentTerminateEarlyTestState.java   |    22 +-
 .../cloud/SharedFSAutoReplicaFailoverTest.java  |     5 +-
 .../apache/solr/cloud/SolrCloudExampleTest.java |    11 +-
 .../apache/solr/cloud/TestCloudConsistency.java |     5 +-
 .../cloud/TestCloudJSONFacetJoinDomain.java     |    92 +-
 .../solr/cloud/TestCloudJSONFacetSKG.java       |   677 +
 .../apache/solr/cloud/TestCloudPivotFacet.java  |    45 +-
 .../apache/solr/cloud/TestCloudRecovery.java    |    36 +-
 .../solr/cloud/TestCloudSearcherWarming.java    |    41 +-
 .../apache/solr/cloud/TestConfigSetsAPI.java    |    58 +-
 .../solr/cloud/TestLeaderElectionZkExpiry.java  |     1 -
 .../solr/cloud/TestMiniSolrCloudClusterSSL.java |    61 +
 .../org/apache/solr/cloud/TestPrepRecovery.java |     4 +-
 .../org/apache/solr/cloud/TestPullReplica.java  |     5 +-
 .../cloud/TestPullReplicaErrorHandling.java     |     3 +-
 .../apache/solr/cloud/TestSegmentSorting.java   |     4 +-
 .../cloud/TestSolrCloudWithKerberosAlt.java     |     3 +-
 .../TestStressCloudBlindAtomicUpdates.java      |     3 +-
 .../org/apache/solr/cloud/TestTlogReplica.java  |    19 +-
 .../apache/solr/cloud/TestWithCollection.java   |   611 +
 .../solr/cloud/UnloadDistributedZkTest.java     |     1 +
 .../org/apache/solr/cloud/ZkShardTermsTest.java |    50 +
 .../AbstractCloudBackupRestoreTestCase.java     |   141 +-
 .../CollectionsAPIAsyncDistributedZkTest.java   |     4 +-
 .../CollectionsAPIDistributedZkTest.java        |     2 +-
 .../api/collections/CustomCollectionTest.java   |     1 +
 .../HdfsCollectionsAPIDistributedZkTest.java    |     2 +
 .../cloud/api/collections/ShardSplitTest.java   |   252 +-
 .../api/collections/TestCollectionAPI.java      |   120 +
 .../TestCollectionsAPIViaSolrCloudCluster.java  |     2 +-
 .../collections/TestHdfsCloudBackupRestore.java |     5 +-
 .../TestLocalFSCloudBackupRestore.java          |     2 +
 .../AutoAddReplicasIntegrationTest.java         |     4 +-
 .../autoscaling/AutoScalingHandlerTest.java     |    35 +-
 .../autoscaling/ComputePlanActionTest.java      |     6 +-
 .../HdfsAutoAddReplicasIntegrationTest.java     |     1 +
 .../cloud/autoscaling/IndexSizeTriggerTest.java |    70 +-
 .../MetricTriggerIntegrationTest.java           |     2 +
 .../cloud/autoscaling/NodeAddedTriggerTest.java |    27 +-
 .../cloud/autoscaling/NodeLostTriggerTest.java  |     1 +
 .../ScheduledTriggerIntegrationTest.java        |     3 +-
 .../cloud/autoscaling/ScheduledTriggerTest.java |     3 +-
 .../SearchRateTriggerIntegrationTest.java       |   594 +-
 .../autoscaling/SearchRateTriggerTest.java      |   215 +-
 .../solr/cloud/autoscaling/TestPolicyCloud.java |    27 +-
 .../cloud/autoscaling/sim/LiveNodesSet.java     |     8 +-
 .../cloud/autoscaling/sim/SimCloudManager.java  |   250 +-
 .../sim/SimClusterStateProvider.java            |   313 +-
 .../autoscaling/sim/SimNodeStateProvider.java   |   128 +-
 .../autoscaling/sim/SimSolrCloudTestCase.java   |    56 +-
 .../sim/TestClusterStateProvider.java           |     6 +-
 .../autoscaling/sim/TestComputePlanAction.java  |     8 +-
 .../autoscaling/sim/TestExecutePlanAction.java  |     2 +
 .../sim/TestGenericDistributedQueue.java        |     3 +-
 .../cloud/autoscaling/sim/TestLargeCluster.java |   133 +-
 .../cloud/autoscaling/sim/TestPolicyCloud.java  |     6 +-
 .../sim/TestSimDistributedQueue.java            |     1 +
 .../autoscaling/sim/TestTriggerIntegration.java |    17 +-
 .../cloud/cdcr/BaseCdcrDistributedZkTest.java   |     2 +-
 .../solr/cloud/cdcr/CdcrBootstrapTest.java      |     4 +-
 .../cdcr/CdcrReplicationDistributedZkTest.java  |     9 +
 .../cloud/hdfs/HdfsBasicDistributedZk2Test.java |     3 +-
 .../cloud/hdfs/HdfsBasicDistributedZkTest.java  |     1 +
 .../hdfs/HdfsChaosMonkeySafeLeaderTest.java     |     2 +
 .../solr/cloud/hdfs/HdfsNNFailoverTest.java     |     2 +
 .../hdfs/HdfsRestartWhileUpdatingTest.java      |     3 +-
 .../solr/cloud/hdfs/HdfsSyncSliceTest.java      |     2 +
 ...HdfsTlogReplayBufferedWhileIndexingTest.java |     3 +-
 .../cloud/hdfs/HdfsUnloadDistributedZkTest.java |     2 +
 .../HdfsWriteToMultipleCollectionsTest.java     |     2 +
 .../apache/solr/cloud/hdfs/StressHdfsTest.java  |     1 +
 .../apache/solr/core/ResourceLoaderTest.java    |    10 +-
 .../org/apache/solr/core/TestCodecSupport.java  |    34 +-
 .../test/org/apache/solr/core/TestConfig.java   |    36 +
 .../apache/solr/core/TestDynamicLoading.java    |     3 +-
 .../org/apache/solr/core/TestDynamicURP.java    |   110 +
 .../org/apache/solr/core/TestLazyCores.java     |    15 +
 .../apache/solr/core/TestMergePolicyConfig.java |    16 +-
 .../test/org/apache/solr/core/TestNRTOpen.java  |    72 +-
 .../solr/core/TestQuerySenderListener.java      |    45 +-
 .../solr/core/TestQuerySenderNoQuery.java       |    25 +-
 .../apache/solr/core/TestSimpleTextCodec.java   |    10 +-
 .../apache/solr/core/TestSolrConfigHandler.java |    38 +
 .../test/org/apache/solr/core/TestSolrXml.java  |     1 +
 .../handler/AnalysisRequestHandlerTestBase.java |     6 +-
 .../DocumentAnalysisRequestHandlerTest.java     |    47 +-
 .../FieldAnalysisRequestHandlerTest.java        |    62 +-
 .../org/apache/solr/handler/JsonLoaderTest.java |   318 +-
 .../solr/handler/MoreLikeThisHandlerTest.java   |   163 +-
 .../solr/handler/TestReplicationHandler.java    |    38 +-
 .../handler/TestReplicationHandlerBackup.java   |     2 +-
 .../org/apache/solr/handler/TestSQLHandler.java |     3 +
 .../handler/admin/AdminHandlersProxyTest.java   |   119 +
 .../admin/AutoscalingHistoryHandlerTest.java    |    32 +-
 .../admin/MetricsHistoryHandlerTest.java        |   127 +
 .../solr/handler/admin/TestCollectionAPIs.java  |    36 +-
 .../admin/ZookeeperStatusHandlerTest.java       |    85 +
 .../component/CustomHighlightComponentTest.java |     7 +-
 .../component/DistributedMLTComponentTest.java  |     2 +
 .../handler/component/InfixSuggestersTest.java  |    33 +-
 .../component/QueryElevationComponentTest.java  |   343 +-
 .../handler/component/SearchHandlerTest.java    |   134 +
 .../component/SpatialHeatmapFacetsTest.java     |   215 -
 .../component/SpellCheckComponentTest.java      |     2 +-
 .../component/TermVectorComponentTest.java      |   340 +-
 .../handler/component/TestPivotHelperCode.java  |     2 +
 .../solr/handler/export/TestExportWriter.java   |   747 +
 .../tagger/EmbeddedSolrNoSerializeTest.java     |   154 +
 .../handler/tagger/RandomizedTaggerTest.java    |   150 +
 .../apache/solr/handler/tagger/Tagger2Test.java |   176 +
 .../apache/solr/handler/tagger/TaggerTest.java  |   296 +
 .../solr/handler/tagger/TaggerTestCase.java     |   251 +
 .../handler/tagger/TaggingAttributeTest.java    |    73 +
 .../handler/tagger/WordLengthTaggingFilter.java |   110 +
 .../tagger/WordLengthTaggingFilterFactory.java  |    67 +
 .../handler/tagger/XmlInterpolationTest.java    |   224 +
 .../solr/index/hdfs/CheckHdfsIndexTest.java     |     2 +
 .../org/apache/solr/legacy/TestLegacyTerms.java |     8 +-
 .../TestMultiValuedNumericRangeQuery.java       |     2 +-
 .../solr/legacy/TestNumericRangeQuery32.java    |    10 +-
 .../solr/legacy/TestNumericRangeQuery64.java    |    10 +-
 .../reporters/SolrJmxReporterCloudTest.java     |     2 +
 .../reporters/SolrSlf4jReporterTest.java        |     5 +-
 .../reporters/solr/SolrCloudReportersTest.java  |     3 +
 .../metrics/rrd/SolrRrdBackendFactoryTest.java  |   200 +
 .../apache/solr/request/SimpleFacetsTest.java   |    12 +-
 .../org/apache/solr/request/TestFaceting.java   |    12 +-
 .../solr/request/TestIntervalFaceting.java      |    13 +-
 .../apache/solr/response/JSONWriterTest.java    |    53 +-
 .../apache/solr/response/TestExportWriter.java  |   370 -
 .../solr/rest/schema/TestFieldTypeResource.java |     1 -
 .../solr/schema/SchemaApiFailureTest.java       |     4 -
 .../apache/solr/schema/TestCloudSchemaless.java |     1 +
 .../org/apache/solr/schema/TestPointFields.java |    32 +-
 .../search/CurrencyRangeFacetCloudTest.java     |     9 +-
 .../org/apache/solr/search/LargeFieldTest.java  |     9 +-
 .../apache/solr/search/QueryEqualityTest.java   |    14 +-
 .../SignificantTermsQParserPluginTest.java      |    35 +
 .../solr/search/TestFilteredDocIdSet.java       |     8 +-
 .../org/apache/solr/search/TestFiltering.java   |    12 +-
 .../solr/search/TestHashQParserPlugin.java      |    30 +-
 .../org/apache/solr/search/TestLFUCache.java    |    31 +-
 .../apache/solr/search/TestNoOpRegenerator.java |    20 +-
 .../org/apache/solr/search/TestQueryTypes.java  |     4 +-
 .../solr/search/TestQueryWrapperFilter.java     |   241 -
 .../apache/solr/search/TestRankQueryPlugin.java |     5 +-
 .../org/apache/solr/search/TestRecovery.java    |   143 +-
 .../apache/solr/search/TestRecoveryHdfs.java    |    48 +-
 .../apache/solr/search/TestSolr4Spatial2.java   |     5 +-
 .../test/org/apache/solr/search/TestSort.java   |     4 +-
 .../solr/search/TestStandardQParsers.java       |    10 +-
 .../apache/solr/search/TestStressRecovery.java  |     1 +
 .../org/apache/solr/search/facet/DebugAgg.java  |    93 +-
 ...ibutedFacetSimpleRefinementLongTailTest.java |    19 +-
 .../solr/search/facet/RangeFacetCloudTest.java  |   786 +
 .../search/facet/SpatialHeatmapFacetsTest.java  |   349 +
 .../search/facet/TestJsonFacetRefinement.java   |  1263 +-
 .../solr/search/facet/TestJsonFacets.java       |   440 +
 .../facet/TestJsonFacetsStatsParsing.java       |   106 +
 .../facet/TestJsonFacetsWithNestedObjects.java  |    26 +
 .../function/TestMinMaxOnMultiValuedField.java  |     2 +-
 .../solr/search/function/TestOrdValues.java     |     2 +-
 .../function/TestSortByMinMaxFunction.java      |     2 +-
 .../apache/solr/search/join/BJQParserTest.java  |    61 +-
 .../search/join/BlockJoinFacetDistribTest.java  |    77 +-
 .../solr/search/json/TestJsonRequest.java       |   167 +-
 .../similarities/BaseSimilarityTestCase.java    |    16 +-
 .../solr/search/stats/TestDistribIDF.java       |     2 +
 .../solr/security/BasicAuthIntegrationTest.java |     1 +
 .../security/TestPKIAuthenticationPlugin.java   |     7 +-
 .../hadoop/TestDelegationWithHadoopAuth.java    |     2 +
 .../TestSolrCloudWithHadoopAuthPlugin.java      |     1 +
 .../solr/servlet/HttpSolrCallGetCoreTest.java   |     2 +
 .../spelling/DirectSolrSpellCheckerTest.java    |    33 +-
 .../spelling/FileBasedSpellCheckerTest.java     |   112 +-
 .../spelling/IndexBasedSpellCheckerTest.java    |   263 +-
 .../solr/spelling/SpellCheckCollatorTest.java   |     2 +-
 .../spelling/WordBreakSolrSpellCheckerTest.java |    15 +-
 .../TestHighFrequencyDictionaryFactory.java     |    10 +-
 .../solr/store/blockcache/BlockCacheTest.java   |     1 +
 .../store/blockcache/BlockDirectoryTest.java    |     2 +
 .../solr/store/hdfs/HdfsDirectoryTest.java      |     2 +-
 .../TestDocTermOrdsUninvertLimit.java           |     2 +-
 .../solr/uninverting/TestFieldCacheSort.java    |   138 +-
 .../uninverting/TestFieldCacheSortRandom.java   |     6 +-
 .../uninverting/TestFieldCacheVsDocValues.java  |   111 +-
 .../solr/uninverting/TestNumericTerms32.java    |     2 +-
 .../solr/uninverting/TestNumericTerms64.java    |     2 +-
 .../apache/solr/update/AddBlockUpdateTest.java  |   321 +-
 .../update/DirectUpdateHandlerOptimizeTest.java |   101 -
 .../solr/update/DirectUpdateHandlerTest.java    |     2 +-
 .../solr/update/MaxSizeAutoCommitTest.java      |   401 +
 .../solr/update/MockStreamingSolrClients.java   |    27 +-
 .../update/PeerSyncWithBufferUpdatesTest.java   |   223 +
 ...ithLeaderAndIndexFingerprintCachingTest.java |    36 +
 .../solr/update/PeerSyncWithLeaderTest.java     |    39 +
 .../solr/update/SolrCmdDistributorTest.java     |   370 +-
 .../apache/solr/update/SolrIndexConfigTest.java |    24 +
 .../solr/update/SolrIndexSplitterTest.java      |   122 +-
 .../update/TestDocBasedVersionConstraints.java  |    44 +
 .../apache/solr/update/TestHdfsUpdateLog.java   |     1 +
 .../solr/update/TestInPlaceUpdatesDistrib.java  |     3 +
 .../update/TestInPlaceUpdatesStandalone.java    |    16 +-
 .../solr/update/TestNestedUpdateProcessor.java  |   195 +
 .../apache/solr/update/TransactionLogTest.java  |    44 +
 ...dSchemaFieldsUpdateProcessorFactoryTest.java |    23 +-
 .../update/processor/AtomicUpdatesTest.java     |    16 +-
 .../DistributedUpdateProcessorTest.java         |    54 +
 .../FieldMutatingUpdateProcessorTest.java       |    40 +-
 ...ommitOptimizeUpdateProcessorFactoryTest.java |     2 +-
 ...IgnoreLargeDocumentProcessorFactoryTest.java |   181 +
 .../ParsingFieldUpdateProcessorsTest.java       |   157 +-
 .../solr/update/processor/RuntimeUrp.java       |     3 +
 .../SignatureUpdateProcessorFactoryTest.java    |     4 +-
 ...atelessScriptUpdateProcessorFactoryTest.java |    12 +-
 .../processor/TestNamedUpdateProcessors.java    |     1 +
 .../TimeRoutedAliasUpdateProcessorTest.java     |   235 +-
 .../TrackingUpdateProcessorFactory.java         |   226 +
 .../org/apache/solr/util/CircularListTest.java  |    12 +-
 .../solr/util/MockSearchableSolrClient.java     |   117 +
 .../apache/solr/util/OrderedExecutorTest.java   |   105 +
 .../apache/solr/util/SolrPluginUtilsTest.java   |     2 +-
 .../org/apache/solr/util/TestFastWriter.java    |   124 -
 .../apache/solr/util/TestSafeXMLParsing.java    |    99 +
 .../apache/solr/util/TestSystemIdResolver.java  |    41 +-
 .../test/org/apache/solr/util/TestUtils.java    |    36 +-
 solr/example/README.txt                         |     4 +-
 solr/example/files/conf/solrconfig.xml          |    20 +-
 solr/example/resources/log4j2.xml               |    54 -
 .../licenses/AlchemyAPIAnnotator-2.3.1.jar.sha1 |     1 -
 .../AlchemyAPIAnnotator-LICENSE-ASL.txt         |   202 -
 solr/licenses/AlchemyAPIAnnotator-NOTICE.txt    |     7 -
 .../licenses/OpenCalaisAnnotator-2.3.1.jar.sha1 |     1 -
 .../OpenCalaisAnnotator-LICENSE-ASL.txt         |   202 -
 solr/licenses/OpenCalaisAnnotator-NOTICE.txt    |     7 -
 solr/licenses/Tagger-2.3.1.jar.sha1             |     1 -
 solr/licenses/Tagger-LICENSE-ASL.txt            |   202 -
 solr/licenses/Tagger-NOTICE.txt                 |     7 -
 .../licenses/WhitespaceTokenizer-2.3.1.jar.sha1 |     1 -
 .../WhitespaceTokenizer-LICENSE-ASL.txt         |   202 -
 solr/licenses/WhitespaceTokenizer-NOTICE.txt    |     7 -
 solr/licenses/attributes-binder-1.3.1.jar.sha1  |     1 -
 solr/licenses/attributes-binder-1.3.3.jar.sha1  |     1 +
 solr/licenses/carrot2-mini-3.15.0.jar.sha1      |     1 -
 solr/licenses/carrot2-mini-3.16.0.jar.sha1      |     1 +
 solr/licenses/commons-beanutils-1.8.3.jar.sha1  |     1 -
 solr/licenses/commons-beanutils-LICENSE-ASL.txt |   202 -
 solr/licenses/commons-beanutils-NOTICE.txt      |     2 -
 solr/licenses/commons-compress-1.14.jar.sha1    |     1 -
 solr/licenses/commons-compress-1.16.1.jar.sha1  |     1 +
 solr/licenses/commons-digester-2.1.jar.sha1     |     1 -
 solr/licenses/fontbox-2.0.8.jar.sha1            |     1 -
 solr/licenses/fontbox-2.0.9.jar.sha1            |     1 +
 solr/licenses/hppc-0.7.3.jar.sha1               |     1 -
 solr/licenses/hppc-0.8.1.jar.sha1               |     1 +
 solr/licenses/icu4j-61.1.jar.sha1               |     1 -
 solr/licenses/icu4j-62.1.jar.sha1               |     1 +
 solr/licenses/jackcess-2.1.10.jar.sha1          |     1 +
 solr/licenses/jackcess-2.1.8.jar.sha1           |     1 -
 .../licenses/jackson-annotations-2.5.4.jar.sha1 |     1 -
 .../licenses/jackson-annotations-2.9.5.jar.sha1 |     1 +
 solr/licenses/jackson-core-2.5.4.jar.sha1       |     1 -
 solr/licenses/jackson-core-2.9.5.jar.sha1       |     1 +
 solr/licenses/jackson-databind-2.5.4.jar.sha1   |     1 -
 solr/licenses/jackson-databind-2.9.5.jar.sha1   |     1 +
 .../jackson-dataformat-smile-2.5.4.jar.sha1     |     1 -
 .../jackson-dataformat-smile-2.9.5.jar.sha1     |     1 +
 solr/licenses/jdom-2.0.2.jar.sha1               |     1 -
 solr/licenses/jdom-LICENSE-BSD_LIKE.txt         |    56 -
 solr/licenses/jdom-NOTICE.txt                   |     6 -
 solr/licenses/jdom2-2.0.6.jar.sha1              |     1 +
 solr/licenses/jdom2-LICENSE-BSD_LIKE.txt        |    56 +
 solr/licenses/jdom2-NOTICE.txt                  |     6 +
 ...jetty-continuation-9.4.11.v20180605.jar.sha1 |     1 +
 .../jetty-continuation-9.4.8.v20171121.jar.sha1 |     1 -
 .../jetty-deploy-9.4.11.v20180605.jar.sha1      |     1 +
 .../jetty-deploy-9.4.8.v20171121.jar.sha1       |     1 -
 .../jetty-http-9.4.11.v20180605.jar.sha1        |     1 +
 .../jetty-http-9.4.8.v20171121.jar.sha1         |     1 -
 .../licenses/jetty-io-9.4.11.v20180605.jar.sha1 |     1 +
 solr/licenses/jetty-io-9.4.8.v20171121.jar.sha1 |     1 -
 .../jetty-jmx-9.4.11.v20180605.jar.sha1         |     1 +
 .../licenses/jetty-jmx-9.4.8.v20171121.jar.sha1 |     1 -
 .../jetty-rewrite-9.4.11.v20180605.jar.sha1     |     1 +
 .../jetty-rewrite-9.4.8.v20171121.jar.sha1      |     1 -
 .../jetty-security-9.4.11.v20180605.jar.sha1    |     1 +
 .../jetty-security-9.4.8.v20171121.jar.sha1     |     1 -
 .../jetty-server-9.4.11.v20180605.jar.sha1      |     1 +
 .../jetty-server-9.4.8.v20171121.jar.sha1       |     1 -
 .../jetty-servlet-9.4.11.v20180605.jar.sha1     |     1 +
 .../jetty-servlet-9.4.8.v20171121.jar.sha1      |     1 -
 .../jetty-servlets-9.4.11.v20180605.jar.sha1    |     1 +
 .../jetty-servlets-9.4.8.v20171121.jar.sha1     |     1 -
 .../jetty-util-9.4.11.v20180605.jar.sha1        |     1 +
 .../jetty-util-9.4.8.v20171121.jar.sha1         |     1 -
 .../jetty-webapp-9.4.11.v20180605.jar.sha1      |     1 +
 .../jetty-webapp-9.4.8.v20171121.jar.sha1       |     1 -
 .../jetty-xml-9.4.11.v20180605.jar.sha1         |     1 +
 .../licenses/jetty-xml-9.4.8.v20171121.jar.sha1 |     1 -
 solr/licenses/joda-time-2.2.jar.sha1            |     1 -
 solr/licenses/joda-time-LICENSE-ASL.txt         |   202 -
 solr/licenses/joda-time-NOTICE.txt              |     5 -
 solr/licenses/jsoup-1.11.2.jar.sha1             |     1 +
 solr/licenses/jsoup-1.8.2.jar.sha1              |     1 -
 solr/licenses/junit4-ant-2.5.3.jar.sha1         |     1 -
 solr/licenses/junit4-ant-2.6.0.jar.sha1         |     1 +
 solr/licenses/metrics-core-3.2.2.jar.sha1       |     1 -
 solr/licenses/metrics-core-3.2.6.jar.sha1       |     1 +
 solr/licenses/metrics-ganglia-3.2.2.jar.sha1    |     1 -
 solr/licenses/metrics-ganglia-3.2.6.jar.sha1    |     1 +
 solr/licenses/metrics-graphite-3.2.2.jar.sha1   |     1 -
 solr/licenses/metrics-graphite-3.2.6.jar.sha1   |     1 +
 solr/licenses/metrics-jetty9-3.2.2.jar.sha1     |     1 -
 solr/licenses/metrics-jetty9-3.2.6.jar.sha1     |     1 +
 solr/licenses/metrics-jvm-3.2.2.jar.sha1        |     1 -
 solr/licenses/metrics-jvm-3.2.6.jar.sha1        |     1 +
 solr/licenses/morfologik-fsa-2.1.1.jar.sha1     |     1 -
 solr/licenses/morfologik-fsa-2.1.5.jar.sha1     |     1 +
 solr/licenses/morfologik-polish-2.1.1.jar.sha1  |     1 -
 solr/licenses/morfologik-polish-2.1.5.jar.sha1  |     1 +
 .../licenses/morfologik-stemming-2.1.1.jar.sha1 |     1 -
 .../licenses/morfologik-stemming-2.1.5.jar.sha1 |     1 +
 solr/licenses/opennlp-maxent-3.0.3.jar.sha1     |     1 -
 solr/licenses/opennlp-maxent-LICENSE-ASL.txt    |   202 -
 solr/licenses/opennlp-maxent-NOTICE.txt         |     6 -
 solr/licenses/opennlp-tools-1.8.3.jar.sha1      |     1 -
 solr/licenses/opennlp-tools-1.9.0.jar.sha1      |     1 +
 solr/licenses/pdfbox-2.0.8.jar.sha1             |     1 -
 solr/licenses/pdfbox-2.0.9.jar.sha1             |     1 +
 solr/licenses/pdfbox-tools-2.0.8.jar.sha1       |     1 -
 solr/licenses/pdfbox-tools-2.0.9.jar.sha1       |     1 +
 .../randomizedtesting-runner-2.5.3.jar.sha1     |     1 -
 .../randomizedtesting-runner-2.6.0.jar.sha1     |     1 +
 solr/licenses/rrd4j-3.2.jar.sha1                |     1 +
 solr/licenses/rrd4j-LICENSE-ASL.txt             |   202 +
 solr/licenses/rrd4j-NOTICE.txt                  |     2 +
 solr/licenses/start.jar.sha1                    |     2 +-
 solr/licenses/tika-core-1.17.jar.sha1           |     1 -
 solr/licenses/tika-core-1.18.jar.sha1           |     1 +
 solr/licenses/tika-java7-1.17.jar.sha1          |     1 -
 solr/licenses/tika-java7-1.18.jar.sha1          |     1 +
 solr/licenses/tika-parsers-1.17.jar.sha1        |     1 -
 solr/licenses/tika-parsers-1.18.jar.sha1        |     1 +
 solr/licenses/tika-xmp-1.17.jar.sha1            |     1 -
 solr/licenses/tika-xmp-1.18.jar.sha1            |     1 +
 solr/licenses/uimaj-core-2.3.1.jar.sha1         |     1 -
 solr/licenses/uimaj-core-LICENSE-ASL.txt        |   202 -
 solr/licenses/uimaj-core-NOTICE.txt             |    13 -
 solr/licenses/xz-1.6.jar.sha1                   |     1 -
 solr/licenses/xz-1.8.jar.sha1                   |     1 +
 solr/server/README.txt                          |     2 +-
 solr/server/ivy.xml                             |     7 +-
 solr/server/resources/log4j2-console.xml        |    39 +
 solr/server/resources/log4j2.xml                |    22 +
 solr/server/scripts/cloud-scripts/log4j2.xml    |    37 -
 .../scripts/cloud-scripts/snapshotscli.sh       |     2 +-
 solr/server/scripts/cloud-scripts/zkcli.bat     |     4 +-
 solr/server/scripts/cloud-scripts/zkcli.sh      |     2 +-
 .../configsets/_default/conf/managed-schema     |     2 +-
 .../configsets/_default/conf/solrconfig.xml     |    22 +-
 solr/solr-ref-guide/README.adoc                 |     3 +-
 solr/solr-ref-guide/src/_includes/head.html     |     1 -
 solr/solr-ref-guide/src/_layouts/home.html      |    31 +
 solr/solr-ref-guide/src/_layouts/page.html      |    12 -
 solr/solr-ref-guide/src/about-filters.adoc      |     3 +-
 solr/solr-ref-guide/src/about-this-guide.adoc   |     2 +
 solr/solr-ref-guide/src/analyzers.adoc          |     1 -
 .../src/basic-authentication-plugin.adoc        |     2 +
 solr/solr-ref-guide/src/blob-store-api.adoc     |    96 +-
 solr/solr-ref-guide/src/blockjoin-faceting.adoc |     3 +-
 solr/solr-ref-guide/src/cdcr-config.adoc        |    66 +-
 solr/solr-ref-guide/src/cloud-screens.adoc      |    38 +-
 solr/solr-ref-guide/src/collections-api.adoc    |    97 +-
 .../src/colocating-collections.adoc             |    76 +
 solr/solr-ref-guide/src/config-api.adoc         |   720 +-
 solr/solr-ref-guide/src/config-sets.adoc        |    36 +-
 solr/solr-ref-guide/src/configsets-api.adoc     |   246 +-
 .../solr-ref-guide/src/configuring-logging.adoc |     2 +-
 .../src/configuring-solrconfig-xml.adoc         |    42 +-
 solr/solr-ref-guide/src/css/comments.css        |   160 -
 solr/solr-ref-guide/src/css/customstyles.css    |    31 +-
 solr/solr-ref-guide/src/css/ref-guide.css       |     1 +
 .../src/distributed-requests.adoc               |    40 +-
 solr/solr-ref-guide/src/dsp.adoc                |   719 +
 solr/solr-ref-guide/src/enabling-ssl.adoc       |    23 +-
 .../src/exporting-result-sets.adoc              |     3 +-
 .../solr-ref-guide/src/filter-descriptions.adoc |   112 +-
 solr/solr-ref-guide/src/format-of-solr-xml.adoc |     5 +
 solr/solr-ref-guide/src/how-to-contribute.adoc  |     4 +-
 .../src/images/cloud-screens/cloud-graph.png    |   Bin 54929 -> 94496 bytes
 .../src/images/cloud-screens/cloud-hover.png    |   Bin 0 -> 83343 bytes
 .../src/images/cloud-screens/cloud-nodes.png    |   Bin 0 -> 185805 bytes
 .../src/images/cloud-screens/cloud-radial.png   |   Bin 62572 -> 102878 bytes
 .../src/images/cloud-screens/cloud-tree.png     |   Bin 105371 -> 122158 bytes
 .../src/images/cloud-screens/cloud-zkstatus.png |   Bin 0 -> 175359 bytes
 .../src/images/diagrams/splitshard-seq.png      |   Bin 0 -> 98871 bytes
 .../src/images/diagrams/splitshard-seq.puml     |   115 +
 .../hidden-signal-autocorrelation.png           |   Bin 0 -> 258831 bytes
 .../math-expressions/hidden-signal-fft.png      |   Bin 0 -> 215981 bytes
 .../images/math-expressions/hidden-signal.png   |   Bin 0 -> 319100 bytes
 .../math-expressions/noise-autocorrelation.png  |   Bin 0 -> 204511 bytes
 .../src/images/math-expressions/noise-fft.png   |   Bin 0 -> 319551 bytes
 .../src/images/math-expressions/noise.png       |   Bin 0 -> 375565 bytes
 .../math-expressions/signal-autocorrelation.png |   Bin 0 -> 322164 bytes
 .../src/images/math-expressions/signal-fft.png  |   Bin 0 -> 140111 bytes
 .../src/images/math-expressions/signal.png      |   Bin 0 -> 365018 bytes
 .../src/images/metrics-history/loadAvg-60s.png  |   Bin 0 -> 7101 bytes
 .../src/images/metrics-history/memHeap-60s.png  |   Bin 0 -> 7559 bytes
 .../metrics-history/query-graph-10min.png       |   Bin 0 -> 5678 bytes
 .../images/metrics-history/query-graph-60s.png  |   Bin 0 -> 6916 bytes
 .../images/metrics-history/update-graph-60s.png |   Bin 0 -> 6473 bytes
 .../src/implicit-requesthandlers.adoc           |   374 +-
 solr/solr-ref-guide/src/index-replication.adoc  |     4 +-
 solr/solr-ref-guide/src/index.adoc              |    91 +-
 .../src/indexconfig-in-solrconfig.adoc          |     5 +-
 .../src/indexing-and-basic-data-operations.adoc |     4 +-
 solr/solr-ref-guide/src/json-facet-api.adoc     |   534 +-
 solr/solr-ref-guide/src/json-query-dsl.adoc     |    17 +
 solr/solr-ref-guide/src/json-request-api.adoc   |     6 +-
 .../src/kerberos-authentication-plugin.adoc     |     6 +-
 solr/solr-ref-guide/src/language-analysis.adoc  |     2 +-
 solr/solr-ref-guide/src/learning-to-rank.adoc   |     4 +-
 solr/solr-ref-guide/src/managed-resources.adoc  |     2 +-
 solr/solr-ref-guide/src/math-expressions.adoc   |     4 +-
 solr/solr-ref-guide/src/meta-docs/jekyll.adoc   |     4 +-
 solr/solr-ref-guide/src/meta-docs/publish.adoc  |   165 +-
 solr/solr-ref-guide/src/metrics-history.adoc    |   485 +
 solr/solr-ref-guide/src/metrics-reporting.adoc  |    85 +-
 solr/solr-ref-guide/src/monitoring-solr.adoc    |     4 +-
 .../src/near-real-time-searching.adoc           |     2 +-
 solr/solr-ref-guide/src/other-parsers.adoc      |     2 +-
 .../src/parallel-sql-interface.adoc             |     4 -
 .../src/requestdispatcher-in-solrconfig.adoc    |     2 +-
 solr/solr-ref-guide/src/result-clustering.adoc  |     2 +-
 solr/solr-ref-guide/src/result-grouping.adoc    |     9 +-
 .../src/running-solr-on-hdfs.adoc               |     2 +-
 solr/solr-ref-guide/src/schemaless-mode.adoc    |    24 +-
 solr/solr-ref-guide/src/searching.adoc          |    33 +-
 ...tting-up-an-external-zookeeper-ensemble.adoc |   405 +-
 .../src/solr-control-script-reference.adoc      |    85 +-
 solr/solr-ref-guide/src/solr-tutorial.adoc      |     4 +-
 solr/solr-ref-guide/src/solr-upgrade-notes.adoc |    26 +
 .../src/solrcloud-autoscaling-api.adoc          |     2 +-
 ...olrcloud-autoscaling-policy-preferences.adoc |   108 +-
 .../src/solrcloud-autoscaling-triggers.adoc     |   121 +-
 ...rcloud-query-routing-and-read-tolerance.adoc |    67 +-
 solr/solr-ref-guide/src/solrcloud.adoc          |     3 +-
 solr/solr-ref-guide/src/spatial-search.adoc     |    18 +-
 .../src/stream-evaluator-reference.adoc         |    35 +
 .../src/streaming-expressions.adoc              |     7 +-
 solr/solr-ref-guide/src/suggester.adoc          |     1 -
 .../src/the-extended-dismax-query-parser.adoc   |     4 +-
 .../src/the-query-elevation-component.adoc      |    11 +
 solr/solr-ref-guide/src/the-tagger-handler.adoc |   268 +
 .../solr-ref-guide/src/time-routed-aliases.adoc |    33 +-
 solr/solr-ref-guide/src/tokenizers.adoc         |     2 +-
 .../src/transforming-result-documents.adoc      |     1 +
 solr/solr-ref-guide/src/uima-integration.adoc   |   122 -
 .../src/update-request-processors.adoc          |     8 +-
 .../src/updatehandlers-in-solrconfig.adoc       |     6 +-
 .../src/updating-parts-of-documents.adoc        |    20 +-
 .../src/uploading-data-with-index-handlers.adoc |     8 +-
 ...zookeeper-to-manage-configuration-files.adoc |     2 +
 solr/solr-ref-guide/src/v2-api.adoc             |     2 +-
 .../cloud/autoscaling/AddReplicaSuggester.java  |     9 +-
 .../client/solrj/cloud/autoscaling/Cell.java    |     5 +-
 .../client/solrj/cloud/autoscaling/Clause.java  |   414 +-
 .../solrj/cloud/autoscaling/ComputedType.java   |    99 +
 .../solrj/cloud/autoscaling/Condition.java      |   122 +
 .../solrj/cloud/autoscaling/CoresVariable.java  |   115 +
 .../autoscaling/DelegatingCloudManager.java     |     2 +-
 .../cloud/autoscaling/DeleteNodeSuggester.java  |    46 +
 .../autoscaling/DeleteReplicaSuggester.java     |    74 +
 .../cloud/autoscaling/FreeDiskVariable.java     |   135 +
 .../cloud/autoscaling/MoveReplicaSuggester.java |    32 +-
 .../solrj/cloud/autoscaling/NodeVariable.java   |    45 +
 .../client/solrj/cloud/autoscaling/Operand.java |   101 +-
 .../client/solrj/cloud/autoscaling/Policy.java  |   452 +-
 .../solrj/cloud/autoscaling/PolicyHelper.java   |    42 +-
 .../solrj/cloud/autoscaling/Preference.java     |     5 +-
 .../solrj/cloud/autoscaling/RangeVal.java       |    54 +
 .../solrj/cloud/autoscaling/ReplicaCount.java   |    28 +-
 .../solrj/cloud/autoscaling/ReplicaInfo.java    |    20 +
 .../cloud/autoscaling/ReplicaVariable.java      |   135 +
 .../client/solrj/cloud/autoscaling/Row.java     |    87 +-
 .../solrj/cloud/autoscaling/SealedClause.java   |    29 +
 .../cloud/autoscaling/SplitShardSuggester.java  |     6 +
 .../solrj/cloud/autoscaling/Suggester.java      |   160 +-
 .../solrj/cloud/autoscaling/Suggestion.java     |   337 +-
 .../solrj/cloud/autoscaling/Variable.java       |   366 +
 .../solrj/cloud/autoscaling/VariableBase.java   |   205 +
 .../solrj/cloud/autoscaling/Violation.java      |   118 +-
 .../autoscaling/WithCollectionVariable.java     |   165 +
 .../solr/client/solrj/impl/CloudSolrClient.java |    33 +-
 .../solr/client/solrj/impl/HttpClientUtil.java  |    59 +-
 .../solrj/impl/SolrClientCloudManager.java      |     2 +-
 .../solrj/impl/SolrClientNodeStateProvider.java |   126 +-
 .../org/apache/solr/client/solrj/io/Lang.java   |    14 +-
 .../client/solrj/io/eval/CanberraEvaluator.java |    49 +
 .../solrj/io/eval/ChebyshevEvaluator.java       |    49 +
 .../solrj/io/eval/ConvolutionEvaluator.java     |     2 +-
 .../client/solrj/io/eval/DistanceEvaluator.java |   118 +-
 .../solrj/io/eval/EarthMoversEvaluator.java     |    49 +
 .../solrj/io/eval/EuclideanEvaluator.java       |    49 +
 .../solr/client/solrj/io/eval/FFTEvaluator.java |    73 +
 .../client/solrj/io/eval/GetValueEvaluator.java |    50 +
 .../client/solrj/io/eval/IFFTEvaluator.java     |    71 +
 .../solr/client/solrj/io/eval/KnnEvaluator.java |    45 +-
 .../solrj/io/eval/ManhattanEvaluator.java       |    49 +
 .../client/solrj/io/eval/MemsetEvaluator.java   |   167 +
 .../solrj/io/eval/NormalizeEvaluator.java       |     2 +-
 .../client/solrj/io/eval/OnesEvaluator.java     |    47 +
 .../client/solrj/io/eval/PolyFitEvaluator.java  |     7 +-
 .../client/solrj/io/eval/RankEvaluator.java     |     2 +-
 .../solrj/io/eval/RecursiveEvaluator.java       |    13 +
 .../client/solrj/io/eval/ScaleEvaluator.java    |     2 +-
 .../client/solrj/io/eval/SetValueEvaluator.java |    58 +
 .../client/solrj/io/eval/ZerosEvaluator.java    |    47 +
 .../solrj/io/graph/GatherNodesStream.java       |    20 +-
 .../solr/client/solrj/io/stream/EvalStream.java |     5 -
 .../client/solrj/io/stream/FacetStream.java     |     6 +-
 .../client/solrj/io/stream/HashJoinStream.java  |    12 +-
 .../solr/client/solrj/io/stream/LetStream.java  |    11 +-
 .../solrj/io/stream/OuterHashJoinStream.java    |     2 +-
 .../client/solrj/io/stream/PriorityStream.java  |     5 -
 .../solrj/io/stream/SignificantTermsStream.java |    18 +-
 .../solr/client/solrj/io/stream/SolrStream.java |     5 -
 .../solr/client/solrj/io/stream/SqlStream.java  |     3 +-
 .../solrj/io/stream/TimeSeriesStream.java       |     4 +-
 .../client/solrj/io/stream/TopicStream.java     |     5 -
 .../client/solrj/io/stream/TupleStream.java     |     5 -
 .../io/stream/expr/DefaultStreamFactory.java    |     2 +
 .../solrj/request/AbstractUpdateRequest.java    |     3 +-
 .../solrj/request/CollectionAdminRequest.java   |   181 +-
 .../solrj/request/CollectionApiMapping.java     |     4 +
 .../request/ContentStreamUpdateRequest.java     |    26 +-
 .../request/JavaBinUpdateRequestCodec.java      |     6 +-
 .../solrj/request/StreamingUpdateRequest.java   |    76 +
 .../solr/client/solrj/request/V2Request.java    |     4 +-
 .../request/schema/AbstractSchemaRequest.java   |     8 -
 .../solrj/request/schema/SchemaRequest.java     |    86 +-
 .../solrj/response/AnalysisResponseBase.java    |    29 +-
 .../response/DocumentAnalysisResponse.java      |    12 +-
 .../solrj/response/FieldAnalysisResponse.java   |    14 +-
 .../solr/client/solrj/util/ClientUtils.java     |    20 +-
 .../java/org/apache/solr/common/MapWriter.java  |    14 +-
 .../org/apache/solr/common/SolrDocument.java    |     1 -
 .../apache/solr/common/SolrDocumentBase.java    |    10 +
 .../org/apache/solr/common/SolrException.java   |     2 +-
 .../apache/solr/common/SolrInputDocument.java   |     8 +-
 .../org/apache/solr/common/SolrInputField.java  |     4 +-
 .../org/apache/solr/common/cloud/Aliases.java   |     6 +-
 .../solr/common/cloud/ClusterProperties.java    |    36 +-
 .../apache/solr/common/cloud/DocCollection.java |    21 +-
 .../org/apache/solr/common/cloud/Replica.java   |     2 +
 .../apache/solr/common/cloud/SolrZkClient.java  |    33 +
 .../apache/solr/common/cloud/ZkStateReader.java |    62 +-
 .../common/params/CollectionAdminParams.java    |    32 +-
 .../solr/common/params/CommonAdminParams.java   |     2 +
 .../apache/solr/common/params/CommonParams.java |    11 +
 .../solr/common/params/CoreAdminParams.java     |     4 +-
 .../common/params/QueryElevationParams.java     |     9 +-
 .../apache/solr/common/params/ShardParams.java  |    28 +-
 .../apache/solr/common/params/SolrParams.java   |    22 +-
 .../apache/solr/common/params/UpdateParams.java |     2 +-
 .../solr/common/util/ContentStreamBase.java     |     6 +-
 .../apache/solr/common/util/ExecutorUtil.java   |    29 +-
 .../org/apache/solr/common/util/FastWriter.java |   157 +
 .../solr/common/util/JsonRecordReader.java      |    32 +-
 .../solr/common/util/JsonSchemaValidator.java   |     5 +-
 .../apache/solr/common/util/JsonTextWriter.java |   499 +
 .../org/apache/solr/common/util/NamedList.java  |    30 +
 .../apache/solr/common/util/SolrJSONWriter.java |   114 +
 .../org/apache/solr/common/util/TextWriter.java |   231 +
 .../org/apache/solr/common/util/TimeSource.java |    27 +
 .../java/org/apache/solr/common/util/Utils.java |    54 +
 .../apache/solr/common/util/WriteableValue.java |    25 +
 .../java/org/apache/solr/common/util/XML.java   |    98 +-
 .../src/resources/apispec/cluster.Commands.json |    43 +
 .../apispec/cluster.configs.Commands.json       |    12 +-
 .../apispec/cluster.configs.delete.json         |     2 +-
 .../src/resources/apispec/cluster.configs.json  |     2 +-
 .../resources/apispec/collections.Commands.json |     3 +-
 .../collections.collection.Commands.modify.json |     4 +-
 .../src/resources/apispec/metrics.history.json  |    23 +
 solr/solrj/src/test-files/log4j2.xml            |    39 -
 .../solrj/solr/collection1/conf/schema-sql.xml  |     4 -
 .../solrj/solr/collection1/conf/schema.xml      |     4 -
 .../solr/configsets/shared/conf/schema.xml      |     4 -
 .../solr/configsets/streaming/conf/schema.xml   |     4 -
 .../solrj/solr/crazy-path-to-schema.xml         |     1 -
 ...ollectionAdminRequestRequiredParamsTest.java |     6 +-
 .../solr/client/solrj/SolrExampleTests.java     |    23 +-
 .../solr/client/solrj/SolrExampleTestsBase.java |     2 +-
 .../solrj/cloud/autoscaling/TestPolicy.java     |  1613 +-
 .../solrj/cloud/autoscaling/TestPolicy2.java    |   291 +
 .../solrj/embedded/LargeVolumeJettyTest.java    |     2 +
 .../client/solrj/impl/CloudSolrClientTest.java  |     5 +-
 .../client/solrj/impl/HttpClientUtilTest.java   |   108 +
 .../apache/solr/client/solrj/io/TestLang.java   |     3 +-
 .../solrj/io/graph/GraphExpressionTest.java     |    45 +-
 .../solr/client/solrj/io/graph/GraphTest.java   |     1 +
 .../solrj/io/stream/MathExpressionTest.java     |   292 +-
 .../solrj/io/stream/StreamDecoratorTest.java    |    88 +
 .../solrj/io/stream/StreamExpressionTest.java   |     3 +-
 .../io/stream/eval/NormalizeEvaluatorTest.java  |     6 +-
 .../client/solrj/request/TestV2Request.java     |     8 +-
 .../solrj/response/AnlysisResponseBaseTest.java |    13 +
 .../response/DocumentAnalysisResponseTest.java  |     2 +-
 .../response/FieldAnalysisResponseTest.java     |     2 +-
 .../response/TestDelegationTokenResponse.java   |     2 +-
 .../apache/solr/common/SolrDocumentTest.java    |     8 +-
 .../cloud/TestCollectionStateWatchers.java      |    10 +-
 .../solr/common/params/ShardParamsTest.java     |    32 +-
 .../solr/common/params/SolrParamTest.java       |    44 +-
 .../solr/common/util/JsonValidatorTest.java     |     8 +
 .../apache/solr/common/util/TestFastWriter.java |   125 +
 .../solr/common/util/TestJsonRecordReader.java  |    10 +-
 .../solr/common/util/TestNamedListCodec.java    |     4 +-
 .../solr/common/util/TestSolrJsonWriter.java    |    60 +
 .../apache/solr/common/util/TestTimeSource.java |    27 +-
 .../solr/common/util/TestValidatingJsonMap.java |     2 +-
 .../solr/BaseDistributedSearchTestCase.java     |    17 +-
 .../java/org/apache/solr/SolrTestCaseJ4.java    |    27 +-
 .../cloud/AbstractFullDistribZkTestBase.java    |     2 +-
 .../org/apache/solr/cloud/ConfigRequest.java    |    55 +
 .../apache/solr/cloud/MiniSolrCloudCluster.java |     6 +-
 .../solr/core/MockConcurrentMergeScheduler.java |    35 +
 .../apache/solr/core/MockDirectoryFactory.java  |     6 +-
 .../org/apache/solr/util/BaseTestHarness.java   |    23 +-
 .../org/apache/solr/util/SSLTestConfig.java     |    89 +-
 ...estConfig.hostname-and-ip-missmatch.keystore |   Bin 0 -> 2246 bytes
 .../resources/SSLTestConfig.testing.keystore    |   Bin 2208 -> 2207 bytes
 .../src/resources/create-keystores.sh           |    37 +
 solr/test-framework/src/test-files/log4j2.xml   |    39 -
 solr/webapp/web/css/angular/cloud.css           |   275 +
 solr/webapp/web/css/angular/collections.css     |     4 -
 solr/webapp/web/css/angular/common.css          |     4 +-
 solr/webapp/web/css/angular/cores.css           |     8 -
 solr/webapp/web/css/angular/jquery-ui.min.css   |    28 +
 .../web/css/angular/jquery-ui.structure.min.css |    24 +
 solr/webapp/web/css/angular/menu.css            |     3 +-
 solr/webapp/web/index.html                      |     8 +-
 solr/webapp/web/js/angular/controllers/cloud.js |   586 +-
 .../web/js/angular/controllers/segments.js      |     2 +-
 solr/webapp/web/js/angular/services.js          |    13 +-
 solr/webapp/web/libs/jquery-ui.min.js           |    30 +
 solr/webapp/web/partials/cloud.html             |   192 +
 solr/webapp/web/partials/cores.html             |     2 -
 2027 files changed, 97040 insertions(+), 66897 deletions(-)
----------------------------------------------------------------------



[22/27] lucene-solr:solr7896-login-page: Merge branch 'master' into solr7896-login-page

Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/44fa134c
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/44fa134c
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/44fa134c

Branch: refs/heads/solr7896-login-page
Commit: 44fa134c58b72d04c789202ea62805f895997359
Parents: 7c96458 49285e8
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Oct 8 12:49:11 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Oct 8 12:49:11 2018 +0200

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  14 ++-
 .../org/apache/solr/cloud/ZkController.java     |   3 +-
 .../solr/handler/component/ExpandComponent.java |  17 ++-
 .../UninvertDocValuesMergePolicyFactory.java    |   5 +-
 .../org/apache/solr/schema/IndexSchema.java     |  53 ++++------
 .../solr/search/CollapsingQParserPlugin.java    |  18 ++--
 .../java/org/apache/solr/search/Insanity.java   |   5 +-
 .../apache/solr/search/SolrIndexSearcher.java   |  17 +--
 .../solr/uninverting/UninvertingReader.java     | 103 +++++++++++--------
 .../solr/update/DeleteByQueryWrapper.java       |   2 +-
 .../solr/uninverting/TestUninvertingReader.java |  18 ++--
 .../solrj/impl/ConcurrentUpdateSolrClient.java  |   6 +-
 .../org/apache/solr/common/StringUtils.java     |  10 ++
 ...rentUpdateSolrClientMultiCollectionTest.java |  94 +++++++++++++++++
 14 files changed, 237 insertions(+), 128 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/44fa134c/solr/CHANGES.txt
----------------------------------------------------------------------


[16/27] lucene-solr:solr7896-login-page: Testing new approach

Posted by ja...@apache.org.
Testing new approach


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/5bb585c3
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/5bb585c3
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/5bb585c3

Branch: refs/heads/solr7896-login-page
Commit: 5bb585c38b7ab31bd83f020ff45d58d81f16af0b
Parents: c31d8df
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Sep 24 23:33:33 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Sep 24 23:33:33 2018 +0200

----------------------------------------------------------------------
 solr/webapp/templates/loginDialog.html          |  30 ----
 solr/webapp/templates/logoutLink.html           |   1 -
 .../web/css/bootstrap-3.3/bootstrap.min.css     |   6 +
 solr/webapp/web/css/bootstrap.min.css           |   7 -
 solr/webapp/web/index.html                      |   5 +-
 solr/webapp/web/js/angular/app.js               | 115 +++++++++-------
 solr/webapp/web/js/angular/controllers/login.js |  36 +++++
 solr/webapp/web/js/angular/directives.js        |  68 ----------
 .../web/js/angular/http-auth-interceptor.js     | 122 -----------------
 solr/webapp/web/js/angular/login-controllers.js |  37 -----
 solr/webapp/web/js/angular/services.js          | 136 ++++++++++++++++++-
 solr/webapp/web/partials/login.html             |  44 ++++++
 12 files changed, 293 insertions(+), 314 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/templates/loginDialog.html
----------------------------------------------------------------------
diff --git a/solr/webapp/templates/loginDialog.html b/solr/webapp/templates/loginDialog.html
deleted file mode 100644
index a217daa..0000000
--- a/solr/webapp/templates/loginDialog.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<div class="modal fade" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="loginModalLabel" aria-hidden="true" data-backdrop="static">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <form ng-submit="submit()" name="loginCredentialsForm" role="form">
-                <div class="modal-header">
-                    <h4 class="modal-title" id="loginModalLabel">Enter credentials</h4>
-                </div>
-                <div class="modal-body">
-                    <div class="form-horizontal">
-                        <div class="form-group">
-                            <label class="col-lg-4 control-label" for="userName">User name</label>
-                            <div class="col-lg-4">
-                                <input type="text" class="form-control" ng-model="credentials.userName" id="userName" placeholder="User name">
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <label class="col-lg-4 control-label" for="password">Password</label>
-                            <div class="col-lg-4">
-                                <input type="password" class="form-control" ng-model="credentials.password" id="password" placeholder="Password">
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="modal-footer">
-                    <input type="submit" class="btn btn-primary" value="Log in"></input>
-                </div>
-            </form>
-        </div>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/templates/logoutLink.html
----------------------------------------------------------------------
diff --git a/solr/webapp/templates/logoutLink.html b/solr/webapp/templates/logoutLink.html
deleted file mode 100644
index 0796ed9..0000000
--- a/solr/webapp/templates/logoutLink.html
+++ /dev/null
@@ -1 +0,0 @@
-<p ng-show="isLoggedIn()" class="navbar-text navbar-right"><a href="" ng-click="logOut()">Log out</a></p>


[13/27] lucene-solr:solr7896-login-page: Testing new approach

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index a98a30da..f36dc13 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -23,6 +23,7 @@ limitations under the License.
   <link rel="icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
   <link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
 
+  <link rel="stylesheet" type="text/css" href="css/bootstrap-3.3/bootstrap.min.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/common.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/analysis.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/cloud.css?_=${version}">
@@ -67,6 +68,7 @@ limitations under the License.
   <script src="js/angular/http-auth-interceptor.js"></script>
   <script src="js/angular/login-controllers.js"></script>
   <script src="js/angular/controllers/index.js"></script>
+  <script src="js/angular/controllers/login.js"></script>
   <script src="js/angular/controllers/logging.js"></script>
   <script src="js/angular/controllers/cloud.js"></script>
   <script src="js/angular/controllers/collections.js"></script>
@@ -142,7 +144,8 @@ limitations under the License.
         <div>
 
           <ul id="menu">
-
+            <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Logout</a></p></li>
+            
             <li id="index" class="global" ng-class="{active:page=='index'}"><p><a href="#/">Dashboard</a></p></li>
 
             <li id="logging" class="global" ng-class="{active:page=='logging'}"><p><a href="#/~logging">Logging</a></p>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index fe686fe..a0bc4ab 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -31,6 +31,10 @@ solrAdminApp.config([
         templateUrl: 'partials/index.html',
         controller: 'IndexController'
       }).
+      when('/login', {
+        templateUrl: 'partials/login.html',
+        controller: 'LoginController'
+      }).
       when('/~logging', {
         templateUrl: 'partials/logging.html',
         controller: 'LoggingController'
@@ -369,56 +373,73 @@ solrAdminApp.config([
 
   return {request: started, response: ended, responseError: failed};
 })
-.factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
-  var started = function(config) {
-    var ah = "Basic c29scjpTb2xyUm9ja3M=";  // solr / SolrRocks
-    config.headers['Authorization'] = ah;
-    console.log("Added authorization header " + ah);
-    return config || $q.when(config);
-  };
-
-  var ended = function(response) {
-    console.log("Response headers: " + JSON.stringify(response.headers, undefined, 2));
-    if (response.headers['WWW-Authenticate'] != null) {
-      console.log("Got WWW-Authenticate header: " + response.headers['WWW-Authenticate']);
-    }
-    return response || $q.when(response);
-  };
-
-  var failed = function(rejection) {
-    console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
-    if (rejection.status === 401) {
-      console.log("Status code is 401");
-    } else {
-      console.log("Rejection status is " + rejection.status)
-    }
-    $rootScope.$broadcast('loadingStatusInactive');
-    return $q.reject(rejection);
-  };
-
-  return {request: started, response: ended, responseError: failed};
-})
+// NOCOMMIT First iteration    
+// .factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
+//   var started = function(config) {
+//     var ah = "Basic c29scjpyb2Nrcw==";  // solr / SolrRocks
+//     config.headers['Authorization'] = ah;
+//     console.log("Added authorization header " + ah);
+//     return config || $q.when(config);
+//   };
+//
+//   var ended = function(response) {
+//     console.log("Response headers: " + JSON.stringify(response.headers, undefined, 2));
+//     if (response.headers['WWW-Authenticate'] != null) {
+//       console.log("Got WWW-Authenticate header: " + response.headers['WWW-Authenticate']);
+//     }
+//     return response || $q.when(response);
+//   };
+//
+//   var failed = function(rejection) {
+//     console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
+//     if (rejection.status === 401) {
+//       console.log("Status code is 401");
+//     } else {
+//       console.log("Rejection status is " + rejection.status)
+//     }
+//     $rootScope.$broadcast('loadingStatusInactive');
+//     return $q.reject(rejection);
+//   };
+//
+//   return {request: started, response: ended, responseError: failed};
+// })
 .config(function($httpProvider) {
   $httpProvider.interceptors.push("httpInterceptor");
-  $httpProvider.interceptors.push("authInterceptor");
+  // NOCOMMIT $httpProvider.interceptors.push("authInterceptor");
   // Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
   // so that the browser will not interfer with the login dialogue
   $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
 })
+// NOCOMMIT: just for testing     
+.run(['$rootScope', '$location', '$cookieStore', '$http',
+  function ($rootScope, $location, $cookieStore, $http) {
+    // keep user logged in after page refresh
+    $rootScope.globals = $cookieStore.get('globals') || {};
+    if ($rootScope.globals.currentUser) {
+      $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
+    }
+
+    $rootScope.$on('$locationChangeStart', function (event, next, current) {
+      // redirect to login page if not logged in
+      if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
+        $location.path('/login');
+      }
+    });
+  }])
 .directive('fileModel', function ($parse) {
-    return {
-        restrict: 'A',
-        link: function(scope, element, attrs) {
-            var model = $parse(attrs.fileModel);
-            var modelSetter = model.assign;
+  return {
+    restrict: 'A',
+    link: function(scope, element, attrs) {
+      var model = $parse(attrs.fileModel);
+      var modelSetter = model.assign;
 
-            element.bind('change', function(){
-                scope.$apply(function(){
-                    modelSetter(scope, element[0].files[0]);
-                });
-            });
-        }
-    };
+      element.bind('change', function(){
+        scope.$apply(function(){
+          modelSetter(scope, element[0].files[0]);
+        });
+      });
+    }
+  };
 });
 
 solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $location, Cores, Collections, System, Ping, Constants) {
@@ -432,7 +453,7 @@ solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $
   $scope.refresh = function() {
       $scope.cores = [];
       $scope.collections = [];
-  }
+  };
 
   $scope.refresh();
   $scope.resetMenu = function(page, pageType) {
@@ -462,7 +483,7 @@ solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $
           for (key in data.collections) {
             var collection = {name: data.collections[key]};
             $scope.collections.push(collection);
-            if (pageType == Constants.IS_COLLECTION_PAGE && collection.name == currentCollectionName) {
+            if (pageType === Constants.IS_COLLECTION_PAGE && collection.name === currentCollectionName) {
               $scope.currentCollection = collection;
             }
           }
@@ -486,15 +507,15 @@ solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $
 
   $scope.dumpCloud = function() {
       $scope.$broadcast("cloud-dump");
-  }
+  };
 
   $scope.showCore = function(core) {
     $location.url("/" + core.name);
-  }
+  };
 
   $scope.showCollection = function(collection) {
     $location.url("/" + collection.name + "/collection-overview")
-  }
+  };
 
   $scope.$on('$routeChangeStart', function() {
       $rootScope.exceptions = {};

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
new file mode 100644
index 0000000..b0b7096
--- /dev/null
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -0,0 +1,36 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+*/
+
+solrAdminApp.controller('LoginController',
+    ['$scope', '$rootScope', '$location', 'AuthenticationService',
+      function ($scope, $rootScope, $location, AuthenticationService) {
+        // reset login status
+        AuthenticationService.ClearCredentials();
+
+        $scope.login = function () {
+          $scope.dataLoading = true;
+          AuthenticationService.Login($scope.username, $scope.password, function (response) {
+            if (response.success) {
+              AuthenticationService.SetCredentials($scope.username, $scope.password);
+              $location.path('/');
+            } else {
+              $scope.error = response.message;
+              $scope.dataLoading = false;
+            }
+          });
+        };
+      }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/directives.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/directives.js b/solr/webapp/web/js/angular/directives.js
deleted file mode 100644
index ba6e701..0000000
--- a/solr/webapp/web/js/angular/directives.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-'use strict';
-
-angular.module('loginDirectives', []).
-directive('loginDialog', function($timeout) {
-   return {
-       templateUrl: '/templates/loginDialog.html',
-       restrict: 'E',
-       replace: true,
-       controller: CredentialsController,
-       link: function(scope, element, attributes, controller) {
-           var isShowing = false;
-           
-           element.on('shown.bs.modal', function(e) {
-               element.find('#userName').focus();
-           });
-
-           scope.$on('event:auth-loginRequired', function() {
-               if (isShowing) {
-                   return;
-               }
-               
-               // If we're in the process of hiding the modal, we need to wait for
-               // all CSS animations to complete before showing the modal again.
-               // Otherwise, we might end up with an invisible modal, making the whole
-               // view rather unusable. I've been unable to control the transitions
-               // between "showing", "shown", "hiding", and "hidden" tightly using
-               // JQuery notifications without collecting more and more modal backdrops
-               // in the DOM, so the dirty solution here is to simply wait a second
-               // before showing the log-in dialog.
-               isShowing = true;
-               $timeout(function() {
-                   element.modal('show');
-                   isShowing = false;
-               }, 1000);
-           });
-
-           scope.$on('event:auth-loginConfirmed', function() {
-               element.modal('hide');
-               scope.credentials.password = '';
-           });
-       }
-   } 
-}).
-directive('logoutLink', function() {
-   return {
-       templateUrl: '/templates/logoutLink.html',
-       restrict: 'E',
-       replace: true,
-       controller: LoginController
-   } 
-});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/http-auth-interceptor.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/http-auth-interceptor.js b/solr/webapp/web/js/angular/http-auth-interceptor.js
deleted file mode 100644
index 2f34861..0000000
--- a/solr/webapp/web/js/angular/http-auth-interceptor.js
+++ /dev/null
@@ -1,122 +0,0 @@
-/*global angular:true, browser:true */
-
-/**
- * @license HTTP Auth Interceptor Module for AngularJS
- * (c) 2012 Witold Szczerba
- * License: MIT
- */
-(function () {
-  'use strict';
-
-  angular.module('http-auth-interceptor', ['http-auth-interceptor-buffer'])
-
-  .factory('authService', ['$rootScope','httpBuffer', function($rootScope, httpBuffer) {
-    return {
-      /**
-       * Call this function to indicate that authentication was successfull and trigger a
-       * retry of all deferred requests.
-       * @param data an optional argument to pass on to $broadcast which may be useful for
-       * example if you need to pass through details of the user that was logged in
-       */
-      loginConfirmed: function(data, configUpdater) {
-        var updater = configUpdater || function(config) {return config;};
-        $rootScope.$broadcast('event:auth-loginConfirmed', data);
-        httpBuffer.retryAll(updater);
-      },
-
-      /**
-       * Call this function to indicate that authentication should not proceed.
-       * All deferred requests will be abandoned or rejected (if reason is provided).
-       * @param data an optional argument to pass on to $broadcast.
-       * @param reason if provided, the requests are rejected; abandoned otherwise.
-       */
-      loginCancelled: function(data, reason) {
-        httpBuffer.rejectAll(reason);
-        $rootScope.$broadcast('event:auth-loginCancelled', data);
-      }
-    };
-  }])
-
-  /**
-   * $http interceptor.
-   * On 401 response (without 'ignoreAuthModule' option) stores the request
-   * and broadcasts 'event:angular-auth-loginRequired'.
-   */
-  .config(['$httpProvider', function($httpProvider) {
-    $httpProvider.interceptors.push(['$rootScope', '$q', 'httpBuffer', function($rootScope, $q, httpBuffer) {
-      return {
-        responseError: function(rejection) {
-          if (rejection.status === 401 && !rejection.config.ignoreAuthModule) {
-            var deferred = $q.defer();
-            httpBuffer.append(rejection.config, deferred);
-            $rootScope.$broadcast('event:auth-loginRequired', rejection);
-            return deferred.promise;
-          }
-          // otherwise, default behaviour
-          return $q.reject(rejection);
-        }
-      };
-    }]);
-  }]);
-
-  /**
-   * Private module, a utility, required internally by 'http-auth-interceptor'.
-   */
-  angular.module('http-auth-interceptor-buffer', [])
-
-  .factory('httpBuffer', ['$injector', function($injector) {
-    /** Holds all the requests, so they can be re-requested in future. */
-    var buffer = [];
-
-    /** Service initialized later because of circular dependency problem. */
-    var $http;
-
-    function retryHttpRequest(config, deferred) {
-      // Make room for new 'Authenticate' header value
-      delete config.headers['Authorization'];
-
-      function successCallback(response) {
-        deferred.resolve(response);
-      }
-      function errorCallback(response) {
-        deferred.reject(response);
-      }
-      $http = $http || $injector.get('$http');
-      $http(config).then(successCallback, errorCallback);
-    }
-
-    return {
-      /**
-       * Appends HTTP request configuration object with deferred response attached to buffer.
-       */
-      append: function(config, deferred) {
-        buffer.push({
-          config: config,
-          deferred: deferred
-        });
-      },
-
-      /**
-       * Abandon or reject (if reason provided) all the buffered requests.
-       */
-      rejectAll: function(reason) {
-        if (reason) {
-          for (var i = 0; i < buffer.length; ++i) {
-            buffer[i].deferred.reject(reason);
-          }
-        }
-        buffer = [];
-      },
-
-      /**
-       * Retries all the buffered requests clears the buffer.
-       */
-      retryAll: function(updater) {
-        for (var i = 0; i < buffer.length; ++i) {
-          retryHttpRequest(updater(buffer[i].config), buffer[i].deferred);
-        }
-        buffer = [];
-      }
-    };
-  }]);
-})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/login-controllers.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/login-controllers.js b/solr/webapp/web/js/angular/login-controllers.js
deleted file mode 100644
index 819ccb3..0000000
--- a/solr/webapp/web/js/angular/login-controllers.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-'use strict';
-
-function CredentialsController($scope, loginService) {
-    $scope.credentials = { userName: '', password: '' };
-    
-    $scope.submit = function() {
-        loginService.setUserNameAndPassword($scope.credentials.userName, $scope.credentials.password);
-    }
-}
-
-function LoginController($scope, $location, loginService) {
-    $scope.isLoggedIn = function() {
-        return loginService.isLoggedIn();
-    }
-    
-    $scope.logOut = function() {
-        loginService.logOut();
-        $location.path('/about');
-    }
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index e3dcd3f..ffd7135 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -262,4 +262,138 @@ solrAdminServices.factory('System',
      return $resource(':core/config', {wt: 'json', core: '@core', _:Date.now()}, {
        get: {method: "GET"}
      })
-}]);
+}])
+.factory('AuthenticationService',
+    ['Base64', '$http', '$cookieStore', '$rootScope', '$timeout',
+      function (Base64, $http, $cookieStore, $rootScope, $timeout) {
+        var service = {};
+
+        service.Login = function (username, password, callback) {
+
+          /* NOCOMMIT Dummy authentication for testing, uses $timeout to simulate api call
+           ----------------------------------------------*/
+          $timeout(function () {
+            var response = { success: username === 'test' && password === 'test' };
+            if (!response.success) {
+              response.message = 'Username or password is incorrect';
+            }
+            callback(response);
+          }, 1000);
+
+
+          /* Use this for real authentication
+           ----------------------------------------------*/
+          //$http.post('/api/authenticate', { username: username, password: password })
+          //    .success(function (response) {
+          //        callback(response);
+          //    });
+
+        };
+
+        service.SetCredentials = function (username, password) {
+          var authdata = Base64.encode(username + ':' + password);
+
+          $rootScope.globals = {
+            currentUser: {
+              username: username,
+              authdata: authdata
+            }
+          };
+
+          $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
+          $cookieStore.put('globals', $rootScope.globals);
+        };
+
+        service.ClearCredentials = function () {
+          $rootScope.globals = {};
+          $cookieStore.remove('globals');
+          $http.defaults.headers.common.Authorization = 'Basic ';
+        };
+
+        return service;
+      }])
+.factory('Base64', function () {
+  /* jshint ignore:start */
+
+  var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+  return {
+    encode: function (input) {
+      var output = "";
+      var chr1, chr2, chr3 = "";
+      var enc1, enc2, enc3, enc4 = "";
+      var i = 0;
+
+      do {
+        chr1 = input.charCodeAt(i++);
+        chr2 = input.charCodeAt(i++);
+        chr3 = input.charCodeAt(i++);
+
+        enc1 = chr1 >> 2;
+        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+        enc4 = chr3 & 63;
+
+        if (isNaN(chr2)) {
+          enc3 = enc4 = 64;
+        } else if (isNaN(chr3)) {
+          enc4 = 64;
+        }
+
+        output = output +
+            keyStr.charAt(enc1) +
+            keyStr.charAt(enc2) +
+            keyStr.charAt(enc3) +
+            keyStr.charAt(enc4);
+        chr1 = chr2 = chr3 = "";
+        enc1 = enc2 = enc3 = enc4 = "";
+      } while (i < input.length);
+
+      return output;
+    },
+
+    decode: function (input) {
+      var output = "";
+      var chr1, chr2, chr3 = "";
+      var enc1, enc2, enc3, enc4 = "";
+      var i = 0;
+
+      // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+      var base64test = /[^A-Za-z0-9\+\/\=]/g;
+      if (base64test.exec(input)) {
+        window.alert("There were invalid base64 characters in the input text.\n" +
+            "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
+            "Expect errors in decoding.");
+      }
+      input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+      do {
+        enc1 = keyStr.indexOf(input.charAt(i++));
+        enc2 = keyStr.indexOf(input.charAt(i++));
+        enc3 = keyStr.indexOf(input.charAt(i++));
+        enc4 = keyStr.indexOf(input.charAt(i++));
+
+        chr1 = (enc1 << 2) | (enc2 >> 4);
+        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+        chr3 = ((enc3 & 3) << 6) | enc4;
+
+        output = output + String.fromCharCode(chr1);
+
+        if (enc3 != 64) {
+          output = output + String.fromCharCode(chr2);
+        }
+        if (enc4 != 64) {
+          output = output + String.fromCharCode(chr3);
+        }
+
+        chr1 = chr2 = chr3 = "";
+        enc1 = enc2 = enc3 = enc4 = "";
+
+      } while (i < input.length);
+
+      return output;
+    }
+  };
+
+  /* jshint ignore:end */
+});

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
new file mode 100644
index 0000000..cae1cc8
--- /dev/null
+++ b/solr/webapp/web/partials/login.html
@@ -0,0 +1,44 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<div id="login" class="jumbotron">
+
+  <div class="col-xs-offset-2 col-xs-8">
+    <div class="alert alert-info">
+      Username: test<br />
+      Password: test
+    </div>
+    <div ng-show="error" class="alert alert-danger">{{error}}</div>
+    <form name="form" ng-submit="login()" role="form">
+        <div class="form-group">
+            <label for="username">Username</label>
+            <i class="fa fa-key"></i>
+            <input type="text" name="username" id="username" class="form-control" ng-model="username" required />
+            <span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Username is required</span>
+        </div>
+        <div class="form-group">
+            <label for="password">Password</label>
+            <i class="fa fa-lock"></i>
+            <input type="password" name="password" id="password" class="form-control" ng-model="password" required />
+            <span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Password is required</span>
+        </div>
+        <div class="form-actions">
+            <button type="submit" ng-disabled="form.$invalid || dataLoading" class="btn btn-danger">Login</button>
+            <img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
+        </div>
+    </form>
+  </div>
+</div>


[06/27] lucene-solr:solr7896-login-page: WIP add login page with bootstrap

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/css/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/bootstrap.min.css b/solr/webapp/web/css/bootstrap.min.css
new file mode 100644
index 0000000..c547283
--- /dev/null
+++ b/solr/webapp/web/css/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{paddi
 ng:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!impo
 rtant}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;
 color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;co
 lor: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:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-
 danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizon
 tal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:aft
 er{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970p
 x}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-x
 s-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-
 5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.c
 ol-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-s
 m-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{wid
 th:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333
 %}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-
 7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col
 -lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;bord
 er-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,
 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table
 >tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.
 table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-respon
 sive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="n
 umber"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-inp
 ut-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio
 [disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#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:#665
 12c;-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;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{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;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{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;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom: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}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .che
 ckbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-use
 r-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;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: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:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.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,.b
 tn-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:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active
 ,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9
 534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{colo
 r:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webk
 it-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:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0
 ;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{
 content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-do
 wnload: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-tex
 t-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"}.gl
 yphicon-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{conten
 t:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px 
 rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding
 :3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-grou
 p .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdo
 wn-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-grou
 p-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-rad
 ius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-gro
 up-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height: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{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-c
 hild),.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>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control
 :last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hov
 er,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-j
 ustified>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:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-
 width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border
 -radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar
 -static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margi
 n-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right
 :last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;pa
 dding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top: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-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;backg
 round-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-colo
 r:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;backgrou
 nd-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.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{color:#fff;background-color:#
 080808}@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:#999}.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:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 
 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagi
 nation>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding: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-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3p
 x;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.
 label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{dis
 play:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:
 block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.aler
 t-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,2
 55,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.1
 5) 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:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.
 15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item
  .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;cont
 ent:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.ta
 ble-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-c
 hild,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.d
 ropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#
 fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.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-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.c
 lose{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;le
 ft:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.too
 ltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#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-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5p
 x 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-co
 lor:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin
 -left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.car
 ousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity

<TRUNCATED>

[03/27] lucene-solr:solr7896-login-page: Revert changes in solr.in.sh

Posted by ja...@apache.org.
Revert changes in solr.in.sh


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2ac10e44
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2ac10e44
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2ac10e44

Branch: refs/heads/solr7896-login-page
Commit: 2ac10e44661b521cdb308d867e04bb2cf8523898
Parents: f70371b
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Apr 20 13:03:38 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Apr 20 13:03:38 2018 +0200

----------------------------------------------------------------------
 solr/CHANGES.txt    | 2 ++
 solr/bin/solr.in.sh | 8 --------
 2 files changed, 2 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2ac10e44/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 298abad..4feb537 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -99,6 +99,8 @@ New Features
 * SOLR-11913: SolrJ SolrParams now implements Iterable<Map.Entry<String, String[]>> and also has a stream() method
   using it for convenience. (David Smiley, Tapan Vaishnav)
 
+* SOLR-7896: Add a login page to Admin UI (janhoy)
+
 * SOLR-11924: Added the ability to listen to changes in the set of active collections in a cloud
   in the ZkStateReader, through the CloudCollectionsListener. (Houston Putman, Dennis Gove)
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2ac10e44/solr/bin/solr.in.sh
----------------------------------------------------------------------
diff --git a/solr/bin/solr.in.sh b/solr/bin/solr.in.sh
index 04ac46c..7cf6a84 100644
--- a/solr/bin/solr.in.sh
+++ b/solr/bin/solr.in.sh
@@ -171,11 +171,3 @@
 #SOLR_RECOMMENDED_MAX_PROCESSES=
 #SOLR_ULIMIT_CHECKS=
 
-
-# The following lines added by ./solr for enabling BasicAuth
-# SOLR_AUTH_TYPE="basic"
-# SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/Users/janhoy/git/lucene-solr/solr/server/solr/basicAuth.conf"
-
-# The following lines added by ./solr for enabling BasicAuth
-SOLR_AUTH_TYPE="basic"
-SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/Users/janhoy/git/lucene-solr/solr/server/solr/basicAuth.conf"


[08/27] lucene-solr:solr7896-login-page: Merge branch 'master' into solr7896-login-page

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4457de36/solr/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4457de36/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
index 5f8097c,78e58d0..d5689a8
--- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
@@@ -375,19 -371,7 +359,19 @@@ public class SolrDispatchFilter extend
          }
        }
  
 +      AtomicReference<HttpServletRequest> wrappedRequest = new AtomicReference<>();
 +      if (!authenticateRequest(request, response, wrappedRequest)) { // the response and status code have already been sent
 +        return;
 +      }
 +      if (wrappedRequest.get() != null) {
 +        request = wrappedRequest.get();
 +      }
 +
 +      if (cores.getAuthenticationPlugin() != null) {
 +        log.debug("User principal: {}", request.getUserPrincipal());
 +      }
 +
-       HttpSolrCall call = getHttpSolrCall(closeShield(request, retry), closeShield(response, retry), retry);
+       HttpSolrCall call = getHttpSolrCall(request, response, retry);
        ExecutorUtil.setServerThreadFlag(Boolean.TRUE);
        try {
          Action result = call.call();
@@@ -453,22 -437,11 +437,22 @@@
      if (authenticationPlugin == null) {
        return true;
      } else {
 -      // /admin/info/key must be always open. see SOLR-9188
 +      // /admin/info/key and /solr/ (Admin UI) must be always open. see SOLR-9188
        // tests work only w/ getPathInfo
        //otherwise it's just enough to have getServletPath()
 -      if (PublicKeyHandler.PATH.equals(request.getServletPath()) ||
 -          PublicKeyHandler.PATH.equals(request.getPathInfo())) return true;
 +      String requestPath = request.getPathInfo();
 +      if (requestPath == null) 
 +        requestPath = request.getServletPath();
-       if (PKIAuthenticationPlugin.PATH.equals(requestPath)) {
++      if (PublicKeyHandler.PATH.equals(requestPath)) {
 +        if (log.isDebugEnabled())
 +          log.debug("Pass through PKI authentication endpoint");
 +        return true;
 +      }
 +      if ("/solr/".equals(requestPath) || "/".equals(requestPath)) {
 +        if (log.isDebugEnabled())
 +          log.debug("Pass through Admin UI entry point");
 +        return true;
 +      }
        String header = request.getHeader(PKIAuthenticationPlugin.HEADER);
        if (header != null && cores.getPkiAuthenticationPlugin() != null)
          authenticationPlugin = cores.getPkiAuthenticationPlugin();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4457de36/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --cc solr/webapp/web/index.html
index 779f672,0663805..a98a30da
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@@ -58,11 -60,9 +60,12 @@@ limitations under the License
    <script src="libs/ngtimeago.js"></script>
    <script src="libs/highlight.js"></script>
    <script src="libs/d3.js"></script>
+   <script src="libs/jquery-ui.min.js"></script>
    <script src="js/angular/app.js"></script>
    <script src="js/angular/services.js"></script>
 +  <script src="js/angular/directives.js"></script>
 +  <script src="js/angular/http-auth-interceptor.js"></script>
 +  <script src="js/angular/login-controllers.js"></script>
    <script src="js/angular/controllers/index.js"></script>
    <script src="js/angular/controllers/logging.js"></script>
    <script src="js/angular/controllers/cloud.js"></script>


[23/27] lucene-solr:solr7896-login-page: Working for basic auth

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/libs/bootstrap.min.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/libs/bootstrap.min.js b/solr/webapp/web/libs/bootstrap.min.js
deleted file mode 100644
index 1a6258e..0000000
--- a/solr/webapp/web/libs/bootstrap.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert"
 )),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b
 =!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.
 options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this
 .interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeC
 lass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data(
 )),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.remov
 eClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTra
 nsitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function
 (b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled
 ")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this
 .options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&
 !b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.rem
 ove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal
 ",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigg
 er:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefau
 lts();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade")
 ;var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a
 ,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transitio
 n&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeo
 f c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tool
 tip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getConte
 nt=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.of
 fsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarge
 t=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.
 find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [d
 ata-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unp
 in&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
index 37768cf..89dd427 100644
--- a/solr/webapp/web/partials/login.html
+++ b/solr/webapp/web/partials/login.html
@@ -14,16 +14,18 @@ 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.
 -->
-<div id="login">
+<div id="login" class="clearfix">
 
-  <div class="col-xs-offset-2 col-xs-8" ng-show="authType === 'Basic'">
+  <div ng-show="authScheme === 'Basic'">
     <h1>Basic Authentication</h1>     
     
-    <p>Type: {{authType}}</p>
+    <p>Scheme: {{authScheme}}</p>
+    <p>Realm: {{authRealm}}</p>
     <p>WWW-Header: {{wwwAuthHeader}}</p>
     <p>Config: {{authConfig}}</p>
     <p>Redirect: {{authLocation}}</p>
     <p>LoggedinUser: {{authLoggedinUser}}</p>
+    <p>AuthHeader: {{authHeader}}</p>
 
     <div ng-show="error" class="alert alert-danger">{{error}}</div>
     <form name="form" ng-submit="login()" role="form" ng-show="!isLoggedIn()">
@@ -53,10 +55,10 @@ limitations under the License.
   </div>
   
   
-  <div class="col-xs-offset-2 col-xs-8" ng-show="authType === 'unknown'">
+  <div ng-show="authScheme === 'unknown'">
     <h1>Authentication type not supported</h1>     
     
-    <p>Type: {{authType}}</p>
+    <p>Type: {{authScheme}}</p>
     <p>WWW-Header: {{wwwAuthHeader}}</p>
     <p>Config: {{authConfig}}</p>
     <p>Redirect: {{authLocation}}</p>


[24/27] lucene-solr:solr7896-login-page: Working for basic auth

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index 0f1478f..3729aaf 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -23,7 +23,6 @@ limitations under the License.
   <link rel="icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
   <link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
 
-  <!--<link rel="stylesheet" type="text/css" href="css/bootstrap-3.3/bootstrap.min.css?_=${version}">-->
   <link rel="stylesheet" type="text/css" href="css/angular/common.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/analysis.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/cloud.css?_=${version}">

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 3c29fc4..e7fb0b2 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -373,51 +373,41 @@ solrAdminApp.config([
 
   return {request: started, response: ended, responseError: failed};
 })
-// NOCOMMIT First iteration    
+// Intercept authentication request from Solr and forward to /solr/#/login    
 .factory('authInterceptor', function($q, $rootScope, $location, $timeout, $injector) {
   var started = function(config) {
-    console.log("Request config headers: " + JSON.stringify(config.headers, undefined, 2));
-    if (sessionStorage.getItem("auth.header") && !config.headers['Authorization']) {
+    if (sessionStorage.getItem("auth.header")) {
       config.headers['Authorization'] = sessionStorage.getItem("auth.header");
-      console.log("We have a logged in user with header " + sessionStorage.getItem("auth.username") + ", appending header " + sessionStorage.getItem("auth.header"));
-    } else {
-      console.log("Not adding headers. Have auth.username=" + sessionStorage.getItem("auth.username") + ", auth.header=" + sessionStorage.getItem("auth.header") + ", config.headers=" + config.headers['Authorization']);
+      console.log("Added Authorization header for user " + sessionStorage.getItem("auth.username"));
     }
     return config || $q.when(config);
   };
 
   var ended = function(response) {
-    // console.log("Response headers: " + JSON.stringify(response.headers(), undefined, 2));
     return response || $q.when(response);
   };
 
   var failed = function(rejection) {
-    console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
     if (rejection.status === 401) {
-      console.log("Status code is 401");
       var headers = rejection.headers();
-      console.log("Headers are " + JSON.stringify(headers, undefined, 2));
       var wwwAuthHeader = headers['www-authenticate'];
       sessionStorage.setItem("auth.wwwAuthHeader", wwwAuthHeader);
       var authDataHeader = headers['X-Solr-AuthData'];
       if (authDataHeader !== null) {
         sessionStorage.setItem("auth.config", authDataHeader);
       }
-      console.log("Got WWW-Authenticate header: " + wwwAuthHeader + " and X-Solr-AuthData: " + authDataHeader);
-      var authType = wwwAuthHeader.split(" ")[0];
-      console.log("AuthType is: " + authType);
-      sessionStorage.setItem("auth.type", authType);
       if ($location.path() === '/login') {
         sessionStorage.setItem("auth.location", "/");
       } else {
         sessionStorage.setItem("auth.location", $location.path());
       }
+      sessionStorage.removeItem("auth.scheme");
+      sessionStorage.removeItem("auth.realm");
       sessionStorage.removeItem("auth.username");
       sessionStorage.removeItem("auth.header");
-      // $http.defaults.headers.common.Authorization = null;
+      console.log("Solr is asking for authentication: " + wwwAuthHeader);
       $location.path('/login');
     } else {
-      console.log("Rejection status is " + rejection.status)
       $rootScope.$broadcast('loadingStatusInactive');
       return $q.reject(rejection);    }
   };

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index 174a491..0c983d0 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -18,35 +18,127 @@
 solrAdminApp.controller('LoginController',
     ['$scope', '$routeParams', '$rootScope', '$location', 'AuthenticationService',
       function ($scope, $routeParams, $rootScope, $location, AuthenticationService) {
-        var authType = sessionStorage.getItem("auth.type");
-        var basicTypes = ['Basic', 'xBasic'];
-        if (authType !== null && basicTypes.includes(authType)) {
-          if (authType === 'xBasic') authType = 'Basic';
-          $scope.authType = authType;
-        } else {
-          $scope.authType = 'unknown';
-        }      
+        // Session variables set in app.js 401 interceptor
+        var wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
+        var authDataHeader = sessionStorage.getItem("auth.config");
+        console.log("Have scheme=" + sessionStorage.getItem("auth.scheme"));
+        console.log("Have realm=" + sessionStorage.getItem("auth.realm"));
+        console.log("Have header=" + sessionStorage.getItem("auth.header"));
         
+        // Parse www-authenticate header
+        var m= wwwAuthHeader.match(/(\w+)\s+(.*)/);
+        var authScheme= m[1];
+        var authParams= www_auth_parse_params(m[2]);
+        if (typeof authParams === 'string' || authParams instanceof String) {
+          alert("Handle error " + authParams);
+        }
+        var realm = authParams['realm'];
+        sessionStorage.setItem("auth.realm", realm);
+        $scope.authRealm = realm;
+        // console.log("Got WWW-Authenticate header: " + wwwAuthHeader + " and X-Solr-AuthData: " + authDataHeader);
+        if (authScheme === 'Basic' || authScheme === 'xBasic') {
+          authScheme = 'Basic';
+        } else {
+          authScheme = 'unknown';
+        }
+        sessionStorage.setItem("auth.scheme", authScheme);
+
+        $scope.authScheme = sessionStorage.getItem("auth.scheme");
         $scope.wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
         $scope.authConfig = sessionStorage.getItem("auth.config");
         $scope.authLocation = sessionStorage.getItem("auth.location");
         $scope.authLoggedinUser = sessionStorage.getItem("auth.username");
         $scope.authHeader = sessionStorage.getItem("auth.header");
-        
+
         $scope.login = function () {
           AuthenticationService.SetCredentials($scope.username, $scope.password);
           console.log("Redirecting back to " + $scope.authLocation);
           $location.path($scope.authLocation); // Redirect to the location that caused the login prompt
         };
-        
+
         $scope.logout = function() {
           // reset login status
           AuthenticationService.ClearCredentials();
           console.log("Logged out user and cleared creds");
           $location.path("/");
         };
-        
+
         $scope.isLoggedIn = function() {
           return (sessionStorage.getItem("auth.username") !== null);
         };
-      }]);
\ No newline at end of file
+      }]);
+
+// This function is copied and adapted from MIT-licensed https://github.com/randymized/www-authenticate/blob/master/lib/parsers.js
+www_auth_parse_params= function (header) {
+  // This parser will definitely fail if there is more than one challenge
+  var params = {};
+  var tok, last_tok, _i, _len, key, value;
+  var state= 0;   //0: token,
+  var m= header.split(/([",=])/);
+  for (_i = 0, _len = m.length; _i < _len; _i++) {
+    last_tok= tok;
+    tok = m[_i];
+    if (!tok.length) continue;
+    switch (state) {
+      case 0: // token
+        key= tok.trim();
+        state= 1; // expect equals
+        continue;
+      case 1: // expect equals
+        if ('=' != tok) return 'Equal sign was expected after '+key;
+        state= 2;
+        continue;
+      case 2: // expect value
+        if ('"' == tok) {
+          value= '';
+          state= 3; // expect quoted
+          continue;
+        }
+        else {
+          params[key]= value= tok.trim();
+          state= 9; // expect comma or end
+          continue;
+        }
+      case 3: // handling quoted string
+        if ('"' == tok) {
+          state= 8; // end quoted
+          continue;
+        }
+        else {
+          value+= tok;
+          state= 3; // continue accumulating quoted string
+          continue;
+        }
+      case 8: // end quote encountered
+        if ('"' == tok) {
+          // double quoted
+          value+= '"';
+          state= 3; // back to quoted string
+          continue;
+        }
+        if (',' == tok) {
+          params[key]= value;
+          state= 0;
+          continue;
+        }
+        else {
+          return 'Unexpected token ('+tok+') after '+value+'"';
+        }
+        continue;
+      case 9: // expect commma
+        if (',' != tok) return 'Comma expected after '+value;
+        state= 0;
+        continue;
+    }
+  }
+  switch (state) {  // terminal state
+    case 0:   // Empty or ignoring terminal comma
+    case 9:   // Expecting comma or end of header
+      return params;
+    case 8:   // Last token was end quote
+      params[key]= value;
+      return params;
+    default:
+      return 'Unexpected end of www-authenticate value.';
+  }
+};

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index 8f2d443..a055c4b 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -301,9 +301,9 @@ solrAdminServices.factory('System',
           // };
           //
           sessionStorage.setItem('globals', $rootScope.globals);
-          sessionStorage.setItem("auth.header", authdata);
+          sessionStorage.setItem("auth.header", "Basic " + authdata);
           sessionStorage.setItem("auth.username", username);
-          // $http.defaults.headers.common.Authorization = authdata;
+          // $http.defaults.headers.common.Authorization = "Basic " + authdata;
           console.log("Stored auth data on session storage");
         };
 
@@ -311,6 +311,8 @@ solrAdminServices.factory('System',
           $rootScope.globals = {};
           sessionStorage.removeItem('globals');
           sessionStorage.removeItem("auth.header");
+          sessionStorage.removeItem("auth.scheme");
+          sessionStorage.removeItem("auth.realm");
           sessionStorage.removeItem("auth.username");
           sessionStorage.removeItem("auth.wwwAuthHeader");
           // $http.defaults.headers.common.Authorization = null;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/libs/bootstrap.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/libs/bootstrap.js b/solr/webapp/web/libs/bootstrap.js
deleted file mode 100644
index 850e6e5..0000000
--- a/solr/webapp/web/libs/bootstrap.js
+++ /dev/null
@@ -1,2006 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }
-
-/* ========================================================================
- * Bootstrap: transition.js v3.0.3
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
-  // ============================================================
-
-  function transitionEnd() {
-    var el = document.createElement('bootstrap')
-
-    var transEndEventNames = {
-      'WebkitTransition' : 'webkitTransitionEnd'
-    , 'MozTransition'    : 'transitionend'
-    , 'OTransition'      : 'oTransitionEnd otransitionend'
-    , 'transition'       : 'transitionend'
-    }
-
-    for (var name in transEndEventNames) {
-      if (el.style[name] !== undefined) {
-        return { end: transEndEventNames[name] }
-      }
-    }
-  }
-
-  // http://blog.alexmaccaw.com/css-transitions
-  $.fn.emulateTransitionEnd = function (duration) {
-    var called = false, $el = this
-    $(this).one($.support.transition.end, function () { called = true })
-    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
-    setTimeout(callback, duration)
-    return this
-  }
-
-  $(function () {
-    $.support.transition = transitionEnd()
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: alert.js v3.0.3
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // ALERT CLASS DEFINITION
-  // ======================
-
-  var dismiss = '[data-dismiss="alert"]'
-  var Alert   = function (el) {
-    $(el).on('click', dismiss, this.close)
-  }
-
-  Alert.prototype.close = function (e) {
-    var $this    = $(this)
-    var selector = $this.attr('data-target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
-    }
-
-    var $parent = $(selector)
-
-    if (e) e.preventDefault()
-
-    if (!$parent.length) {
-      $parent = $this.hasClass('alert') ? $this : $this.parent()
-    }
-
-    $parent.trigger(e = $.Event('close.bs.alert'))
-
-    if (e.isDefaultPrevented()) return
-
-    $parent.removeClass('in')
-
-    function removeElement() {
-      $parent.trigger('closed.bs.alert').remove()
-    }
-
-    $.support.transition && $parent.hasClass('fade') ?
-      $parent
-        .one($.support.transition.end, removeElement)
-        .emulateTransitionEnd(150) :
-      removeElement()
-  }
-
-
-  // ALERT PLUGIN DEFINITION
-  // =======================
-
-  var old = $.fn.alert
-
-  $.fn.alert = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.alert')
-
-      if (!data) $this.data('bs.alert', (data = new Alert(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.alert.Constructor = Alert
-
-
-  // ALERT NO CONFLICT
-  // =================
-
-  $.fn.alert.noConflict = function () {
-    $.fn.alert = old
-    return this
-  }
-
-
-  // ALERT DATA-API
-  // ==============
-
-  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: button.js v3.0.3
- * http://getbootstrap.com/javascript/#buttons
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // BUTTON PUBLIC CLASS DEFINITION
-  // ==============================
-
-  var Button = function (element, options) {
-    this.$element = $(element)
-    this.options  = $.extend({}, Button.DEFAULTS, options)
-  }
-
-  Button.DEFAULTS = {
-    loadingText: 'loading...'
-  }
-
-  Button.prototype.setState = function (state) {
-    var d    = 'disabled'
-    var $el  = this.$element
-    var val  = $el.is('input') ? 'val' : 'html'
-    var data = $el.data()
-
-    state = state + 'Text'
-
-    if (!data.resetText) $el.data('resetText', $el[val]())
-
-    $el[val](data[state] || this.options[state])
-
-    // push to event loop to allow forms to submit
-    setTimeout(function () {
-      state == 'loadingText' ?
-        $el.addClass(d).attr(d, d) :
-        $el.removeClass(d).removeAttr(d);
-    }, 0)
-  }
-
-  Button.prototype.toggle = function () {
-    var $parent = this.$element.closest('[data-toggle="buttons"]')
-    var changed = true
-
-    if ($parent.length) {
-      var $input = this.$element.find('input')
-      if ($input.prop('type') === 'radio') {
-        // see if clicking on current one
-        if ($input.prop('checked') && this.$element.hasClass('active'))
-          changed = false
-        else
-          $parent.find('.active').removeClass('active')
-      }
-      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
-    }
-
-    if (changed) this.$element.toggleClass('active')
-  }
-
-
-  // BUTTON PLUGIN DEFINITION
-  // ========================
-
-  var old = $.fn.button
-
-  $.fn.button = function (option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.button')
-      var options = typeof option == 'object' && option
-
-      if (!data) $this.data('bs.button', (data = new Button(this, options)))
-
-      if (option == 'toggle') data.toggle()
-      else if (option) data.setState(option)
-    })
-  }
-
-  $.fn.button.Constructor = Button
-
-
-  // BUTTON NO CONFLICT
-  // ==================
-
-  $.fn.button.noConflict = function () {
-    $.fn.button = old
-    return this
-  }
-
-
-  // BUTTON DATA-API
-  // ===============
-
-  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
-    var $btn = $(e.target)
-    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
-    $btn.button('toggle')
-    e.preventDefault()
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: carousel.js v3.0.3
- * http://getbootstrap.com/javascript/#carousel
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // CAROUSEL CLASS DEFINITION
-  // =========================
-
-  var Carousel = function (element, options) {
-    this.$element    = $(element)
-    this.$indicators = this.$element.find('.carousel-indicators')
-    this.options     = options
-    this.paused      =
-    this.sliding     =
-    this.interval    =
-    this.$active     =
-    this.$items      = null
-
-    this.options.pause == 'hover' && this.$element
-      .on('mouseenter', $.proxy(this.pause, this))
-      .on('mouseleave', $.proxy(this.cycle, this))
-  }
-
-  Carousel.DEFAULTS = {
-    interval: 5000
-  , pause: 'hover'
-  , wrap: true
-  }
-
-  Carousel.prototype.cycle =  function (e) {
-    e || (this.paused = false)
-
-    this.interval && clearInterval(this.interval)
-
-    this.options.interval
-      && !this.paused
-      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
-
-    return this
-  }
-
-  Carousel.prototype.getActiveIndex = function () {
-    this.$active = this.$element.find('.item.active')
-    this.$items  = this.$active.parent().children()
-
-    return this.$items.index(this.$active)
-  }
-
-  Carousel.prototype.to = function (pos) {
-    var that        = this
-    var activeIndex = this.getActiveIndex()
-
-    if (pos > (this.$items.length - 1) || pos < 0) return
-
-    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
-    if (activeIndex == pos) return this.pause().cycle()
-
-    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
-  }
-
-  Carousel.prototype.pause = function (e) {
-    e || (this.paused = true)
-
-    if (this.$element.find('.next, .prev').length && $.support.transition.end) {
-      this.$element.trigger($.support.transition.end)
-      this.cycle(true)
-    }
-
-    this.interval = clearInterval(this.interval)
-
-    return this
-  }
-
-  Carousel.prototype.next = function () {
-    if (this.sliding) return
-    return this.slide('next')
-  }
-
-  Carousel.prototype.prev = function () {
-    if (this.sliding) return
-    return this.slide('prev')
-  }
-
-  Carousel.prototype.slide = function (type, next) {
-    var $active   = this.$element.find('.item.active')
-    var $next     = next || $active[type]()
-    var isCycling = this.interval
-    var direction = type == 'next' ? 'left' : 'right'
-    var fallback  = type == 'next' ? 'first' : 'last'
-    var that      = this
-
-    if (!$next.length) {
-      if (!this.options.wrap) return
-      $next = this.$element.find('.item')[fallback]()
-    }
-
-    this.sliding = true
-
-    isCycling && this.pause()
-
-    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
-
-    if ($next.hasClass('active')) return
-
-    if (this.$indicators.length) {
-      this.$indicators.find('.active').removeClass('active')
-      this.$element.one('slid.bs.carousel', function () {
-        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
-        $nextIndicator && $nextIndicator.addClass('active')
-      })
-    }
-
-    if ($.support.transition && this.$element.hasClass('slide')) {
-      this.$element.trigger(e)
-      if (e.isDefaultPrevented()) return
-      $next.addClass(type)
-      $next[0].offsetWidth // force reflow
-      $active.addClass(direction)
-      $next.addClass(direction)
-      $active
-        .one($.support.transition.end, function () {
-          $next.removeClass([type, direction].join(' ')).addClass('active')
-          $active.removeClass(['active', direction].join(' '))
-          that.sliding = false
-          setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
-        })
-        .emulateTransitionEnd(600)
-    } else {
-      this.$element.trigger(e)
-      if (e.isDefaultPrevented()) return
-      $active.removeClass('active')
-      $next.addClass('active')
-      this.sliding = false
-      this.$element.trigger('slid.bs.carousel')
-    }
-
-    isCycling && this.cycle()
-
-    return this
-  }
-
-
-  // CAROUSEL PLUGIN DEFINITION
-  // ==========================
-
-  var old = $.fn.carousel
-
-  $.fn.carousel = function (option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.carousel')
-      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
-      var action  = typeof option == 'string' ? option : options.slide
-
-      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
-      if (typeof option == 'number') data.to(option)
-      else if (action) data[action]()
-      else if (options.interval) data.pause().cycle()
-    })
-  }
-
-  $.fn.carousel.Constructor = Carousel
-
-
-  // CAROUSEL NO CONFLICT
-  // ====================
-
-  $.fn.carousel.noConflict = function () {
-    $.fn.carousel = old
-    return this
-  }
-
-
-  // CAROUSEL DATA-API
-  // =================
-
-  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
-    var $this   = $(this), href
-    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-    var options = $.extend({}, $target.data(), $this.data())
-    var slideIndex = $this.attr('data-slide-to')
-    if (slideIndex) options.interval = false
-
-    $target.carousel(options)
-
-    if (slideIndex = $this.attr('data-slide-to')) {
-      $target.data('bs.carousel').to(slideIndex)
-    }
-
-    e.preventDefault()
-  })
-
-  $(window).on('load', function () {
-    $('[data-ride="carousel"]').each(function () {
-      var $carousel = $(this)
-      $carousel.carousel($carousel.data())
-    })
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: collapse.js v3.0.3
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // COLLAPSE PUBLIC CLASS DEFINITION
-  // ================================
-
-  var Collapse = function (element, options) {
-    this.$element      = $(element)
-    this.options       = $.extend({}, Collapse.DEFAULTS, options)
-    this.transitioning = null
-
-    if (this.options.parent) this.$parent = $(this.options.parent)
-    if (this.options.toggle) this.toggle()
-  }
-
-  Collapse.DEFAULTS = {
-    toggle: true
-  }
-
-  Collapse.prototype.dimension = function () {
-    var hasWidth = this.$element.hasClass('width')
-    return hasWidth ? 'width' : 'height'
-  }
-
-  Collapse.prototype.show = function () {
-    if (this.transitioning || this.$element.hasClass('in')) return
-
-    var startEvent = $.Event('show.bs.collapse')
-    this.$element.trigger(startEvent)
-    if (startEvent.isDefaultPrevented()) return
-
-    var actives = this.$parent && this.$parent.find('> .panel > .in')
-
-    if (actives && actives.length) {
-      var hasData = actives.data('bs.collapse')
-      if (hasData && hasData.transitioning) return
-      actives.collapse('hide')
-      hasData || actives.data('bs.collapse', null)
-    }
-
-    var dimension = this.dimension()
-
-    this.$element
-      .removeClass('collapse')
-      .addClass('collapsing')
-      [dimension](0)
-
-    this.transitioning = 1
-
-    var complete = function () {
-      this.$element
-        .removeClass('collapsing')
-        .addClass('in')
-        [dimension]('auto')
-      this.transitioning = 0
-      this.$element.trigger('shown.bs.collapse')
-    }
-
-    if (!$.support.transition) return complete.call(this)
-
-    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
-
-    this.$element
-      .one($.support.transition.end, $.proxy(complete, this))
-      .emulateTransitionEnd(350)
-      [dimension](this.$element[0][scrollSize])
-  }
-
-  Collapse.prototype.hide = function () {
-    if (this.transitioning || !this.$element.hasClass('in')) return
-
-    var startEvent = $.Event('hide.bs.collapse')
-    this.$element.trigger(startEvent)
-    if (startEvent.isDefaultPrevented()) return
-
-    var dimension = this.dimension()
-
-    this.$element
-      [dimension](this.$element[dimension]())
-      [0].offsetHeight
-
-    this.$element
-      .addClass('collapsing')
-      .removeClass('collapse')
-      .removeClass('in')
-
-    this.transitioning = 1
-
-    var complete = function () {
-      this.transitioning = 0
-      this.$element
-        .trigger('hidden.bs.collapse')
-        .removeClass('collapsing')
-        .addClass('collapse')
-    }
-
-    if (!$.support.transition) return complete.call(this)
-
-    this.$element
-      [dimension](0)
-      .one($.support.transition.end, $.proxy(complete, this))
-      .emulateTransitionEnd(350)
-  }
-
-  Collapse.prototype.toggle = function () {
-    this[this.$element.hasClass('in') ? 'hide' : 'show']()
-  }
-
-
-  // COLLAPSE PLUGIN DEFINITION
-  // ==========================
-
-  var old = $.fn.collapse
-
-  $.fn.collapse = function (option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.collapse')
-      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
-      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.collapse.Constructor = Collapse
-
-
-  // COLLAPSE NO CONFLICT
-  // ====================
-
-  $.fn.collapse.noConflict = function () {
-    $.fn.collapse = old
-    return this
-  }
-
-
-  // COLLAPSE DATA-API
-  // =================
-
-  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
-    var $this   = $(this), href
-    var target  = $this.attr('data-target')
-        || e.preventDefault()
-        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
-    var $target = $(target)
-    var data    = $target.data('bs.collapse')
-    var option  = data ? 'toggle' : $this.data()
-    var parent  = $this.attr('data-parent')
-    var $parent = parent && $(parent)
-
-    if (!data || !data.transitioning) {
-      if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
-      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
-    }
-
-    $target.collapse(option)
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: dropdown.js v3.0.3
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // DROPDOWN CLASS DEFINITION
-  // =========================
-
-  var backdrop = '.dropdown-backdrop'
-  var toggle   = '[data-toggle=dropdown]'
-  var Dropdown = function (element) {
-    $(element).on('click.bs.dropdown', this.toggle)
-  }
-
-  Dropdown.prototype.toggle = function (e) {
-    var $this = $(this)
-
-    if ($this.is('.disabled, :disabled')) return
-
-    var $parent  = getParent($this)
-    var isActive = $parent.hasClass('open')
-
-    clearMenus()
-
-    if (!isActive) {
-      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
-        // if mobile we use a backdrop because click events don't delegate
-        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
-      }
-
-      $parent.trigger(e = $.Event('show.bs.dropdown'))
-
-      if (e.isDefaultPrevented()) return
-
-      $parent
-        .toggleClass('open')
-        .trigger('shown.bs.dropdown')
-
-      $this.focus()
-    }
-
-    return false
-  }
-
-  Dropdown.prototype.keydown = function (e) {
-    if (!/(38|40|27)/.test(e.keyCode)) return
-
-    var $this = $(this)
-
-    e.preventDefault()
-    e.stopPropagation()
-
-    if ($this.is('.disabled, :disabled')) return
-
-    var $parent  = getParent($this)
-    var isActive = $parent.hasClass('open')
-
-    if (!isActive || (isActive && e.keyCode == 27)) {
-      if (e.which == 27) $parent.find(toggle).focus()
-      return $this.click()
-    }
-
-    var $items = $('[role=menu] li:not(.divider):visible a', $parent)
-
-    if (!$items.length) return
-
-    var index = $items.index($items.filter(':focus'))
-
-    if (e.keyCode == 38 && index > 0)                 index--                        // up
-    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
-    if (!~index)                                      index=0
-
-    $items.eq(index).focus()
-  }
-
-  function clearMenus() {
-    $(backdrop).remove()
-    $(toggle).each(function (e) {
-      var $parent = getParent($(this))
-      if (!$parent.hasClass('open')) return
-      $parent.trigger(e = $.Event('hide.bs.dropdown'))
-      if (e.isDefaultPrevented()) return
-      $parent.removeClass('open').trigger('hidden.bs.dropdown')
-    })
-  }
-
-  function getParent($this) {
-    var selector = $this.attr('data-target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    var $parent = selector && $(selector)
-
-    return $parent && $parent.length ? $parent : $this.parent()
-  }
-
-
-  // DROPDOWN PLUGIN DEFINITION
-  // ==========================
-
-  var old = $.fn.dropdown
-
-  $.fn.dropdown = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.dropdown')
-
-      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.dropdown.Constructor = Dropdown
-
-
-  // DROPDOWN NO CONFLICT
-  // ====================
-
-  $.fn.dropdown.noConflict = function () {
-    $.fn.dropdown = old
-    return this
-  }
-
-
-  // APPLY TO STANDARD DROPDOWN ELEMENTS
-  // ===================================
-
-  $(document)
-    .on('click.bs.dropdown.data-api', clearMenus)
-    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
-    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
-    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: modal.js v3.0.3
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // MODAL CLASS DEFINITION
-  // ======================
-
-  var Modal = function (element, options) {
-    this.options   = options
-    this.$element  = $(element)
-    this.$backdrop =
-    this.isShown   = null
-
-    if (this.options.remote) this.$element.load(this.options.remote)
-  }
-
-  Modal.DEFAULTS = {
-      backdrop: true
-    , keyboard: true
-    , show: true
-  }
-
-  Modal.prototype.toggle = function (_relatedTarget) {
-    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
-  }
-
-  Modal.prototype.show = function (_relatedTarget) {
-    var that = this
-    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
-
-    this.$element.trigger(e)
-
-    if (this.isShown || e.isDefaultPrevented()) return
-
-    this.isShown = true
-
-    this.escape()
-
-    this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
-
-    this.backdrop(function () {
-      var transition = $.support.transition && that.$element.hasClass('fade')
-
-      if (!that.$element.parent().length) {
-        that.$element.appendTo(document.body) // don't move modals dom position
-      }
-
-      that.$element.show()
-
-      if (transition) {
-        that.$element[0].offsetWidth // force reflow
-      }
-
-      that.$element
-        .addClass('in')
-        .attr('aria-hidden', false)
-
-      that.enforceFocus()
-
-      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
-
-      transition ?
-        that.$element.find('.modal-dialog') // wait for modal to slide in
-          .one($.support.transition.end, function () {
-            that.$element.focus().trigger(e)
-          })
-          .emulateTransitionEnd(300) :
-        that.$element.focus().trigger(e)
-    })
-  }
-
-  Modal.prototype.hide = function (e) {
-    if (e) e.preventDefault()
-
-    e = $.Event('hide.bs.modal')
-
-    this.$element.trigger(e)
-
-    if (!this.isShown || e.isDefaultPrevented()) return
-
-    this.isShown = false
-
-    this.escape()
-
-    $(document).off('focusin.bs.modal')
-
-    this.$element
-      .removeClass('in')
-      .attr('aria-hidden', true)
-      .off('click.dismiss.modal')
-
-    $.support.transition && this.$element.hasClass('fade') ?
-      this.$element
-        .one($.support.transition.end, $.proxy(this.hideModal, this))
-        .emulateTransitionEnd(300) :
-      this.hideModal()
-  }
-
-  Modal.prototype.enforceFocus = function () {
-    $(document)
-      .off('focusin.bs.modal') // guard against infinite focus loop
-      .on('focusin.bs.modal', $.proxy(function (e) {
-        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
-          this.$element.focus()
-        }
-      }, this))
-  }
-
-  Modal.prototype.escape = function () {
-    if (this.isShown && this.options.keyboard) {
-      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
-        e.which == 27 && this.hide()
-      }, this))
-    } else if (!this.isShown) {
-      this.$element.off('keyup.dismiss.bs.modal')
-    }
-  }
-
-  Modal.prototype.hideModal = function () {
-    var that = this
-    this.$element.hide()
-    this.backdrop(function () {
-      that.removeBackdrop()
-      that.$element.trigger('hidden.bs.modal')
-    })
-  }
-
-  Modal.prototype.removeBackdrop = function () {
-    this.$backdrop && this.$backdrop.remove()
-    this.$backdrop = null
-  }
-
-  Modal.prototype.backdrop = function (callback) {
-    var that    = this
-    var animate = this.$element.hasClass('fade') ? 'fade' : ''
-
-    if (this.isShown && this.options.backdrop) {
-      var doAnimate = $.support.transition && animate
-
-      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
-        .appendTo(document.body)
-
-      this.$element.on('click.dismiss.modal', $.proxy(function (e) {
-        if (e.target !== e.currentTarget) return
-        this.options.backdrop == 'static'
-          ? this.$element[0].focus.call(this.$element[0])
-          : this.hide.call(this)
-      }, this))
-
-      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
-      this.$backdrop.addClass('in')
-
-      if (!callback) return
-
-      doAnimate ?
-        this.$backdrop
-          .one($.support.transition.end, callback)
-          .emulateTransitionEnd(150) :
-        callback()
-
-    } else if (!this.isShown && this.$backdrop) {
-      this.$backdrop.removeClass('in')
-
-      $.support.transition && this.$element.hasClass('fade')?
-        this.$backdrop
-          .one($.support.transition.end, callback)
-          .emulateTransitionEnd(150) :
-        callback()
-
-    } else if (callback) {
-      callback()
-    }
-  }
-
-
-  // MODAL PLUGIN DEFINITION
-  // =======================
-
-  var old = $.fn.modal
-
-  $.fn.modal = function (option, _relatedTarget) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.modal')
-      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
-      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
-      if (typeof option == 'string') data[option](_relatedTarget)
-      else if (options.show) data.show(_relatedTarget)
-    })
-  }
-
-  $.fn.modal.Constructor = Modal
-
-
-  // MODAL NO CONFLICT
-  // =================
-
-  $.fn.modal.noConflict = function () {
-    $.fn.modal = old
-    return this
-  }
-
-
-  // MODAL DATA-API
-  // ==============
-
-  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
-    var $this   = $(this)
-    var href    = $this.attr('href')
-    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
-    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
-
-    e.preventDefault()
-
-    $target
-      .modal(option, this)
-      .one('hide', function () {
-        $this.is(':visible') && $this.focus()
-      })
-  })
-
-  $(document)
-    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
-    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tooltip.js v3.0.3
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // TOOLTIP PUBLIC CLASS DEFINITION
-  // ===============================
-
-  var Tooltip = function (element, options) {
-    this.type       =
-    this.options    =
-    this.enabled    =
-    this.timeout    =
-    this.hoverState =
-    this.$element   = null
-
-    this.init('tooltip', element, options)
-  }
-
-  Tooltip.DEFAULTS = {
-    animation: true
-  , placement: 'top'
-  , selector: false
-  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
-  , trigger: 'hover focus'
-  , title: ''
-  , delay: 0
-  , html: false
-  , container: false
-  }
-
-  Tooltip.prototype.init = function (type, element, options) {
-    this.enabled  = true
-    this.type     = type
-    this.$element = $(element)
-    this.options  = this.getOptions(options)
-
-    var triggers = this.options.trigger.split(' ')
-
-    for (var i = triggers.length; i--;) {
-      var trigger = triggers[i]
-
-      if (trigger == 'click') {
-        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
-      } else if (trigger != 'manual') {
-        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'
-        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
-
-        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
-        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
-      }
-    }
-
-    this.options.selector ?
-      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
-      this.fixTitle()
-  }
-
-  Tooltip.prototype.getDefaults = function () {
-    return Tooltip.DEFAULTS
-  }
-
-  Tooltip.prototype.getOptions = function (options) {
-    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
-
-    if (options.delay && typeof options.delay == 'number') {
-      options.delay = {
-        show: options.delay
-      , hide: options.delay
-      }
-    }
-
-    return options
-  }
-
-  Tooltip.prototype.getDelegateOptions = function () {
-    var options  = {}
-    var defaults = this.getDefaults()
-
-    this._options && $.each(this._options, function (key, value) {
-      if (defaults[key] != value) options[key] = value
-    })
-
-    return options
-  }
-
-  Tooltip.prototype.enter = function (obj) {
-    var self = obj instanceof this.constructor ?
-      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
-
-    clearTimeout(self.timeout)
-
-    self.hoverState = 'in'
-
-    if (!self.options.delay || !self.options.delay.show) return self.show()
-
-    self.timeout = setTimeout(function () {
-      if (self.hoverState == 'in') self.show()
-    }, self.options.delay.show)
-  }
-
-  Tooltip.prototype.leave = function (obj) {
-    var self = obj instanceof this.constructor ?
-      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
-
-    clearTimeout(self.timeout)
-
-    self.hoverState = 'out'
-
-    if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
-    self.timeout = setTimeout(function () {
-      if (self.hoverState == 'out') self.hide()
-    }, self.options.delay.hide)
-  }
-
-  Tooltip.prototype.show = function () {
-    var e = $.Event('show.bs.'+ this.type)
-
-    if (this.hasContent() && this.enabled) {
-      this.$element.trigger(e)
-
-      if (e.isDefaultPrevented()) return
-
-      var $tip = this.tip()
-
-      this.setContent()
-
-      if (this.options.animation) $tip.addClass('fade')
-
-      var placement = typeof this.options.placement == 'function' ?
-        this.options.placement.call(this, $tip[0], this.$element[0]) :
-        this.options.placement
-
-      var autoToken = /\s?auto?\s?/i
-      var autoPlace = autoToken.test(placement)
-      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
-
-      $tip
-        .detach()
-        .css({ top: 0, left: 0, display: 'block' })
-        .addClass(placement)
-
-      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
-
-      var pos          = this.getPosition()
-      var actualWidth  = $tip[0].offsetWidth
-      var actualHeight = $tip[0].offsetHeight
-
-      if (autoPlace) {
-        var $parent = this.$element.parent()
-
-        var orgPlacement = placement
-        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop
-        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()
-        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
-        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left
-
-        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :
-                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :
-                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :
-                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :
-                    placement
-
-        $tip
-          .removeClass(orgPlacement)
-          .addClass(placement)
-      }
-
-      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
-
-      this.applyPlacement(calculatedOffset, placement)
-      this.$element.trigger('shown.bs.' + this.type)
-    }
-  }
-
-  Tooltip.prototype.applyPlacement = function(offset, placement) {
-    var replace
-    var $tip   = this.tip()
-    var width  = $tip[0].offsetWidth
-    var height = $tip[0].offsetHeight
-
-    // manually read margins because getBoundingClientRect includes difference
-    var marginTop = parseInt($tip.css('margin-top'), 10)
-    var marginLeft = parseInt($tip.css('margin-left'), 10)
-
-    // we must check for NaN for ie 8/9
-    if (isNaN(marginTop))  marginTop  = 0
-    if (isNaN(marginLeft)) marginLeft = 0
-
-    offset.top  = offset.top  + marginTop
-    offset.left = offset.left + marginLeft
-
-    $tip
-      .offset(offset)
-      .addClass('in')
-
-    // check to see if placing tip in new offset caused the tip to resize itself
-    var actualWidth  = $tip[0].offsetWidth
-    var actualHeight = $tip[0].offsetHeight
-
-    if (placement == 'top' && actualHeight != height) {
-      replace = true
-      offset.top = offset.top + height - actualHeight
-    }
-
-    if (/bottom|top/.test(placement)) {
-      var delta = 0
-
-      if (offset.left < 0) {
-        delta       = offset.left * -2
-        offset.left = 0
-
-        $tip.offset(offset)
-
-        actualWidth  = $tip[0].offsetWidth
-        actualHeight = $tip[0].offsetHeight
-      }
-
-      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
-    } else {
-      this.replaceArrow(actualHeight - height, actualHeight, 'top')
-    }
-
-    if (replace) $tip.offset(offset)
-  }
-
-  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {
-    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
-  }
-
-  Tooltip.prototype.setContent = function () {
-    var $tip  = this.tip()
-    var title = this.getTitle()
-
-    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
-    $tip.removeClass('fade in top bottom left right')
-  }
-
-  Tooltip.prototype.hide = function () {
-    var that = this
-    var $tip = this.tip()
-    var e    = $.Event('hide.bs.' + this.type)
-
-    function complete() {
-      if (that.hoverState != 'in') $tip.detach()
-    }
-
-    this.$element.trigger(e)
-
-    if (e.isDefaultPrevented()) return
-
-    $tip.removeClass('in')
-
-    $.support.transition && this.$tip.hasClass('fade') ?
-      $tip
-        .one($.support.transition.end, complete)
-        .emulateTransitionEnd(150) :
-      complete()
-
-    this.$element.trigger('hidden.bs.' + this.type)
-
-    return this
-  }
-
-  Tooltip.prototype.fixTitle = function () {
-    var $e = this.$element
-    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
-      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
-    }
-  }
-
-  Tooltip.prototype.hasContent = function () {
-    return this.getTitle()
-  }
-
-  Tooltip.prototype.getPosition = function () {
-    var el = this.$element[0]
-    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
-      width: el.offsetWidth
-    , height: el.offsetHeight
-    }, this.$element.offset())
-  }
-
-  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
-    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
-           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
-           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
-        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
-  }
-
-  Tooltip.prototype.getTitle = function () {
-    var title
-    var $e = this.$element
-    var o  = this.options
-
-    title = $e.attr('data-original-title')
-      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
-
-    return title
-  }
-
-  Tooltip.prototype.tip = function () {
-    return this.$tip = this.$tip || $(this.options.template)
-  }
-
-  Tooltip.prototype.arrow = function () {
-    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
-  }
-
-  Tooltip.prototype.validate = function () {
-    if (!this.$element[0].parentNode) {
-      this.hide()
-      this.$element = null
-      this.options  = null
-    }
-  }
-
-  Tooltip.prototype.enable = function () {
-    this.enabled = true
-  }
-
-  Tooltip.prototype.disable = function () {
-    this.enabled = false
-  }
-
-  Tooltip.prototype.toggleEnabled = function () {
-    this.enabled = !this.enabled
-  }
-
-  Tooltip.prototype.toggle = function (e) {
-    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
-    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
-  }
-
-  Tooltip.prototype.destroy = function () {
-    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
-  }
-
-
-  // TOOLTIP PLUGIN DEFINITION
-  // =========================
-
-  var old = $.fn.tooltip
-
-  $.fn.tooltip = function (option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.tooltip')
-      var options = typeof option == 'object' && option
-
-      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tooltip.Constructor = Tooltip
-
-
-  // TOOLTIP NO CONFLICT
-  // ===================
-
-  $.fn.tooltip.noConflict = function () {
-    $.fn.tooltip = old
-    return this
-  }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: popover.js v3.0.3
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // POPOVER PUBLIC CLASS DEFINITION
-  // ===============================
-
-  var Popover = function (element, options) {
-    this.init('popover', element, options)
-  }
-
-  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
-
-  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {
-    placement: 'right'
-  , trigger: 'click'
-  , content: ''
-  , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
-  })
-
-
-  // NOTE: POPOVER EXTENDS tooltip.js
-  // ================================
-
-  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
-
-  Popover.prototype.constructor = Popover
-
-  Popover.prototype.getDefaults = function () {
-    return Popover.DEFAULTS
-  }
-
-  Popover.prototype.setContent = function () {
-    var $tip    = this.tip()
-    var title   = this.getTitle()
-    var content = this.getContent()
-
-    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
-    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
-
-    $tip.removeClass('fade top bottom left right in')
-
-    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
-    // this manually by checking the contents.
-    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
-  }
-
-  Popover.prototype.hasContent = function () {
-    return this.getTitle() || this.getContent()
-  }
-
-  Popover.prototype.getContent = function () {
-    var $e = this.$element
-    var o  = this.options
-
-    return $e.attr('data-content')
-      || (typeof o.content == 'function' ?
-            o.content.call($e[0]) :
-            o.content)
-  }
-
-  Popover.prototype.arrow = function () {
-    return this.$arrow = this.$arrow || this.tip().find('.arrow')
-  }
-
-  Popover.prototype.tip = function () {
-    if (!this.$tip) this.$tip = $(this.options.template)
-    return this.$tip
-  }
-
-
-  // POPOVER PLUGIN DEFINITION
-  // =========================
-
-  var old = $.fn.popover
-
-  $.fn.popover = function (option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.popover')
-      var options = typeof option == 'object' && option
-
-      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.popover.Constructor = Popover
-
-
-  // POPOVER NO CONFLICT
-  // ===================
-
-  $.fn.popover.noConflict = function () {
-    $.fn.popover = old
-    return this
-  }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: scrollspy.js v3.0.3
- * http://getbootstrap.com/javascript/#scrollspy
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // SCROLLSPY CLASS DEFINITION
-  // ==========================
-
-  function ScrollSpy(element, options) {
-    var href
-    var process  = $.proxy(this.process, this)
-
-    this.$element       = $(element).is('body') ? $(window) : $(element)
-    this.$body          = $('body')
-    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
-    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
-    this.selector       = (this.options.target
-      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-      || '') + ' .nav li > a'
-    this.offsets        = $([])
-    this.targets        = $([])
-    this.activeTarget   = null
-
-    this.refresh()
-    this.process()
-  }
-
-  ScrollSpy.DEFAULTS = {
-    offset: 10
-  }
-
-  ScrollSpy.prototype.refresh = function () {
-    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
-
-    this.offsets = $([])
-    this.targets = $([])
-
-    var self     = this
-    var $targets = this.$body
-      .find(this.selector)
-      .map(function () {
-        var $el   = $(this)
-        var href  = $el.data('target') || $el.attr('href')
-        var $href = /^#\w/.test(href) && $(href)
-
-        return ($href
-          && $href.length
-          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
-      })
-      .sort(function (a, b) { return a[0] - b[0] })
-      .each(function () {
-        self.offsets.push(this[0])
-        self.targets.push(this[1])
-      })
-  }
-
-  ScrollSpy.prototype.process = function () {
-    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
-    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
-    var maxScroll    = scrollHeight - this.$scrollElement.height()
-    var offsets      = this.offsets
-    var targets      = this.targets
-    var activeTarget = this.activeTarget
-    var i
-
-    if (scrollTop >= maxScroll) {
-      return activeTarget != (i = targets.last()[0]) && this.activate(i)
-    }
-
-    for (i = offsets.length; i--;) {
-      activeTarget != targets[i]
-        && scrollTop >= offsets[i]
-        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
-        && this.activate( targets[i] )
-    }
-  }
-
-  ScrollSpy.prototype.activate = function (target) {
-    this.activeTarget = target
-
-    $(this.selector)
-      .parents('.active')
-      .removeClass('active')
-
-    var selector = this.selector
-      + '[data-target="' + target + '"],'
-      + this.selector + '[href="' + target + '"]'
-
-    var active = $(selector)
-      .parents('li')
-      .addClass('active')
-
-    if (active.parent('.dropdown-menu').length)  {
-      active = active
-        .closest('li.dropdown')
-        .addClass('active')
-    }
-
-    active.trigger('activate.bs.scrollspy')
-  }
-
-
-  // SCROLLSPY PLUGIN DEFINITION
-  // ===========================
-
-  var old = $.fn.scrollspy
-
-  $.fn.scrollspy = function (option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.scrollspy')
-      var options = typeof option == 'object' && option
-
-      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.scrollspy.Constructor = ScrollSpy
-
-
-  // SCROLLSPY NO CONFLICT
-  // =====================
-
-  $.fn.scrollspy.noConflict = function () {
-    $.fn.scrollspy = old
-    return this
-  }
-
-
-  // SCROLLSPY DATA-API
-  // ==================
-
-  $(window).on('load', function () {
-    $('[data-spy="scroll"]').each(function () {
-      var $spy = $(this)
-      $spy.scrollspy($spy.data())
-    })
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tab.js v3.0.3
- * http://getbootstrap.com/javascript/#tabs
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // TAB CLASS DEFINITION
-  // ====================
-
-  var Tab = function (element) {
-    this.element = $(element)
-  }
-
-  Tab.prototype.show = function () {
-    var $this    = this.element
-    var $ul      = $this.closest('ul:not(.dropdown-menu)')
-    var selector = $this.data('target')
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    if ($this.parent('li').hasClass('active')) return
-
-    var previous = $ul.find('.active:last a')[0]
-    var e        = $.Event('show.bs.tab', {
-      relatedTarget: previous
-    })
-
-    $this.trigger(e)
-
-    if (e.isDefaultPrevented()) return
-
-    var $target = $(selector)
-
-    this.activate($this.parent('li'), $ul)
-    this.activate($target, $target.parent(), function () {
-      $this.trigger({
-        type: 'shown.bs.tab'
-      , relatedTarget: previous
-      })
-    })
-  }
-
-  Tab.prototype.activate = function (element, container, callback) {
-    var $active    = container.find('> .active')
-    var transition = callback
-      && $.support.transition
-      && $active.hasClass('fade')
-
-    function next() {
-      $active
-        .removeClass('active')
-        .find('> .dropdown-menu > .active')
-        .removeClass('active')
-
-      element.addClass('active')
-
-      if (transition) {
-        element[0].offsetWidth // reflow for transition
-        element.addClass('in')
-      } else {
-        element.removeClass('fade')
-      }
-
-      if (element.parent('.dropdown-menu')) {
-        element.closest('li.dropdown').addClass('active')
-      }
-
-      callback && callback()
-    }
-
-    transition ?
-      $active
-        .one($.support.transition.end, next)
-        .emulateTransitionEnd(150) :
-      next()
-
-    $active.removeClass('in')
-  }
-
-
-  // TAB PLUGIN DEFINITION
-  // =====================
-
-  var old = $.fn.tab
-
-  $.fn.tab = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-      var data  = $this.data('bs.tab')
-
-      if (!data) $this.data('bs.tab', (data = new Tab(this)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tab.Constructor = Tab
-
-
-  // TAB NO CONFLICT
-  // ===============
-
-  $.fn.tab.noConflict = function () {
-    $.fn.tab = old
-    return this
-  }
-
-
-  // TAB DATA-API
-  // ============
-
-  $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
-    e.preventDefault()
-    $(this).tab('show')
-  })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: affix.js v3.0.3
- * http://getbootstrap.com/javascript/#affix
- * ========================================================================
- * Copyright 2013 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================================== */
-
-
-+function ($) { "use strict";
-
-  // AFFIX CLASS DEFINITION
-  // ======================
-
-  var Affix = function (element, options) {
-    this.options = $.extend({}, Affix.DEFAULTS, options)
-    this.$window = $(window)
-      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
-      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
-
-    this.$element = $(element)
-    this.affixed  =
-    this.unpin    = null
-
-    this.checkPosition()
-  }
-
-  Affix.RESET = 'affix affix-top affix-bottom'
-
-  Affix.DEFAULTS = {
-    offset: 0
-  }
-
-  Affix.prototype.checkPositionWithEventLoop = function () {
-    setTimeout($.proxy(this.checkPosition, this), 1)
-  }
-
-  Affix.prototype.checkPosition = function () {
-    if (!this.$element.is(':visible')) return
-
-    var scrollHeight = $(document).height()
-    var scrollTop    = this.$window.scrollTop()
-    var position     = this.$element.offset()
-    var offset       = this.options.offset
-    var offsetTop    = offset.top
-    var offsetBottom = offset.bottom
-
-    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
-    if (typeof offsetTop == 'function')    offsetTop    = offset.top()
-    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
-
-    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :
-                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
-                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false
-
-    if (this.affixed === affix) return
-    if (this.unpin) this.$element.css('top', '')
-
-    this.affixed = affix
-    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null
-
-    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))
-
-    if (affix == 'bottom') {
-      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })
-    }
-  }
-
-
-  // AFFIX PLUGIN DEFINITION
-  // =======================
-
-  var old = $.fn.affix
-
-  $.fn.affix = function (option) {
-    return this.each(function () {
-      var $this   = $(this)
-      var data    = $this.data('bs.affix')
-      var options = typeof option == 'object' && option
-
-      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.affix.Constructor = Affix
-
-
-  // AFFIX NO CONFLICT
-  // =================
-
-  $.fn.affix.noConflict = function () {
-    $.fn.affix = old
-    return this
-  }
-
-
-  // AFFIX DATA-API
-  // ==============
-
-  $(window).on('load', function () {
-    $('[data-spy="affix"]').each(function () {
-      var $spy = $(this)
-      var data = $spy.data()
-
-      data.offset = data.offset || {}
-
-      if (data.offsetBottom) data.offset.bottom = data.offsetBottom
-      if (data.offsetTop)    data.offset.top    = data.offsetTop
-
-      $spy.affix(data)
-    })
-  })
-
-}(jQuery);


[02/27] lucene-solr:solr7896-login-page: Hard coded authentication with solr:solrRocks

Posted by ja...@apache.org.
Hard coded authentication with solr:solrRocks


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f70371ba
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f70371ba
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f70371ba

Branch: refs/heads/solr7896-login-page
Commit: f70371bab49e3838955dbab9d2e8b85589817afe
Parents: 0fc0ff2
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Apr 20 12:36:35 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Apr 20 12:36:35 2018 +0200

----------------------------------------------------------------------
 .../apache/solr/security/BasicAuthPlugin.java   | 35 +++++++++++++----
 .../apache/solr/servlet/SolrDispatchFilter.java | 41 +++++++++++++-------
 solr/webapp/web/WEB-INF/web.xml                 |  2 +-
 solr/webapp/web/js/angular/app.js               | 17 +++++---
 4 files changed, 66 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f70371ba/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
index eab89e3..3533b9e 100644
--- a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
@@ -34,12 +34,13 @@ import java.util.StringTokenizer;
 import com.google.common.collect.ImmutableSet;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.http.Header;
+import org.apache.http.HttpHeaders;
 import org.apache.http.auth.BasicUserPrincipal;
 import org.apache.http.message.BasicHeader;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.ValidatingJsonMap;
-import org.apache.solr.common.util.CommandOperation;
 import org.apache.solr.common.SpecProvider;
+import org.apache.solr.common.util.CommandOperation;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,6 +48,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private AuthenticationProvider authenticationProvider;
   private final static ThreadLocal<Header> authHeader = new ThreadLocal<>();
+  private static final String X_REQUESTED_WITH_HEADER = "X-Requested-With";
   private boolean blockUnknown = false;
 
   public boolean authenticate(String username, String pwd) {
@@ -94,9 +96,17 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
     return provider;
   }
 
-  private void authenticationFailure(HttpServletResponse response, String message) throws IOException {
+  private void authenticationFailure(HttpServletResponse response, boolean isAjaxRequest, String message) throws IOException {
     for (Map.Entry<String, String> entry : authenticationProvider.getPromptHeaders().entrySet()) {
-      response.setHeader(entry.getKey(), entry.getValue());
+      String value = entry.getValue();
+      // Prevent browser from intercepting basic authentication header when reqeust from Admin UI
+      if (isAjaxRequest && HttpHeaders.WWW_AUTHENTICATE.equalsIgnoreCase(entry.getKey()) && value != null) {
+        if (value.startsWith("Basic ")) {
+          value = "x" + value;
+          log.debug("Prefixing {} header for Basic Auth with 'x' to prevent browser basic auth popup", HttpHeaders.WWW_AUTHENTICATE);
+        }
+      }
+      response.setHeader(entry.getKey(), value);
     }
     response.sendError(401, message);
   }
@@ -108,6 +118,8 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
     HttpServletResponse response = (HttpServletResponse) servletResponse;
 
     String authHeader = request.getHeader("Authorization");
+    boolean isAjaxRequest = isAjaxRequest(request);
+    
     if (authHeader != null) {
       BasicAuthPlugin.authHeader.set(new BasicHeader("Authorization", authHeader));
       StringTokenizer st = new StringTokenizer(authHeader);
@@ -122,7 +134,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
               String pwd = credentials.substring(p + 1).trim();
               if (!authenticate(username, pwd)) {
                 log.debug("Bad auth credentials supplied in Authorization header");
-                authenticationFailure(response, "Bad credentials");
+                authenticationFailure(response, isAjaxRequest, "Bad credentials");
               } else {
                 HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(request) {
                   @Override
@@ -135,7 +147,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
               }
 
             } else {
-              authenticationFailure(response, "Invalid authentication token");
+              authenticationFailure(response, isAjaxRequest, "Invalid authentication token");
             }
           } catch (UnsupportedEncodingException e) {
             throw new Error("Couldn't retrieve authentication", e);
@@ -144,7 +156,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
       }
     } else {
       if (blockUnknown) {
-        authenticationFailure(response, "require authentication");
+        authenticationFailure(response, isAjaxRequest, "require authentication");
       } else {
         request.setAttribute(AuthenticationPlugin.class.getName(), authenticationProvider.getPromptHeaders());
         filterChain.doFilter(request, response);
@@ -183,5 +195,12 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
   public static final String BLOCK_UNKNOWN = "blockUnknown";
   private static final Set<String> PROPS = ImmutableSet.of(BLOCK_UNKNOWN);
 
-
+  /**
+   * Check if the request is an AJAX request, i.e. from the Admin UI or other SPA front 
+   * @param request the servlet request
+   * @return true if the request is AJAX request
+   */
+  private boolean isAjaxRequest(HttpServletRequest request) {
+    return "XMLHttpRequest".equalsIgnoreCase(request.getHeader(X_REQUESTED_WITH_HEADER));
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f70371ba/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
index fc0c28f..5f8097c 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
@@ -358,18 +358,6 @@ public class SolrDispatchFilter extends BaseSolrFilter {
         }
       }
 
-      AtomicReference<HttpServletRequest> wrappedRequest = new AtomicReference<>();
-      if (!authenticateRequest(request, response, wrappedRequest)) { // the response and status code have already been sent
-        return;
-      }
-      if (wrappedRequest.get() != null) {
-        request = wrappedRequest.get();
-      }
-
-      if (cores.getAuthenticationPlugin() != null) {
-        log.debug("User principal: {}", request.getUserPrincipal());
-      }
-
       // No need to even create the HttpSolrCall object if this path is excluded.
       if (excludePatterns != null) {
         String requestPath = request.getServletPath();
@@ -387,6 +375,18 @@ public class SolrDispatchFilter extends BaseSolrFilter {
         }
       }
 
+      AtomicReference<HttpServletRequest> wrappedRequest = new AtomicReference<>();
+      if (!authenticateRequest(request, response, wrappedRequest)) { // the response and status code have already been sent
+        return;
+      }
+      if (wrappedRequest.get() != null) {
+        request = wrappedRequest.get();
+      }
+
+      if (cores.getAuthenticationPlugin() != null) {
+        log.debug("User principal: {}", request.getUserPrincipal());
+      }
+
       HttpSolrCall call = getHttpSolrCall(closeShield(request, retry), closeShield(response, retry), retry);
       ExecutorUtil.setServerThreadFlag(Boolean.TRUE);
       try {
@@ -453,11 +453,22 @@ public class SolrDispatchFilter extends BaseSolrFilter {
     if (authenticationPlugin == null) {
       return true;
     } else {
-      // /admin/info/key must be always open. see SOLR-9188
+      // /admin/info/key and /solr/ (Admin UI) must be always open. see SOLR-9188
       // tests work only w/ getPathInfo
       //otherwise it's just enough to have getServletPath()
-      if (PKIAuthenticationPlugin.PATH.equals(request.getServletPath()) ||
-          PKIAuthenticationPlugin.PATH.equals(request.getPathInfo())) return true;
+      String requestPath = request.getPathInfo();
+      if (requestPath == null) 
+        requestPath = request.getServletPath();
+      if (PKIAuthenticationPlugin.PATH.equals(requestPath)) {
+        if (log.isDebugEnabled())
+          log.debug("Pass through PKI authentication endpoint");
+        return true;
+      }
+      if ("/solr/".equals(requestPath) || "/".equals(requestPath)) {
+        if (log.isDebugEnabled())
+          log.debug("Pass through Admin UI entry point");
+        return true;
+      }
       String header = request.getHeader(PKIAuthenticationPlugin.HEADER);
       if (header != null && cores.getPkiAuthenticationPlugin() != null)
         authenticationPlugin = cores.getPkiAuthenticationPlugin();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f70371ba/solr/webapp/web/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/solr/webapp/web/WEB-INF/web.xml b/solr/webapp/web/WEB-INF/web.xml
index 8d86269..22082c8 100644
--- a/solr/webapp/web/WEB-INF/web.xml
+++ b/solr/webapp/web/WEB-INF/web.xml
@@ -56,7 +56,7 @@
     -->
     <init-param>
       <param-name>excludePatterns</param-name>
-      <param-value>/partials/.+,/libs/.+,/css/.+,/js/.+,/img/.+,/tpl/.+</param-value>
+      <param-value>/partials/.+,/libs/.+,/css/.+,/js/.+,/img/.+</param-value>
     </init-param>
   </filter>
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f70371ba/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index ee420d3..3a2009a 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -371,21 +371,25 @@ solrAdminApp.config([
 })
 .factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
   var started = function(config) {
-    config.headers['Authorization'] = "Basic c29scjpTb2xyUm9ja3M="; // solr / solrRocks
-    console.log("Added authorization header");
+    var ah = "Basic c29scjpzb2xyUm9ja3M=";  // solr / solrRocks
+    config.headers['Authorization'] = ah;
+    console.log("Added authorization header " + ah);
     return config || $q.when(config);
   };
 
   var ended = function(response) {
+    console.log("Response headers: " + JSON.stringify(response.headers, undefined, 2));
     if (response.headers['WWW-Authenticate'] != null) {
-      console.log("Got WWW-Authenticate header");
-      alert("WWW-Authenticate: " + response.headers['WWW-Authenticate']);
+      console.log("Got WWW-Authenticate header: " + response.headers['WWW-Authenticate']);
     }
     return response || $q.when(response);
   };
 
   var failed = function(rejection) {
-    console.log("Failed with rejection " + rejection);
+    console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
+    if (rejection.status === 401) {
+      console.log("Status code is 401");
+    }
     $rootScope.$broadcast('loadingStatusInactive');
     return $q.reject(rejection);
   };
@@ -395,6 +399,9 @@ solrAdminApp.config([
 .config(function($httpProvider) {
   $httpProvider.interceptors.push("httpInterceptor");
   $httpProvider.interceptors.push("authInterceptor");
+  // Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
+  // so that the browser will not intercept the login dialogue
+  $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
 })
 .directive('fileModel', function ($parse) {
     return {


[15/27] lucene-solr:solr7896-login-page: Testing new approach

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css b/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
new file mode 100644
index 0000000..ed3905e
--- /dev/null
+++ b/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-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:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;fo
 nt-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}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{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:
 auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px so
 lid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\
 270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:bef
 ore{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:b
 efore{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:befo
 re{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{con
 tent:"\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-bu
 llhorn: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{co
 ntent:"\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"}.gly
 phicon-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-hambu
 rger: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}:after,:before{-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}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6
 px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;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}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weigh
 t:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.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-c
 apitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px
 ;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height
 :1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}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:#3
 33;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg
 -3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{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{rig
 ht:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6
 {margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33
 333333%}.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-offs
 et-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-
 push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.666666
 67%}.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>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid 
 #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;di
 splay:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{bac
 kground-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>t
 d,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin
 -bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr
 >th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border: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:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{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[ty
 pe=checkbox]:focus,input[type=radio]:focus{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,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-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,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-p
 laceholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.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].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-g
 roup-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disable
 d],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left: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}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .f
 orm-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.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}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-con
 trol-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color
 :#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error
 .radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.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 .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-ali
 gn:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba
 (0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-def
 ault:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggl
 e.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;bo
 rder-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.b
 tn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;
 border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning
 :focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-dang
 er.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;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:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm
 {padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-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-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;wid
 th:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.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:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-deco
 ration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bott
 om:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{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,.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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.b
 tn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(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-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-chi
 ld){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle
 =buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height
 :auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon
 {padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:no
 t(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-dec
 oration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-ta
 bs.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:focus,.nav-tabs.nav-justified>.active>a:hover{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:focus,.nav-tabs.nav-justified>.active>a:hover{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:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-
 cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{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:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-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{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent
 ;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;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-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.
 container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{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;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{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;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;bord
 er-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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@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{padding:10px 15px;margin-top:8px;margin-right:-15
 px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;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 .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .rad
 io label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@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;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-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-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd
 }.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:f
 ocus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>
 .active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@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 .na
 vbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color
 :#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.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;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pag
 ination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3p
 x;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager 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:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{posit
 ion:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-
 1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;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{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;paddin
 g: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 a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.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:700}.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{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9ed
 f7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.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}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:ce
 nter;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:prog
 ress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-i
 mage:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-dang
 er{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{ver
 tical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.l

<TRUNCATED>

[18/27] lucene-solr:solr7896-login-page: Merge branch 'master' into solr7896-login-page

Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ae8a7e3c
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ae8a7e3c
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ae8a7e3c

Branch: refs/heads/solr7896-login-page
Commit: ae8a7e3c2e9c110474960aa82f6ef2044e8aced1
Parents: 90dcf6e 86e0040
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Oct 1 15:19:04 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Oct 1 15:19:04 2018 +0200

----------------------------------------------------------------------
 dev-tools/scripts/prep-solr-ref-guide-rc.sh     |   4 +-
 dev-tools/scripts/smokeTestRelease.py           |  13 +-
 lucene/CHANGES.txt                              |   5 +
 lucene/common-build.xml                         |   1 -
 .../org/apache/lucene/index/IndexWriter.java    |  27 +-
 .../org/apache/lucene/index/MergeState.java     |  44 +-
 .../apache/lucene/search/TermInSetQuery.java    |   2 +-
 .../apache/lucene/index/TestIndexSorting.java   |  49 +-
 .../document/BaseLatLonShapeTestCase.java       |   2 +-
 .../document/TestLatLonPolygonShapeQueries.java |   8 +-
 solr/CHANGES.txt                                |  17 +
 .../extraction/ExtractingRequestHandler.java    |  33 +-
 .../handler/extraction/ExtractionDateUtil.java  | 178 -----
 .../handler/extraction/SolrContentHandler.java  |  41 +-
 .../extraction/SolrContentHandlerFactory.java   |  10 +-
 .../ExtractingRequestHandlerTest.java           |   6 +-
 .../extraction/TestExtractionDateUtil.java      |  62 --
 .../org/apache/solr/cloud/RecoveryStrategy.java | 206 +++---
 .../org/apache/solr/cloud/ZkShardTerms.java     |   8 +-
 .../cloud/api/collections/AddReplicaCmd.java    |  45 +-
 .../solr/cloud/api/collections/Assign.java      | 362 ++++++----
 .../api/collections/CreateCollectionCmd.java    |  34 +-
 .../cloud/api/collections/ReplaceNodeCmd.java   |  33 +-
 .../solr/cloud/api/collections/RestoreCmd.java  |  16 +-
 .../cloud/api/collections/SplitShardCmd.java    |  17 +-
 .../cloud/autoscaling/ComputePlanAction.java    |   8 +-
 .../cloud/autoscaling/IndexSizeTrigger.java     |  12 +-
 .../solr/cloud/overseer/ReplicaMutator.java     |   4 +-
 .../java/org/apache/solr/core/SolrConfig.java   |   2 +-
 .../solr/handler/admin/MetricsHandler.java      |   4 +-
 .../handler/admin/MetricsHistoryHandler.java    |   4 +-
 .../apache/solr/metrics/SolrMetricManager.java  |  67 +-
 .../metrics/reporters/SolrSlf4jReporter.java    |   4 +-
 .../reporters/solr/SolrClusterReporter.java     |   8 +-
 .../solr/search/ExtendedDismaxQParser.java      |  89 ++-
 .../configsets/_default/conf/managed-schema     |   8 +-
 .../configsets/_default/conf/solrconfig.xml     |   1 -
 .../org/apache/solr/cloud/AddReplicaTest.java   |  10 +-
 .../org/apache/solr/cloud/CloudTestUtils.java   |   6 +-
 .../solr/cloud/CollectionsAPISolrJTest.java     |  13 +-
 .../org/apache/solr/cloud/ZkShardTermsTest.java |  14 +-
 .../CollectionTooManyReplicasTest.java          |   8 +-
 .../cloud/autoscaling/IndexSizeTriggerTest.java |  10 +-
 .../solr/cloud/autoscaling/TestPolicyCloud.java |   1 +
 .../cloud/autoscaling/sim/SimCloudManager.java  |  66 +-
 .../sim/SimClusterStateProvider.java            | 706 ++++++++++++++-----
 .../autoscaling/sim/SimDistribStateManager.java |   7 +
 .../autoscaling/sim/SimNodeStateProvider.java   |  21 +-
 .../sim/TestSimExecutePlanAction.java           |   4 +-
 .../autoscaling/sim/TestSimExtremeIndexing.java | 163 +++++
 .../autoscaling/sim/TestSimNodeLostTrigger.java |   2 +-
 .../autoscaling/sim/TestSimPolicyCloud.java     |  11 +-
 .../sim/TestSimTriggerIntegration.java          |   8 +-
 .../solr/metrics/SolrMetricManagerTest.java     |  14 -
 .../solr/search/TestExtendedDismaxParser.java   |  33 +-
 .../configsets/_default/conf/managed-schema     |   8 +-
 .../configsets/_default/conf/solrconfig.xml     |   1 -
 solr/solr-ref-guide/src/meta-docs/publish.adoc  |   7 +-
 ...g-data-with-solr-cell-using-apache-tika.adoc | 111 +--
 .../cloud/autoscaling/FreeDiskVariable.java     |  12 +-
 .../client/solrj/cloud/autoscaling/Policy.java  |  35 +-
 .../solrj/cloud/autoscaling/PolicyHelper.java   |  91 ++-
 .../solrj/cloud/autoscaling/ReplicaInfo.java    |   4 +-
 .../client/solrj/cloud/autoscaling/Row.java     |   2 +-
 .../solrj/cloud/autoscaling/Suggester.java      |   2 +-
 .../solrj/cloud/autoscaling/Suggestion.java     |   5 +
 .../org/apache/solr/client/solrj/io/Lang.java   |   5 +
 .../solrj/io/eval/ConvexHullEvaluator.java      |  62 ++
 .../client/solrj/io/eval/GetAreaEvaluator.java  |  43 ++
 .../solrj/io/eval/GetBaryCenterEvaluator.java   |  50 ++
 .../solrj/io/eval/GetBoundarySizeEvaluator.java |  43 ++
 .../solrj/io/eval/GetVerticesEvaluator.java     |  51 ++
 .../solr/common/ConditionalMapWriter.java       |   2 +-
 .../org/apache/solr/common/IteratorWriter.java  |   9 +
 .../java/org/apache/solr/common/MapWriter.java  |  30 +
 .../solr/common/cloud/ReplicaPosition.java      |   2 +-
 .../org/apache/solr/common/util/NamedList.java  |  10 +-
 .../java/org/apache/solr/common/util/Utils.java |  78 +-
 .../collections.collection.Commands.json        |   3 +-
 .../testMoveReplicasInMultipleCollections.json  |  88 +++
 .../autoscaling/testSuggestionsRebalance2.json  | 130 ++++
 .../testSuggestionsRebalanceOnly.json           | 105 +++
 .../solrj/cloud/autoscaling/TestPolicy.java     | 206 ++----
 .../solrj/cloud/autoscaling/TestPolicy2.java    |  45 +-
 .../apache/solr/client/solrj/io/TestLang.java   |   3 +-
 .../solrj/io/stream/MathExpressionTest.java     |  71 ++
 86 files changed, 2549 insertions(+), 1296 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ae8a7e3c/solr/CHANGES.txt
----------------------------------------------------------------------


[20/27] lucene-solr:solr7896-login-page: New iteration. Intercepts WWW-authenticate header and allows separate screens per type WORK IN PROGRESS

Posted by ja...@apache.org.
New iteration. Intercepts WWW-authenticate header and allows separate screens per type
WORK IN PROGRESS


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9012e40a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9012e40a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9012e40a

Branch: refs/heads/solr7896-login-page
Commit: 9012e40a5c2afd8bd8f482ea208d255da1af6e76
Parents: 9ee3506
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Oct 5 16:41:25 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Oct 5 16:41:25 2018 +0200

----------------------------------------------------------------------
 .../apache/solr/security/BasicAuthPlugin.java   |   6 +
 solr/webapp/web/index.html                      |   5 +-
 solr/webapp/web/js/angular/app.js               | 117 +++++++++++--------
 solr/webapp/web/js/angular/controllers/login.js |  38 ++++--
 solr/webapp/web/js/angular/services.js          |  22 +++-
 solr/webapp/web/partials/login.html             |  33 +++++-
 6 files changed, 151 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
index 3533b9e..597df7c 100644
--- a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
@@ -108,6 +108,12 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
       }
       response.setHeader(entry.getKey(), value);
     }
+    // NOCOMMIT - which headers to set?
+    // Need to explicitly allow Admin UI to read these headers from the 401 response
+//    response.setHeader("Access-Control-Expose-Headers", "WWW-Authenticate, X-Solr-AuthData");
+//    response.setHeader("Access-Control-Allow-Origin", "*");
+//    response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
+//    response.setHeader("Access-Control-Max-Age", "3600");
     response.sendError(401, message);
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index d832155..4b83533 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -64,9 +64,6 @@ limitations under the License.
   <script src="libs/jquery-ui.min.js"></script>
   <script src="js/angular/app.js"></script>
   <script src="js/angular/services.js"></script>
-  <script src="js/angular/directives.js"></script>
-  <script src="js/angular/http-auth-interceptor.js"></script>
-  <script src="js/angular/login-controllers.js"></script>
   <script src="js/angular/controllers/index.js"></script>
   <script src="js/angular/controllers/login.js"></script>
   <script src="js/angular/controllers/logging.js"></script>
@@ -144,7 +141,7 @@ limitations under the License.
         <div>
 
           <ul id="menu">
-            <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Logout</a></p></li>
+            <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Logout {{username}}</a></p></li>
             
             <li id="index" class="global" ng-class="{active:page=='index'}"><p><a href="#/">Dashboard</a></p></li>
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 71dd98b..36dd07c 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -369,66 +369,85 @@ solrAdminApp.config([
       $rootScope.exceptions[rejection.config.url] = rejection.data.error;
     }
     return $q.reject(rejection);
-  }
+  };
 
   return {request: started, response: ended, responseError: failed};
 })
 // NOCOMMIT First iteration    
-// .factory('authInterceptor', function($q, $rootScope, $timeout, $injector) {
-//   var started = function(config) {
-//     var ah = "Basic c29scjpyb2Nrcw==";  // solr / SolrRocks
-//     config.headers['Authorization'] = ah;
-//     console.log("Added authorization header " + ah);
-//     return config || $q.when(config);
-//   };
-//
-//   var ended = function(response) {
-//     console.log("Response headers: " + JSON.stringify(response.headers, undefined, 2));
-//     if (response.headers['WWW-Authenticate'] != null) {
-//       console.log("Got WWW-Authenticate header: " + response.headers['WWW-Authenticate']);
-//     }
-//     return response || $q.when(response);
-//   };
-//
-//   var failed = function(rejection) {
-//     console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
-//     if (rejection.status === 401) {
-//       console.log("Status code is 401");
-//     } else {
-//       console.log("Rejection status is " + rejection.status)
-//     }
-//     $rootScope.$broadcast('loadingStatusInactive');
-//     return $q.reject(rejection);
-//   };
-//
-//   return {request: started, response: ended, responseError: failed};
-// })
+.factory('authInterceptor', function($q, $rootScope, $location, $timeout, $injector) {
+  var started = function(config) {
+    console.log("Request config: " + JSON.stringify(config, undefined, 2));
+    // var ah = "Basic c29scjpyb2Nrcw==";  // solr / SolrRocks
+    // config.headers['Authorization'] = ah;
+    // console.log("Added authorization header " + ah);
+    if (sessionStorage.getItem("auth.header") !== null) {
+      if (config.headers['Authorization'] === null) {
+        config.headers['Authorization'] = sessionStorage.getItem("auth.header");
+        console.log("We have a logged in user with header " + sessionStorage.getItem("auth.username") + ", appending header");
+      }
+    }
+    return config || $q.when(config);
+  };
+
+  var ended = function(response) {
+    console.log("Response headers: " + JSON.stringify(response.headers(), undefined, 2));
+    return response || $q.when(response);
+  };
+
+  var failed = function(rejection) {
+    console.log("Failed with rejection " + JSON.stringify(rejection, undefined, 2));
+    if (rejection.status === 401) {
+      console.log("Status code is 401");
+      var headers = rejection.headers();
+      console.log("Headers are " + JSON.stringify(headers, undefined, 2));
+      var wwwAuthHeader = headers['www-authenticate'];
+      sessionStorage.setItem("auth.wwwAuthHeader", wwwAuthHeader);
+      var authDataHeader = headers['X-Solr-AuthData'];
+      if (authDataHeader !== null) {
+        sessionStorage.setItem("auth.config", authDataHeader);
+      }
+      console.log("Got WWW-Authenticate header: " + wwwAuthHeader + " and X-Solr-AuthData: " + authDataHeader);
+      var authType = wwwAuthHeader.split(" ")[0];
+      console.log("AuthType is: " + authType);
+      sessionStorage.setItem("auth.type", authType);
+      sessionStorage.setItem("auth.location", $location.path());
+      sessionStorage.removeItem("auth.username");
+      sessionStorage.removeItem("auth.header");
+      $location.path('/login');
+    } else {
+      console.log("Rejection status is " + rejection.status)
+    }
+    $rootScope.$broadcast('loadingStatusInactive');
+    return $q.reject(rejection);
+  };
+
+  return {request: started, response: ended, responseError: failed};
+})
 .config(function($httpProvider) {
   $httpProvider.interceptors.push("httpInterceptor");
-  // NOCOMMIT $httpProvider.interceptors.push("authInterceptor");
-  // Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
-  // so that the browser will not interfer with the login dialogue
+  $httpProvider.interceptors.push("authInterceptor");
+  // Force BasicAuth plugin to serve us a 'Authorization: xBasic xxxx' header so browser will not pop up login dialogue
   $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
 })
     
     
 // NOCOMMIT: just for testing     
-.run(['$rootScope', '$location', '$cookieStore', '$http',
-  function ($rootScope, $location, $cookieStore, $http) {
-    // keep user logged in after page refresh
-    // Replace with interceptor
-    $rootScope.globals = $cookieStore.get('globals') || {};
-    if ($rootScope.globals.currentUser) {
-      $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
-    }
-
-    $rootScope.$on('$locationChangeStart', function (event, next, current) {
-      // redirect to login page if not logged in
-      if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
-        $location.path('/login');
-      }
-    });
-  }])
+// .run(['$rootScope', '$location', '$cookieStore', '$http',
+//   function ($rootScope, $location, $cookieStore, $http) {
+//     // keep user logged in after page refresh
+//     // Replace with interceptor
+//     $rootScope.globals = $cookieStore.get('globals') || {};
+//     if ($rootScope.globals.currentUser) {
+//       $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
+//     }
+//
+//     // $rootScope.$on('$locationChangeStart', function (event, next, current) {
+//     //   // redirect to login page if not logged in
+//     //   if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
+//     //     $location.path('/login');
+//     //   }
+//     // });
+//   }])
 
     
 .directive('fileModel', function ($parse) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index 653ca14..a67119c8 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -16,15 +16,28 @@
 */
 
 solrAdminApp.controller('LoginController',
-    ['$scope', '$rootScope', '$location', 'AuthenticationService',
-      function ($scope, $rootScope, $location, AuthenticationService) {
-        // reset login status
-        AuthenticationService.ClearCredentials();
-
+    ['$scope', '$routeParams', '$rootScope', '$location', 'AuthenticationService',
+      function ($scope, $routeParams, $rootScope, $location, AuthenticationService) {
+        var authType = sessionStorage.getItem("auth.type");
+        var basicTypes = ['Basic', 'xBasic'];
+        if (authType !== null && basicTypes.includes(authType)) {
+          if (authType === 'xBasic') authType = 'Basic';
+          $scope.authType = authType;
+        } else {
+          $scope.authType = 'unknown';
+        }      
+        
+        $scope.wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
+        $scope.authConfig = sessionStorage.getItem("auth.config");
+        $scope.authLocation = sessionStorage.getItem("auth.location");
+        $scope.authLoggedinUser = sessionStorage.getItem("auth.username");
+        $scope.authHeader = sessionStorage.getItem("auth.header");
+        
         $scope.login = function () {
-          $scope.dataLoading = true;
           AuthenticationService.SetCredentials($scope.username, $scope.password);
-          $location.path('/');
+          console.log("Redirecting back to " + $scope.authLocation);
+          $location.path($scope.authLocation); // Redirect to the location that caused the login prompt
+          
           // TODO: "login" by hitting the failing URL again
           // AuthenticationService.Login($scope.username, $scope.password, function (response) {
           //   if (response.success) {
@@ -36,4 +49,15 @@ solrAdminApp.controller('LoginController',
           //   }
           // });
         };
+        
+        $scope.logout = function() {
+          // reset login status
+          AuthenticationService.ClearCredentials();
+          console.log("Logged out user and cleared creds");
+          $location.path("/");
+        };
+        
+        $scope.isLoggedIn = function() {
+          return (sessionStorage.getItem("auth.username") !== null);
+        };
       }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index b6df864..323bc8e 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -264,8 +264,8 @@ solrAdminServices.factory('System',
      })
 }])
 .factory('AuthenticationService',
-    ['Base64', '$http', '$cookieStore', '$rootScope', '$timeout',
-      function (Base64, $http, $cookieStore, $rootScope, $timeout) {
+    ['Base64', '$http', '$rootScope', '$timeout',
+      function (Base64, $http, $rootScope, $timeout) {
         var service = {};
 
         service.Login = function (username, password, callback) {
@@ -293,6 +293,9 @@ solrAdminServices.factory('System',
         service.SetCredentials = function (username, password) {
           var authdata = Base64.encode(username + ':' + password);
 
+          sessionStorage.setItem("auth.username", username);
+          $rootScope.username = username;
+
           $rootScope.globals = {
             currentUser: {
               username: username,
@@ -300,14 +303,21 @@ solrAdminServices.factory('System',
             }
           };
 
-          $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
-          $cookieStore.put('globals', $rootScope.globals);
+          // $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
+          $http.defaults.headers.common.Authorization = 'Basic ' + authdata;
+          // sessionStorage.setItem('globals', $rootScope.globals);
+          sessionStorage.setItem("auth.header", authdata);
+          console.log("Stored auth data on session storage");
         };
 
         service.ClearCredentials = function () {
           $rootScope.globals = {};
-          $cookieStore.remove('globals');
-          $http.defaults.headers.common.Authorization = 'Basic ';
+          // sessionStorage.removeItem('globals');
+          sessionStorage.removeItem("auth.header");
+          sessionStorage.removeItem("auth.username");
+          sessionStorage.removeItem("auth.wwwAuthHeader");
+          $http.defaults.headers.common.Authorization = null;
+          console.log("Cleared stored auth data");
         };
 
         return service;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9012e40a/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
index 65be563..37768cf 100644
--- a/solr/webapp/web/partials/login.html
+++ b/solr/webapp/web/partials/login.html
@@ -15,12 +15,18 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 <div id="login">
-  <div class="col-xs-offset-2 col-xs-8">
-    <h1>Please log in</h1>
-    Basic Authentication 
+
+  <div class="col-xs-offset-2 col-xs-8" ng-show="authType === 'Basic'">
+    <h1>Basic Authentication</h1>     
     
+    <p>Type: {{authType}}</p>
+    <p>WWW-Header: {{wwwAuthHeader}}</p>
+    <p>Config: {{authConfig}}</p>
+    <p>Redirect: {{authLocation}}</p>
+    <p>LoggedinUser: {{authLoggedinUser}}</p>
+
     <div ng-show="error" class="alert alert-danger">{{error}}</div>
-    <form name="form" ng-submit="login()" role="form">
+    <form name="form" ng-submit="login()" role="form" ng-show="!isLoggedIn()">
         <div class="form-group">
             <label for="username">Username</label>
             <i class="fa fa-key"></i>
@@ -38,5 +44,24 @@ limitations under the License.
             <img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
         </div>
     </form>
+    <form name="logoutForm" ng-submit="logout()" role="form" ng-show="isLoggedIn()">
+        <div class="form-actions">
+            <button type="submit" class="btn btn-danger">Logout</button>
+        </div>
+    </form>
+    
+  </div>
+  
+  
+  <div class="col-xs-offset-2 col-xs-8" ng-show="authType === 'unknown'">
+    <h1>Authentication type not supported</h1>     
+    
+    <p>Type: {{authType}}</p>
+    <p>WWW-Header: {{wwwAuthHeader}}</p>
+    <p>Config: {{authConfig}}</p>
+    <p>Redirect: {{authLocation}}</p>
+    <p>LoggedinUser: {{authLoggedinUser}}</p>
+
+    You cannot use Solr's Admin UI for this operation. Please use another client that supports this type. 
   </div>
 </div>


[19/27] lucene-solr:solr7896-login-page: Merge branch 'master' into solr7896-login-page

Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9ee35061
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9ee35061
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9ee35061

Branch: refs/heads/solr7896-login-page
Commit: 9ee3506194f7109eb31220e2b4e3a2456afdf12d
Parents: ae8a7e3 98b057c
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Oct 5 11:22:36 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Oct 5 11:22:36 2018 +0200

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  10 +-
 .../benchmark/byTask/TestPerfTasksLogic.java    |   9 +-
 .../codecs/perfield/PerFieldPostingsFormat.java |  14 +-
 .../org/apache/lucene/index/MultiFields.java    |  68 +-----
 .../org/apache/lucene/util/QueryBuilder.java    |  10 +
 .../lucene/index/TestDirectoryReader.java       |  11 +-
 .../org/apache/lucene/index/TestDocCount.java   |   6 +-
 .../lucene/index/TestIndexWriterMaxDocs.java    |   5 +-
 .../index/TestParallelCompositeReader.java      |  27 +--
 .../apache/lucene/index/TestSegmentReader.java  |   4 +-
 .../lucene/index/TestStressIndexing2.java       |  26 +-
 .../org/apache/lucene/index/TestSumDocFreq.java |   7 +-
 .../apache/lucene/util/TestQueryBuilder.java    |  28 +++
 .../memory/TestMemoryIndexAgainstRAMDir.java    |   2 +-
 .../org/apache/lucene/misc/HighFreqTerms.java   |  20 +-
 .../index/BaseIndexFileFormatTestCase.java      |  22 +-
 .../org/apache/lucene/util/LuceneTestCase.java  |  67 +++--
 solr/CHANGES.txt                                |  43 ++++
 .../java/org/apache/solr/cloud/CloudUtil.java   |  48 +++-
 .../solr/cloud/api/collections/Assign.java      |   3 +-
 .../api/collections/CreateCollectionCmd.java    |   4 +-
 .../cloud/autoscaling/IndexSizeTrigger.java     |  34 ++-
 .../solr/handler/admin/CollectionsHandler.java  |  10 +-
 .../solr/index/SlowCompositeReaderWrapper.java  |  46 ++--
 .../apache/solr/update/SolrCmdDistributor.java  |   8 +-
 .../processor/DistributedUpdateProcessor.java   | 106 +++-----
 .../ParseDateFieldUpdateProcessorFactory.java   |  28 ++-
 .../org/apache/solr/cloud/CloudTestUtils.java   |   4 +-
 .../solr/cloud/CollectionsAPISolrJTest.java     | 138 ++++++++++-
 .../apache/solr/cloud/HttpPartitionTest.java    | 103 +-------
 .../apache/solr/cloud/MoveReplicaHDFSTest.java  |   6 +
 .../solr/cloud/ReplicationFactorTest.java       |  61 +++--
 .../org/apache/solr/cloud/TestCryptoKeys.java   |  13 +-
 .../solr/cloud/autoscaling/CapturedEvent.java   |   2 +-
 .../cloud/autoscaling/IndexSizeTriggerTest.java | 141 +++++++++++
 .../SearchRateTriggerIntegrationTest.java       |  19 +-
 .../cloud/autoscaling/sim/SimCloudManager.java  |   3 +-
 .../sim/SimClusterStateProvider.java            | 112 +++++----
 .../autoscaling/sim/SimSolrCloudTestCase.java   |   6 +-
 .../autoscaling/sim/TestSimLargeCluster.java    |   2 +-
 .../sim/TestSimTriggerIntegration.java          |  25 +-
 .../solr/cloud/cdcr/CdcrBidirectionalTest.java  |   1 +
 .../apache/solr/core/TestDynamicLoading.java    |  22 +-
 .../apache/solr/core/TestSolrConfigHandler.java | 175 +++++++-------
 .../apache/solr/handler/TestBlobHandler.java    |  45 ++--
 .../apache/solr/handler/TestConfigReload.java   |  19 +-
 .../handler/TestSolrConfigHandlerCloud.java     |   3 +-
 .../TestSolrConfigHandlerConcurrent.java        |  44 ++--
 .../index/TestSlowCompositeReaderWrapper.java   |  29 ++-
 .../solr/update/SolrCmdDistributorTest.java     |   4 +-
 .../test/org/apache/solr/util/TestUtils.java    |  73 +++++-
 solr/solr-ref-guide/src/collections-api.adoc    |  41 ++--
 .../src/performance-statistics-reference.adoc   |  12 +-
 .../src/solrcloud-autoscaling-triggers.adoc     |   6 +
 ...olrcloud-recoveries-and-write-tolerance.adoc |   6 +-
 .../client/solrj/cloud/autoscaling/Policy.java  |  27 ++-
 .../solrj/cloud/autoscaling/PolicyHelper.java   |  53 +++-
 .../solrj/cloud/autoscaling/Preference.java     |   8 +
 .../solrj/cloud/autoscaling/ReplicaCount.java   |  13 +-
 .../solrj/cloud/autoscaling/Suggester.java      |   6 +-
 .../solrj/cloud/autoscaling/Suggestion.java     |   7 +-
 .../solrj/impl/SolrClientNodeStateProvider.java |   2 +-
 .../org/apache/solr/client/solrj/io/Lang.java   |  10 +-
 .../solrj/io/eval/EnclosingDiskEvaluator.java   |  64 +++++
 .../solrj/io/eval/GetAmplitudeEvaluator.java    |  42 ++++
 .../io/eval/GetAngularFrequencyEvaluator.java   |  42 ++++
 .../solrj/io/eval/GetCenterEvaluator.java       |  52 ++++
 .../client/solrj/io/eval/GetPhaseEvaluator.java |  42 ++++
 .../solrj/io/eval/GetRadiusEvaluator.java       |  44 ++++
 .../io/eval/GetSupportPointsEvaluator.java      |  56 +++++
 .../solrj/io/eval/HarmonicFitEvaluator.java     |  11 +-
 .../solrj/io/eval/OscillateEvaluator.java       |  57 +++++
 .../client/solrj/request/UpdateRequest.java     |   4 +
 .../client/solrj/response/SolrResponseBase.java |  12 +-
 .../apache/solr/common/LinkedHashMapWriter.java |  60 +++++
 .../java/org/apache/solr/common/MapWriter.java  |  20 +-
 .../org/apache/solr/common/MapWriterMap.java    |  53 ++++
 .../solr/common/cloud/ClusterProperties.java    |  41 +++-
 .../apache/solr/common/cloud/DocCollection.java |   9 +
 .../apache/solr/common/cloud/ZkStateReader.java |   7 +-
 .../common/params/CollectionAdminParams.java    |   5 +
 .../solr/common/params/CollectionParams.java    |   2 +-
 .../java/org/apache/solr/common/util/Utils.java |  86 +++++--
 .../src/resources/apispec/cluster.Commands.json |  34 ++-
 .../solr/autoscaling/testAddMissingReplica.json | 123 ++++++++++
 .../solrj/cloud/autoscaling/TestPolicy.java     | 242 +++++++++++++++++++
 .../solrj/cloud/autoscaling/TestPolicy2.java    |  34 +++
 .../apache/solr/client/solrj/io/TestLang.java   |   6 +-
 .../solrj/io/stream/MathExpressionTest.java     |  85 ++++++-
 .../solr/BaseDistributedSearchTestCase.java     |   2 +
 .../cloud/AbstractFullDistribZkTestBase.java    |   1 -
 91 files changed, 2408 insertions(+), 735 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9ee35061/solr/CHANGES.txt
----------------------------------------------------------------------


[11/27] lucene-solr:solr7896-login-page: Merge branch 'master' into solr7896-login-page

Posted by ja...@apache.org.
Merge branch 'master' into solr7896-login-page


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/08f7e670
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/08f7e670
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/08f7e670

Branch: refs/heads/solr7896-login-page
Commit: 08f7e67090d0078d52f4f69425c281dd9356876f
Parents: d531b92 baf40d5
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Sep 24 14:00:40 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Sep 24 14:00:40 2018 +0200

----------------------------------------------------------------------
 dev-tools/doap/lucene.rdf                       |    7 +
 dev-tools/doap/solr.rdf                         |    9 +-
 dev-tools/idea/solr/core/src/java/solr-core.iml |    1 +
 dev-tools/scripts/buildAndPushRelease.py        |   79 +-
 dev-tools/scripts/smokeTestRelease.py           |   53 +-
 lucene/CHANGES.txt                              |  133 +-
 lucene/MIGRATE.txt                              |   47 +-
 .../analysis/core/LowerCaseTokenizer.java       |   72 -
 .../core/LowerCaseTokenizerFactory.java         |   75 -
 .../lucene/analysis/core/SimpleAnalyzer.java    |    4 +-
 .../lucene/analysis/core/StopAnalyzer.java      |    6 +-
 .../miscellaneous/LimitTokenCountAnalyzer.java  |    2 +-
 .../query/QueryAutoStopWordAnalyzer.java        |    2 +-
 .../shingle/ShingleAnalyzerWrapper.java         |    2 +-
 .../analysis/standard/ClassicAnalyzer.java      |   11 +-
 .../standard/UAX29URLEmailAnalyzer.java         |   13 +-
 .../lucene/analysis/util/CharTokenizer.java     |   86 +-
 .../apache/lucene/collation/package-info.java   |   21 +-
 ...apache.lucene.analysis.util.TokenizerFactory |    1 -
 .../analysis/br/TestBrazilianAnalyzer.java      |    7 +-
 .../lucene/analysis/core/TestAnalyzers.java     |    8 -
 .../analysis/custom/TestCustomAnalyzer.java     |   13 +-
 .../lucene/analysis/de/TestGermanAnalyzer.java  |    8 +-
 .../TestPerFieldAnalyzerWrapper.java            |    2 +-
 .../standard/TestStandardFactories.java         |   16 -
 .../analysis/util/TestCharTokenizers.java       |  122 +-
 lucene/analysis/icu/src/java/overview.html      |   21 +-
 .../ko/KoreanPartOfSpeechStopFilterFactory.java |   17 +-
 .../ko/KoreanReadingFormFilterFactory.java      |    8 +
 .../analysis/ko/KoreanTokenizerFactory.java     |   22 +
 .../lucene/analysis/ko/dict/UserDictionary.java |    6 +-
 .../lucene/codecs/lucene70/Lucene70Codec.java   |  133 ++
 .../apache/lucene/codecs/lucene70/package.html  |   25 +
 .../services/org.apache.lucene.codecs.Codec     |    1 +
 .../index/TestBackwardsCompatibility.java       |    7 +-
 .../org/apache/lucene/index/index.7.5.0-cfs.zip |  Bin 0 -> 15615 bytes
 .../apache/lucene/index/index.7.5.0-nocfs.zip   |  Bin 0 -> 15629 bytes
 .../org/apache/lucene/index/sorted.7.5.0.zip    |  Bin 0 -> 82239 bytes
 .../benchmark/byTask/tasks/CreateIndexTask.java |    4 +-
 lucene/build.xml                                |   15 +-
 .../codecs/simpletext/SimpleTextBKDWriter.java  |   18 +-
 lucene/common-build.xml                         |   33 +-
 .../org/apache/lucene/analysis/Analyzer.java    |   42 +-
 .../analysis/standard/StandardAnalyzer.java     |   13 +-
 .../java/org/apache/lucene/codecs/Codec.java    |    2 +-
 .../codecs/blocktree/BlockTreeTermsReader.java  |   10 -
 .../lucene/codecs/blocktree/FieldReader.java    |    3 +-
 .../codecs/blocktree/IntersectTermsEnum.java    |  220 +--
 .../blocktree/IntersectTermsEnumFrame.java      |   15 -
 .../codecs/blocktree/SegmentTermsEnum.java      |    5 +-
 .../apache/lucene/codecs/blocktree/Stats.java   |    2 -
 .../lucene/codecs/lucene70/Lucene70Codec.java   |  175 ---
 .../lucene/codecs/lucene80/Lucene80Codec.java   |  177 +++
 .../lucene/codecs/lucene80/package-info.java    |  409 ++++++
 .../java/org/apache/lucene/document/Field.java  |   30 +-
 .../org/apache/lucene/document/LatLonPoint.java |   24 +
 .../document/LatLonPointDistanceComparator.java |    7 +-
 .../LatLonPointDistanceFeatureQuery.java        |  480 +++++++
 .../document/LatLonPointDistanceQuery.java      |   42 +-
 .../document/LatLonPointInPolygonQuery.java     |   10 +-
 .../document/LongDistanceFeatureQuery.java      |  438 ++++++
 .../org/apache/lucene/document/LongPoint.java   |   26 +
 .../apache/lucene/document/RangeFieldQuery.java |   38 +-
 .../org/apache/lucene/document/StoredField.java |   23 +-
 .../org/apache/lucene/index/CheckIndex.java     |   92 +-
 .../apache/lucene/index/DocumentsWriter.java    |    9 +
 .../index/DocumentsWriterFlushControl.java      |    8 +-
 .../apache/lucene/index/FilterCodecReader.java  |   18 +-
 .../lucene/index/FilterDirectoryReader.java     |   16 +-
 .../apache/lucene/index/FilterLeafReader.java   |    2 +-
 .../lucene/index/FrozenBufferedUpdates.java     |   23 +-
 .../org/apache/lucene/index/IndexWriter.java    |    8 +
 .../org/apache/lucene/index/MultiFields.java    |   27 +-
 .../org/apache/lucene/index/PendingDeletes.java |   13 +-
 .../apache/lucene/index/PendingSoftDeletes.java |    7 +-
 .../org/apache/lucene/index/PointValues.java    |    6 +-
 .../apache/lucene/index/ReadersAndUpdates.java  |    3 +
 .../SoftDeletesDirectoryReaderWrapper.java      |   14 +
 .../index/SoftDeletesRetentionMergePolicy.java  |    2 +-
 .../java/org/apache/lucene/index/Sorter.java    |   27 -
 .../src/java/org/apache/lucene/index/Terms.java |    8 +-
 .../org/apache/lucene/index/package-info.java   |  278 ++--
 .../search/BlockMaxConjunctionScorer.java       |    9 +-
 .../lucene/search/Boolean2ScorerSupplier.java   |    6 +-
 .../org/apache/lucene/search/BooleanScorer.java |   18 +-
 .../org/apache/lucene/search/BooleanWeight.java |    6 +-
 .../apache/lucene/search/CachingCollector.java  |   20 +-
 .../apache/lucene/search/ConjunctionScorer.java |   10 +-
 .../lucene/search/ConstantScoreQuery.java       |   14 +-
 .../lucene/search/DisjunctionMaxQuery.java      |    2 +-
 .../apache/lucene/search/DisjunctionScorer.java |    6 +-
 .../lucene/search/DocValuesRewriteMethod.java   |    2 +-
 .../lucene/search/DoubleValuesSource.java       |    6 +-
 .../org/apache/lucene/search/FakeScorer.java    |   62 -
 .../apache/lucene/search/FieldComparator.java   |   10 +-
 .../lucene/search/FilterLeafCollector.java      |    2 +-
 .../lucene/search/FilterMatchesIterator.java    |   74 +
 .../apache/lucene/search/FilterScorable.java    |   58 +
 .../org/apache/lucene/search/LRUQueryCache.java |    4 +-
 .../org/apache/lucene/search/LeafCollector.java |    2 +-
 .../lucene/search/LeafFieldComparator.java      |    2 +-
 .../apache/lucene/search/LongValuesSource.java  |    2 +-
 .../apache/lucene/search/MatchAllDocsQuery.java |    2 +-
 .../java/org/apache/lucene/search/Matches.java  |   96 --
 .../org/apache/lucene/search/MatchesUtils.java  |  132 ++
 .../lucene/search/MaxScoreSumPropagator.java    |  102 +-
 .../lucene/search/MinShouldMatchSumScorer.java  |    6 +-
 .../apache/lucene/search/MultiCollector.java    |    9 +-
 .../lucene/search/MultiCollectorManager.java    |    6 +-
 .../lucene/search/MultiLeafFieldComparator.java |    2 +-
 .../MultiTermQueryConstantScoreWrapper.java     |    2 +-
 .../org/apache/lucene/search/PhraseWeight.java  |    2 +-
 .../apache/lucene/search/PointInSetQuery.java   |    6 +-
 .../apache/lucene/search/PointRangeQuery.java   |   30 +-
 .../search/PositiveScoresOnlyCollector.java     |    4 +-
 .../org/apache/lucene/search/ReqExclScorer.java |    6 +-
 .../apache/lucene/search/ReqOptSumScorer.java   |  191 ++-
 .../java/org/apache/lucene/search/Scorable.java |   86 ++
 .../org/apache/lucene/search/ScoreAndDoc.java   |   35 +
 .../search/ScoreCachingWrappingScorer.java      |   24 +-
 .../java/org/apache/lucene/search/Scorer.java   |   77 +-
 .../apache/lucene/search/SimpleCollector.java   |    2 +-
 .../lucene/search/SimpleFieldComparator.java    |    2 +-
 .../org/apache/lucene/search/SortRescorer.java  |   10 +-
 .../org/apache/lucene/search/SynonymQuery.java  |    2 +-
 .../apache/lucene/search/TermInSetQuery.java    |    2 +-
 .../org/apache/lucene/search/TermQuery.java     |    4 +-
 .../apache/lucene/search/TermRangeQuery.java    |    4 +
 .../apache/lucene/search/TopFieldCollector.java |   45 +-
 .../lucene/search/TopScoreDocCollector.java     |    8 +-
 .../org/apache/lucene/search/WANDScorer.java    |    9 +-
 .../java/org/apache/lucene/search/Weight.java   |    4 +-
 .../org/apache/lucene/search/package-info.java  |  127 +-
 .../search/similarities/package-info.java       |   52 +-
 .../apache/lucene/search/spans/SpanWeight.java  |    3 +-
 .../lucene/store/ByteArrayIndexInput.java       |  107 +-
 .../lucene/store/ByteBuffersDataInput.java      |  323 +++++
 .../lucene/store/ByteBuffersDataOutput.java     |  541 +++++++
 .../lucene/store/ByteBuffersDirectory.java      |  274 ++++
 .../lucene/store/ByteBuffersIndexInput.java     |  200 +++
 .../lucene/store/ByteBuffersIndexOutput.java    |  171 +++
 .../org/apache/lucene/store/RAMDirectory.java   |    5 +
 .../java/org/apache/lucene/store/RAMFile.java   |    8 +-
 .../org/apache/lucene/store/RAMInputStream.java |   12 +-
 .../apache/lucene/store/RAMOutputStream.java    |    4 +
 .../apache/lucene/util/RamUsageEstimator.java   |   51 +-
 .../org/apache/lucene/util/StringHelper.java    |   11 -
 .../java/org/apache/lucene/util/Version.java    |    7 +
 .../org/apache/lucene/util/bkd/BKDReader.java   |   70 +-
 .../org/apache/lucene/util/bkd/BKDWriter.java   |   76 +-
 .../util/bkd/MutablePointsReaderUtils.java      |    8 +-
 .../org/apache/lucene/util/packed/Direct16.java |    2 +-
 .../org/apache/lucene/util/packed/Direct32.java |    2 +-
 .../org/apache/lucene/util/packed/Direct64.java |    2 +-
 .../org/apache/lucene/util/packed/Direct8.java  |    2 +-
 .../lucene/util/packed/Packed16ThreeBlocks.java |    2 +-
 .../lucene/util/packed/Packed64SingleBlock.java |    2 +-
 .../lucene/util/packed/Packed8ThreeBlocks.java  |    2 +-
 lucene/core/src/java/overview.html              |   25 +-
 .../services/org.apache.lucene.codecs.Codec     |    2 +-
 .../src/test/org/apache/lucene/TestDemo.java    |   69 +-
 .../lucene/analysis/TestAnalyzerWrapper.java    |   58 +
 ...cene50StoredFieldsFormatHighCompression.java |    8 +-
 .../lucene60/TestLucene60PointsFormat.java      |   10 +-
 .../lucene70/TestLucene70NormsFormat.java       |    4 +-
 .../TestLatLonPointDistanceFeatureQuery.java    |  411 ++++++
 .../document/TestLongDistanceFeatureQuery.java  |  350 +++++
 .../org/apache/lucene/index/Test2BPoints.java   |    2 +-
 .../org/apache/lucene/index/TestAddIndexes.java |    2 +
 .../lucene/index/TestFilterCodecReader.java     |   18 +
 .../index/TestFlushByRamOrCountsPolicy.java     |   14 +-
 .../apache/lucene/index/TestIndexSorting.java   |   60 +
 .../org/apache/lucene/index/TestOmitTf.java     |   18 +-
 .../lucene/index/TestPendingSoftDeletes.java    |    8 +-
 .../apache/lucene/index/TestPointValues.java    |    8 +-
 .../TestSoftDeletesDirectoryReaderWrapper.java  |   51 +
 .../TestSoftDeletesRetentionMergePolicy.java    |  121 +-
 .../apache/lucene/search/JustCompileSearch.java |    2 +-
 .../lucene/search/MultiCollectorTest.java       |   28 +-
 .../org/apache/lucene/search/TestBoolean2.java  |    8 +-
 .../search/TestBoolean2ScorerSupplier.java      |   80 +-
 .../org/apache/lucene/search/TestBooleanOr.java |    4 +-
 .../apache/lucene/search/TestBooleanQuery.java  |    4 +-
 .../search/TestBooleanQueryVisitSubscorers.java |   19 +-
 .../apache/lucene/search/TestBooleanScorer.java |    2 +-
 .../lucene/search/TestCachingCollector.java     |   23 +-
 .../lucene/search/TestConjunctionDISI.java      |   50 +-
 .../apache/lucene/search/TestConjunctions.java  |    8 +-
 .../lucene/search/TestConstantScoreQuery.java   |   30 +-
 .../lucene/search/TestDoubleValuesSource.java   |    6 +-
 .../lucene/search/TestElevationComparator.java  |    2 +-
 .../search/TestMaxScoreSumPropagator.java       |  230 +++
 .../lucene/search/TestMultiCollector.java       |   22 +-
 .../apache/lucene/search/TestPointQueries.java  |   14 +-
 .../apache/lucene/search/TestQueryRescorer.java |    2 +-
 .../lucene/search/TestReqExclBulkScorer.java    |    4 +-
 .../lucene/search/TestReqOptSumScorer.java      |  241 +++-
 .../search/TestScoreCachingWrappingScorer.java  |    4 +-
 .../apache/lucene/search/TestSimilarity.java    |   16 +-
 .../lucene/search/TestSloppyPhraseQuery.java    |   14 +-
 .../lucene/search/TestSubScorerFreqs.java       |   22 +-
 .../apache/lucene/search/TestTermScorer.java    |    4 +-
 .../search/TestTimeLimitingCollector.java       |    2 +-
 .../lucene/search/TestTopDocsCollector.java     |   24 +-
 .../lucene/search/TestTopFieldCollector.java    |   21 +-
 .../lucene/store/BaseDataOutputTestCase.java    |  181 +++
 .../lucene/store/TestByteBuffersDataInput.java  |  206 +++
 .../lucene/store/TestByteBuffersDataOutput.java |  157 +++
 .../lucene/store/TestByteBuffersDirectory.java  |   86 ++
 .../org/apache/lucene/util/bkd/TestBKD.java     |   24 +-
 .../util/bkd/TestMutablePointsReaderUtils.java  |   10 +-
 .../apache/lucene/expressions/FakeScorer.java   |   53 -
 .../lucene/facet/DrillSidewaysScorer.java       |   28 +-
 .../apache/lucene/facet/FacetsCollector.java    |    6 +-
 .../facet/taxonomy/SearcherTaxonomyManager.java |   14 +
 .../directory/DirectoryTaxonomyReader.java      |    8 +-
 .../taxonomy/directory/TaxonomyIndexArrays.java |    2 +-
 .../facet/AssertingSubDocsAtOnceCollector.java  |   11 +-
 .../taxonomy/TestSearcherTaxonomyManager.java   |   14 +
 .../search/grouping/AllGroupHeadsCollector.java |   24 +-
 .../search/grouping/AllGroupsCollector.java     |    4 +-
 .../search/grouping/BlockGroupingCollector.java |   24 +-
 .../lucene/search/grouping/FakeScorer.java      |   52 -
 .../grouping/FirstPassGroupingCollector.java    |    4 +-
 .../search/grouping/GroupFacetCollector.java    |    4 +-
 .../lucene/search/grouping/GroupReducer.java    |    4 +-
 .../grouping/SecondPassGroupingCollector.java   |    4 +-
 .../search/grouping/TopGroupsCollector.java     |    6 +-
 .../uhighlight/AnalysisOffsetStrategy.java      |   16 +-
 .../uhighlight/DefaultPassageFormatter.java     |   25 +-
 .../search/uhighlight/FieldHighlighter.java     |    5 +-
 .../search/uhighlight/FieldOffsetStrategy.java  |  121 +-
 .../uhighlight/MemoryIndexOffsetStrategy.java   |   51 +-
 .../search/uhighlight/NoOpOffsetStrategy.java   |    8 +-
 .../lucene/search/uhighlight/OffsetsEnum.java   |  220 ++-
 .../OverlaySingleDocTermsLeafReader.java        |  113 ++
 .../lucene/search/uhighlight/Passage.java       |   11 +-
 .../uhighlight/PostingsOffsetStrategy.java      |   24 +-
 .../PostingsWithTermVectorsOffsetStrategy.java  |   26 +-
 .../TermVectorFilteredLeafReader.java           |   11 +-
 .../uhighlight/TermVectorOffsetStrategy.java    |   23 +-
 .../uhighlight/TokenStreamOffsetStrategy.java   |   20 +-
 .../lucene/search/uhighlight/UHComponents.java  |   80 ++
 .../search/uhighlight/UnifiedHighlighter.java   |   73 +-
 .../search/vectorhighlight/FieldTermStack.java  |   11 +-
 .../search/highlight/HighlighterPhraseTest.java |    5 +-
 .../uhighlight/TestUnifiedHighlighter.java      |  154 +-
 .../uhighlight/TestUnifiedHighlighterMTQ.java   |    2 +-
 .../TestUnifiedHighlighterRanking.java          |   20 +
 .../TestUnifiedHighlighterStrictPhrases.java    |  146 +-
 .../TestUnifiedHighlighterTermVec.java          |   34 +-
 .../TestUnifiedHighlighterExtensibility.java    |   36 +-
 lucene/ivy-versions.properties                  |    4 +-
 .../apache/lucene/search/join/FakeScorer.java   |   52 -
 .../search/join/GlobalOrdinalsCollector.java    |    6 +-
 .../join/GlobalOrdinalsWithScoreCollector.java  |   14 +-
 .../org/apache/lucene/search/join/JoinUtil.java |   10 +-
 .../search/join/TermsWithScoreCollector.java    |    6 +-
 .../search/join/ToChildBlockJoinQuery.java      |    4 +-
 .../search/join/ToParentBlockJoinQuery.java     |    7 +-
 .../apache/lucene/search/join/TestJoinUtil.java |   10 +-
 .../licenses/commons-compress-1.16.1.jar.sha1   |    1 -
 lucene/licenses/commons-compress-1.18.jar.sha1  |    1 +
 .../randomizedtesting-runner-2.6.0.jar.sha1     |    1 -
 .../randomizedtesting-runner-2.6.4.jar.sha1     |    1 +
 .../apache/lucene/index/memory/MemoryIndex.java |   12 +-
 .../lucene/document/InetAddressPoint.java       |    4 +-
 .../lucene/document/InetAddressRange.java       |    4 +-
 .../search/DiversifiedTopDocsCollector.java     |    4 +-
 .../lucene/search/DocValuesStatsCollector.java  |    4 +-
 .../search/TestInetAddressRangeQueries.java     |   22 +-
 .../queries/function/FunctionRangeQuery.java    |    4 +-
 .../lucene/queries/function/FunctionValues.java |   15 +-
 .../lucene/queries/function/ValueSource.java    |   26 +-
 .../queries/function/ValueSourceScorer.java     |    8 +-
 .../docvalues/DocTermsIndexDocValues.java       |    5 +-
 .../function/docvalues/DoubleDocValues.java     |   11 +-
 .../function/docvalues/IntDocValues.java        |    5 +-
 .../function/docvalues/LongDocValues.java       |    5 +-
 .../function/valuesource/EnumFieldSource.java   |    5 +-
 .../function/valuesource/MultiFunction.java     |    4 +-
 .../surround/query/BooleanQueryTst.java         |   10 +-
 .../document/FloatPointNearestNeighbor.java     |    2 +-
 .../org/apache/lucene/document/LatLonShape.java |   13 +-
 .../document/LatLonShapeBoundingBoxQuery.java   |  420 ++----
 .../document/LatLonShapePolygonQuery.java       |  301 +---
 .../lucene/document/LatLonShapeQuery.java       |  394 ++++++
 .../java/org/apache/lucene/geo/Tessellator.java |  101 +-
 .../org/apache/lucene/search/CoveringQuery.java |    2 +-
 .../apache/lucene/search/CoveringScorer.java    |    6 +-
 .../apache/lucene/search/NearestNeighbor.java   |    2 +-
 .../intervals/ConjunctionIntervalsSource.java   |  113 +-
 .../intervals/DifferenceIntervalsSource.java    |   23 +-
 .../intervals/DisjunctionIntervalsSource.java   |   14 +
 .../lucene/search/intervals/IntervalFilter.java |    2 +-
 .../search/intervals/IntervalFunction.java      |    4 +-
 .../search/intervals/IntervalIterator.java      |    5 +
 .../search/intervals/IntervalMatches.java       |  156 +++
 .../lucene/search/intervals/IntervalQuery.java  |   20 +
 .../lucene/search/intervals/Intervals.java      |    4 +-
 .../search/intervals/IntervalsSource.java       |   13 +
 .../intervals/LowpassIntervalsSource.java       |   16 +
 .../MinimizingConjunctionIntervalsSource.java   |  236 ++++
 .../search/intervals/TermIntervalsSource.java   |   66 +
 .../document/BaseLatLonShapeTestCase.java       |   46 +-
 .../document/TestFloatPointNearestNeighbor.java |    2 +-
 .../lucene/document/TestHalfFloatPoint.java     |    4 +-
 .../document/TestLatLonLineShapeQueries.java    |   40 +-
 .../document/TestLatLonPointShapeQueries.java   |   20 +-
 .../document/TestLatLonPolygonShapeQueries.java |   38 +-
 .../apache/lucene/document/TestLatLonShape.java |   26 +-
 .../org/apache/lucene/geo/TestTessellator.java  |   22 +
 .../org/apache/lucene/search/TestNearest.java   |    2 +-
 .../lucene/search/intervals/TestIntervals.java  |  232 ++-
 .../prefix/BytesRefIteratorTokenStream.java     |    2 +-
 .../spatial/prefix/PrefixTreeStrategy.java      |   17 +
 .../Geo3dShapeWGS84ModelRectRelationTest.java   |    2 +-
 .../spatial3d/Geo3DPointDistanceComparator.java |    4 +-
 .../Geo3DPointOutsideDistanceComparator.java    |    4 +-
 .../spatial3d/geom/GeoComplexPolygon.java       |  115 +-
 .../spatial3d/geom/GeoLongitudeSlice.java       |   17 +-
 .../spatial3d/geom/GeoNorthRectangle.java       |   18 +-
 .../spatial3d/geom/GeoPolygonFactory.java       |   48 +-
 .../lucene/spatial3d/geom/GeoRectangle.java     |   12 +-
 .../spatial3d/geom/GeoSouthRectangle.java       |   16 +-
 .../lucene/spatial3d/geom/SidedPlane.java       |   16 +
 .../apache/lucene/spatial3d/TestGeo3DPoint.java |   10 +-
 .../lucene/spatial3d/geom/GeoPolygonTest.java   |   40 +
 .../lucene/spatial3d/geom/XYZSolidTest.java     |   19 +
 .../analyzing/AnalyzingInfixSuggester.java      |    2 +-
 .../analyzing/BlendedInfixSuggester.java        |    7 +-
 .../suggest/analyzing/FreeTextSuggester.java    |    2 +-
 .../suggest/document/CompletionAnalyzer.java    |    2 +-
 .../document/TopSuggestDocsCollector.java       |    2 +-
 .../analyzing/AnalyzingSuggesterTest.java       |  365 ++---
 .../analyzing/BlendedInfixSuggesterTest.java    |   73 +-
 .../suggest/analyzing/FuzzySuggesterTest.java   |  159 +--
 .../suggest/document/TestSuggestField.java      |    4 +-
 .../analysis/CannedBinaryTokenStream.java       |    2 +-
 .../lucene/analysis/CannedTokenStream.java      |    8 +-
 .../apache/lucene/geo/BaseGeoPointTestCase.java |    2 +-
 .../lucene/index/AssertingLeafReader.java       |   10 +-
 .../lucene/index/BasePointsFormatTestCase.java  |   28 +-
 .../apache/lucene/index/PointsStackTracker.java |    6 +-
 .../lucene/search/AssertingBulkScorer.java      |    4 +-
 .../lucene/search/AssertingCollector.java       |   11 +-
 .../lucene/search/AssertingIndexSearcher.java   |    2 +-
 .../lucene/search/AssertingLeafCollector.java   |   13 +-
 .../apache/lucene/search/AssertingScorable.java |   64 +
 .../apache/lucene/search/AssertingScorer.java   |    6 +-
 .../lucene/search/BulkScorerWrapperScorer.java  |    4 +-
 .../org/apache/lucene/search/CheckHits.java     |    6 +-
 .../org/apache/lucene/search/QueryUtils.java    |   14 +-
 .../lucene/search/RandomApproximationQuery.java |   10 +-
 .../org/apache/lucene/util/LuceneTestCase.java  |    2 +
 .../util/TestRuleSetupAndRestoreClassEnv.java   |   30 +-
 .../java/org/apache/lucene/util/TestUtil.java   |    4 +-
 .../src/groovy/check-source-patterns.groovy     |    9 +-
 solr/CHANGES.txt                                |  230 ++-
 solr/bin/solr.cmd                               |    4 +-
 solr/build.xml                                  |   12 +-
 solr/common-build.xml                           |    6 +-
 .../stream/AnalyticsShardRequestManager.java    |    2 +-
 .../handler/dataimport/MailEntityProcessor.java |   74 +-
 .../handler/dataimport/BinURLDataSource.java    |   10 +-
 .../handler/dataimport/DataImportHandler.java   |    6 +-
 .../solr/handler/dataimport/DataImporter.java   |   24 +-
 .../dataimport/DateFormatTransformer.java       |    4 +-
 .../solr/handler/dataimport/DocBuilder.java     |   34 +-
 .../dataimport/FieldReaderDataSource.java       |    6 +-
 .../dataimport/FieldStreamDataSource.java       |    4 +-
 .../solr/handler/dataimport/FileDataSource.java |    8 +-
 .../solr/handler/dataimport/JdbcDataSource.java |   20 +-
 .../solr/handler/dataimport/LogTransformer.java |   22 +-
 .../handler/dataimport/RegexTransformer.java    |    4 +-
 .../handler/dataimport/SolrEntityProcessor.java |    6 +-
 .../handler/dataimport/SqlEntityProcessor.java  |    8 +-
 .../handler/dataimport/TemplateTransformer.java |    4 +-
 .../solr/handler/dataimport/URLDataSource.java  |   10 +-
 .../dataimport/XPathEntityProcessor.java        |   24 +-
 .../handler/dataimport/XPathRecordReader.java   |    6 +-
 .../dataimport/config/DIHConfiguration.java     |    6 +-
 .../TestSolrEntityProcessorEndToEnd.java        |   20 +-
 .../extraction/solr/collection1/conf/schema.xml |   15 -
 .../solr/collection1/conf/solrconfig.xml        |   19 +
 .../ExtractingRequestHandlerTest.java           |   10 +-
 .../org/apache/solr/ltr/LTRScoringQuery.java    |   14 +-
 .../org/apache/solr/ltr/TestLTROnSolrCloud.java |    3 +-
 .../solr/ltr/TestLTRReRankingPipeline.java      |    6 +-
 solr/core/ivy.xml                               |    2 +-
 .../client/solrj/embedded/JettySolrRunner.java  |    6 +-
 .../org/apache/solr/cloud/ActionThrottle.java   |    2 +-
 .../java/org/apache/solr/cloud/LockTree.java    |    6 +-
 .../java/org/apache/solr/cloud/Overseer.java    |    5 +
 .../cloud/OverseerConfigSetMessageHandler.java  |   30 +-
 .../solr/cloud/OverseerTaskProcessor.java       |    5 +
 .../apache/solr/cloud/OverseerTaskQueue.java    |   14 +-
 .../org/apache/solr/cloud/RecoveryStrategy.java |  172 +--
 .../apache/solr/cloud/ReplicateFromLeader.java  |    6 +-
 .../org/apache/solr/cloud/SolrZkServer.java     |    4 +-
 .../apache/solr/cloud/ZkDistributedQueue.java   |    6 +-
 .../cloud/api/collections/AddReplicaCmd.java    |  334 +++--
 .../solr/cloud/api/collections/Assign.java      |   56 +-
 .../solr/cloud/api/collections/BackupCmd.java   |    2 +-
 .../api/collections/CreateCollectionCmd.java    |   23 +-
 .../cloud/api/collections/CreateShardCmd.java   |  157 +--
 .../cloud/api/collections/DeleteNodeCmd.java    |    4 -
 .../api/collections/MaintainRoutedAliasCmd.java |    7 +-
 .../cloud/api/collections/MoveReplicaCmd.java   |   15 +-
 .../OverseerCollectionMessageHandler.java       |    2 +-
 .../cloud/api/collections/ReplaceNodeCmd.java   |    2 +-
 .../cloud/api/collections/TimeRoutedAlias.java  |   19 +
 .../autoscaling/AutoAddReplicasPlanAction.java  |    2 +-
 .../cloud/autoscaling/AutoScalingHandler.java   |   13 +-
 .../cloud/autoscaling/ComputePlanAction.java    |   82 +-
 .../cloud/autoscaling/HttpTriggerListener.java  |    4 +-
 .../cloud/autoscaling/IndexSizeTrigger.java     |    3 +
 .../solr/cloud/autoscaling/LoggingListener.java |    4 +-
 .../cloud/autoscaling/NodeAddedTrigger.java     |   30 +-
 .../solr/cloud/autoscaling/NodeLostTrigger.java |   31 +-
 .../cloud/autoscaling/ScheduledTriggers.java    |    7 +-
 .../cloud/autoscaling/SearchRateTrigger.java    |  173 ++-
 .../autoscaling/TriggerActionException.java     |   33 +
 .../solr/cloud/autoscaling/TriggerBase.java     |    8 +-
 .../solr/cloud/autoscaling/TriggerEvent.java    |   81 +-
 .../cloud/autoscaling/TriggerEventQueue.java    |   24 +-
 .../apache/solr/core/HdfsDirectoryFactory.java  |   50 +-
 .../solr/core/IndexDeletionPolicyWrapper.java   |    4 +-
 .../apache/solr/core/SchemaCodecFactory.java    |    4 +-
 .../src/java/org/apache/solr/core/SolrCore.java |    4 +-
 .../org/apache/solr/core/SolrXmlConfig.java     |    9 +-
 .../repository/BackupRepositoryFactory.java     |    6 +-
 .../solr/handler/HaversineMetersEvaluator.java  |   59 +
 .../org/apache/solr/handler/IndexFetcher.java   |  142 +-
 .../apache/solr/handler/ReplicationHandler.java |   68 +-
 .../org/apache/solr/handler/SnapShooter.java    |   16 +-
 .../solr/handler/SolrDefaultStreamFactory.java  |    1 +
 .../org/apache/solr/handler/StreamHandler.java  |    4 +
 .../admin/AutoscalingHistoryHandler.java        |    4 +-
 .../apache/solr/handler/admin/BackupCoreOp.java |    4 +-
 .../solr/handler/admin/CollectionsHandler.java  |    9 +-
 .../solr/handler/admin/ConfigSetsHandler.java   |   20 +-
 .../handler/admin/MetricsHistoryHandler.java    |    8 +-
 .../solr/handler/component/ExpandComponent.java |    6 +-
 .../component/HttpShardHandlerFactory.java      |    8 +-
 .../PhrasesIdentificationComponent.java         | 1129 +++++++++++++++
 .../solr/handler/component/QueryComponent.java  |   35 +-
 .../handler/component/SpellCheckComponent.java  |   24 +-
 .../solr/handler/component/StatsField.java      |    4 +-
 .../handler/component/SuggestComponent.java     |   26 +-
 .../handler/component/TermVectorComponent.java  |   41 +-
 .../solr/handler/export/BoolFieldWriter.java    |   23 +-
 .../solr/handler/export/DateFieldWriter.java    |   22 +-
 .../solr/handler/export/DoubleFieldWriter.java  |   27 +-
 .../apache/solr/handler/export/DoubleValue.java |   20 +
 .../solr/handler/export/DoubleValueSortDoc.java |  102 ++
 .../solr/handler/export/ExportWriter.java       |   15 +-
 .../apache/solr/handler/export/FieldWriter.java |    2 +-
 .../solr/handler/export/FloatFieldWriter.java   |   27 +-
 .../apache/solr/handler/export/FloatValue.java  |   20 +
 .../solr/handler/export/IntFieldWriter.java     |   22 +-
 .../apache/solr/handler/export/IntValue.java    |   25 +-
 .../solr/handler/export/LongFieldWriter.java    |   20 +-
 .../apache/solr/handler/export/LongValue.java   |   20 +
 .../solr/handler/export/MultiFieldWriter.java   |    6 +-
 .../solr/handler/export/QuadValueSortDoc.java   |  139 ++
 .../solr/handler/export/SingleValueSortDoc.java |   89 ++
 .../org/apache/solr/handler/export/SortDoc.java |   17 +-
 .../apache/solr/handler/export/SortValue.java   |    8 +
 .../solr/handler/export/StringFieldWriter.java  |   24 +-
 .../apache/solr/handler/export/StringValue.java |   24 +-
 .../solr/handler/export/TripleValueSortDoc.java |  121 ++
 .../org/apache/solr/handler/sql/SolrSchema.java |    4 +
 .../metrics/reporters/ReporterClientCache.java  |    6 +-
 .../reporters/jmx/JmxMetricsReporter.java       |   68 +-
 .../reporters/solr/SolrShardReporter.java       |    2 +-
 .../org/apache/solr/request/SimpleFacets.java   |    4 +-
 .../solr/response/BinaryResponseWriter.java     |    4 +-
 .../org/apache/solr/response/DocsStreamer.java  |   26 +-
 .../solr/response/RetrieveFieldsOptimizer.java  |  130 --
 .../response/transform/ChildDocTransformer.java |  253 ++++
 .../transform/ChildDocTransformerFactory.java   |  211 ++-
 .../solr/response/transform/DocTransformer.java |   23 +
 .../transform/RawValueTransformerFactory.java   |   20 +-
 .../AbstractSpatialPrefixTreeFieldType.java     |   35 +-
 .../apache/solr/schema/CurrencyFieldType.java   |    8 +-
 .../java/org/apache/solr/schema/FieldType.java  |    4 +-
 .../org/apache/solr/schema/IndexSchema.java     |    2 +-
 .../solr/schema/JsonPreAnalyzedParser.java      |   12 +-
 .../apache/solr/schema/ManagedIndexSchema.java  |    4 +-
 .../apache/solr/schema/PreAnalyzedField.java    |   27 +-
 .../solr/search/CollapsingQParserPlugin.java    |   64 +-
 .../apache/solr/search/DelegatingCollector.java |    8 +-
 .../org/apache/solr/search/DocSetCollector.java |    4 +-
 .../apache/solr/search/ExportQParserPlugin.java |    4 +-
 .../src/java/org/apache/solr/search/Filter.java |    2 +-
 .../apache/solr/search/FunctionRangeQuery.java  |   12 +-
 .../solr/search/GraphTermsQParserPlugin.java    |    6 +-
 .../apache/solr/search/HashQParserPlugin.java   |   30 +-
 .../apache/solr/search/MaxScoreCollector.java   |    6 +-
 .../apache/solr/search/SolrDocumentFetcher.java |  198 ++-
 .../apache/solr/search/SolrIndexSearcher.java   |    8 +-
 .../apache/solr/search/SolrReturnFields.java    |   31 +
 .../solr/search/SurroundQParserPlugin.java      |    2 +-
 .../search/function/ValueSourceRangeFilter.java |    9 +-
 .../search/join/ScoreJoinQParserPlugin.java     |    2 +-
 .../search/stats/ExactSharedStatsCache.java     |    6 +-
 .../solr/search/stats/ExactStatsCache.java      |   28 +-
 .../apache/solr/search/stats/LRUStatsCache.java |   10 +-
 .../solr/search/stats/LocalStatsCache.java      |   18 +-
 .../org/apache/solr/search/stats/StatsUtil.java |   22 +-
 .../solr/servlet/CheckLoggingConfiguration.java |    4 +-
 .../org/apache/solr/servlet/HttpSolrCall.java   |   35 +-
 .../solr/spelling/DirectSolrSpellChecker.java   |    6 +-
 .../solr/spelling/SpellCheckCollator.java       |   10 +-
 .../solr/spelling/suggest/SolrSuggester.java    |   34 +-
 .../apache/solr/spelling/suggest/Suggester.java |   26 +-
 .../suggest/jaspell/JaspellLookupFactory.java   |    4 +-
 .../solr/store/blockcache/BlockDirectory.java   |    8 +-
 .../apache/solr/store/hdfs/HdfsDirectory.java   |   16 +-
 .../org/apache/solr/update/CommitTracker.java   |   13 +-
 .../java/org/apache/solr/update/PeerSync.java   |    2 +-
 .../apache/solr/update/PeerSyncWithLeader.java  |    6 +-
 .../apache/solr/update/SolrCmdDistributor.java  |   50 +-
 .../apache/solr/update/UpdateShardHandler.java  |    4 +-
 .../solr/update/UpdateShardHandlerConfig.java   |   10 +-
 .../AddSchemaFieldsUpdateProcessorFactory.java  |   36 +-
 .../processor/AtomicUpdateDocumentMerger.java   |    4 +-
 .../CloneFieldUpdateProcessorFactory.java       |    4 +-
 .../processor/DistributedUpdateProcessor.java   |    6 +-
 .../DistributedUpdateProcessorFactory.java      |    2 +-
 .../DocExpirationUpdateProcessorFactory.java    |    9 +-
 .../ParseDateFieldUpdateProcessorFactory.java   |   36 +-
 .../TimeRoutedAliasUpdateProcessor.java         |  362 +++--
 .../TolerantUpdateProcessorFactory.java         |    2 +-
 .../org/apache/solr/util/stats/MetricUtils.java |    6 +-
 .../collection1/conf/schema-copyfield-test.xml  |   14 -
 .../solr/collection1/conf/schema-folding.xml    |    3 +-
 .../solr/collection1/conf/schema-hash.xml       |   13 -
 .../solr/collection1/conf/schema-nest.xml       |   65 +
 .../conf/schema-phrases-identification.xml      |   97 ++
 .../collection1/conf/schema-required-fields.xml |   14 -
 .../solr/collection1/conf/schema-rest.xml       |    9 +-
 .../solr/collection1/conf/schema-sql.xml        |   40 +-
 .../collection1/conf/schema-tokenizer-test.xml  |   11 +-
 .../test-files/solr/collection1/conf/schema.xml |   15 +-
 .../solr/collection1/conf/schema12.xml          |    9 +-
 .../solr/collection1/conf/schema15.xml          |   17 -
 .../solr/collection1/conf/schemasurround.xml    |   14 -
 ...dd-schema-fields-update-processor-chains.xml |    8 +-
 ...lrconfig-parsing-update-processor-chains.xml |   20 +-
 .../conf/solrconfig-phrases-identification.xml  |   53 +
 .../collection1/conf/solrconfig-schemaless.xml  |    8 +-
 .../conf/solrconfig-update-processor-chains.xml |    2 +-
 .../configsets/_default/conf/managed-schema     |   34 +
 .../configsets/_default/conf/solrconfig.xml     |    8 +-
 .../org/apache/solr/BasicFunctionalityTest.java |  160 +--
 .../test/org/apache/solr/CursorPagingTest.java  |   10 +-
 .../solr/TestCursorMarkWithoutUniqueKey.java    |    9 +-
 .../org/apache/solr/TestDistributedSearch.java  |   47 +-
 .../org/apache/solr/TestTolerantSearch.java     |   18 +-
 .../apache/solr/cloud/ActionThrottleTest.java   |    2 +-
 .../org/apache/solr/cloud/AddReplicaTest.java   |   90 +-
 .../cloud/AssignBackwardCompatibilityTest.java  |    1 +
 .../solr/cloud/BasicDistributedZk2Test.java     |   30 +-
 .../solr/cloud/BasicDistributedZkTest.java      |   19 +-
 .../test/org/apache/solr/cloud/BasicZkTest.java |   14 +-
 .../org/apache/solr/cloud/CloudTestUtils.java   |   29 +-
 .../solr/cloud/CollectionsAPISolrJTest.java     |   46 +-
 .../apache/solr/cloud/DeleteReplicaTest.java    |   28 +-
 .../org/apache/solr/cloud/DeleteShardTest.java  |    1 +
 .../solr/cloud/DistribCursorPagingTest.java     |    1 +
 .../solr/cloud/DocValuesNotIndexedTest.java     |    3 +-
 .../org/apache/solr/cloud/ForceLeaderTest.java  |   10 +-
 .../cloud/FullSolrCloudDistribCmdsTest.java     |    3 +-
 .../solr/cloud/LIROnShardRestartTest.java       |    4 +-
 .../solr/cloud/LIRRollingUpdatesTest.java       |    7 +-
 .../cloud/LeaderElectionIntegrationTest.java    |    3 +-
 .../solr/cloud/LeaderVoteWaitTimeoutTest.java   |   19 +-
 .../solr/cloud/LegacyCloudClusterPropTest.java  |    1 +
 .../apache/solr/cloud/MoveReplicaHDFSTest.java  |    6 +-
 .../org/apache/solr/cloud/MoveReplicaTest.java  |   17 +-
 .../apache/solr/cloud/MultiThreadedOCPTest.java |    1 +
 .../apache/solr/cloud/OverseerRolesTest.java    |    1 +
 .../apache/solr/cloud/OverseerStatusTest.java   |   17 +-
 .../solr/cloud/SaslZkACLProviderTest.java       |    3 +-
 .../cloud/SharedFSAutoReplicaFailoverTest.java  |    2 +-
 .../org/apache/solr/cloud/SolrXmlInZkTest.java  |   10 +-
 .../solr/cloud/TestAuthenticationFramework.java |   10 +-
 .../apache/solr/cloud/TestCloudConsistency.java |    5 +-
 .../solr/cloud/TestCloudDeleteByQuery.java      |   11 +-
 .../apache/solr/cloud/TestCloudInspectUtil.java |   19 +-
 .../cloud/TestCloudJSONFacetJoinDomain.java     |    8 +-
 .../solr/cloud/TestCloudJSONFacetSKG.java       |    4 +-
 ...TestCloudPhrasesIdentificationComponent.java |  200 +++
 .../apache/solr/cloud/TestCloudRecovery.java    |    2 +-
 .../solr/cloud/TestClusterProperties.java       |   25 +-
 .../apache/solr/cloud/TestConfigSetsAPI.java    |   25 +-
 .../solr/cloud/TestConfigSetsAPIZkFailure.java  |   14 +-
 .../solr/cloud/TestDownShardTolerantSearch.java |   17 +-
 .../TestLeaderInitiatedRecoveryThread.java      |   67 +-
 .../org/apache/solr/cloud/TestPullReplica.java  |   18 +-
 .../cloud/TestPullReplicaErrorHandling.java     |   27 +-
 .../solr/cloud/TestSkipOverseerOperations.java  |    3 +
 .../TestSolrCloudWithDelegationTokens.java      |   26 +-
 .../TestSolrCloudWithSecureImpersonation.java   |  101 +-
 .../TestStressCloudBlindAtomicUpdates.java      |    2 +-
 .../org/apache/solr/cloud/TestTlogReplica.java  |   13 +-
 .../cloud/TestTolerantUpdateProcessorCloud.java |  238 ++--
 .../apache/solr/cloud/TestWithCollection.java   |   20 +-
 .../org/apache/solr/cloud/TestZkChroot.java     |   23 +-
 .../solr/cloud/UnloadDistributedZkTest.java     |    1 +
 .../test/org/apache/solr/cloud/ZkCLITest.java   |   18 +-
 .../org/apache/solr/cloud/ZkShardTermsTest.java |    1 +
 .../org/apache/solr/cloud/ZkSolrClientTest.java |   59 +-
 .../CollectionTooManyReplicasTest.java          |    2 +-
 .../CollectionsAPIAsyncDistributedZkTest.java   |    6 +-
 .../CollectionsAPIDistributedZkTest.java        |    1 +
 .../api/collections/CustomCollectionTest.java   |    1 +
 .../HdfsCollectionsAPIDistributedZkTest.java    |    3 +-
 .../cloud/api/collections/ShardSplitTest.java   |  379 ++---
 .../TestCollectionsAPIViaSolrCloudCluster.java  |    2 +-
 .../collections/TestHdfsCloudBackupRestore.java |   12 +-
 .../TestLocalFSCloudBackupRestore.java          |   13 +-
 .../AutoAddReplicasIntegrationTest.java         |    3 +-
 .../AutoAddReplicasPlanActionTest.java          |    2 +-
 .../autoscaling/AutoScalingHandlerTest.java     |   44 +-
 .../solr/cloud/autoscaling/CapturedEvent.java   |    2 +
 .../autoscaling/ComputePlanActionTest.java      |  187 ++-
 .../autoscaling/ExecutePlanActionTest.java      |    2 +-
 .../HdfsAutoAddReplicasIntegrationTest.java     |    2 +-
 .../cloud/autoscaling/IndexSizeTriggerTest.java |   68 +-
 .../MetricTriggerIntegrationTest.java           |   11 +-
 .../ScheduledMaintenanceTriggerTest.java        |   23 +-
 .../ScheduledTriggerIntegrationTest.java        |    3 +-
 .../cloud/autoscaling/ScheduledTriggerTest.java |    3 +-
 .../SearchRateTriggerIntegrationTest.java       |   44 +-
 .../autoscaling/SearchRateTriggerTest.java      |   14 +-
 .../solr/cloud/autoscaling/TestPolicyCloud.java |   40 +
 .../autoscaling/TriggerEventQueueTest.java      |   98 ++
 .../autoscaling/TriggerIntegrationTest.java     |   40 +-
 .../sim/GenericDistributedQueue.java            |    6 +-
 .../cloud/autoscaling/sim/SimCloudManager.java  |   18 +-
 .../sim/SimClusterStateProvider.java            |  273 ++--
 .../autoscaling/sim/SimDistribStateManager.java |    2 +-
 .../sim/SimDistributedQueueFactory.java         |    4 +-
 .../autoscaling/sim/SimNodeStateProvider.java   |   26 +-
 .../sim/TestClusterStateProvider.java           |  225 ---
 .../autoscaling/sim/TestComputePlanAction.java  |  359 -----
 .../sim/TestDistribStateManager.java            |  342 -----
 .../autoscaling/sim/TestExecutePlanAction.java  |  207 ---
 .../sim/TestGenericDistributedQueue.java        |   35 -
 .../cloud/autoscaling/sim/TestLargeCluster.java |  680 ---------
 .../autoscaling/sim/TestNodeAddedTrigger.java   |  327 -----
 .../autoscaling/sim/TestNodeLostTrigger.java    |  346 -----
 .../cloud/autoscaling/sim/TestPolicyCloud.java  |  366 -----
 .../sim/TestSimClusterStateProvider.java        |  225 +++
 .../sim/TestSimComputePlanAction.java           |  358 +++++
 .../sim/TestSimDistribStateManager.java         |  342 +++++
 .../sim/TestSimExecutePlanAction.java           |  209 +++
 .../sim/TestSimGenericDistributedQueue.java     |   38 +
 .../autoscaling/sim/TestSimLargeCluster.java    |  728 ++++++++++
 .../sim/TestSimNodeAddedTrigger.java            |  327 +++++
 .../autoscaling/sim/TestSimNodeLostTrigger.java |  346 +++++
 .../autoscaling/sim/TestSimPolicyCloud.java     |  368 +++++
 .../sim/TestSimTriggerIntegration.java          | 1325 ++++++++++++++++++
 .../autoscaling/sim/TestTriggerIntegration.java | 1262 -----------------
 .../solr/cloud/cdcr/CdcrBootstrapTest.java      |    4 +-
 .../cloud/cdcr/CdcrOpsAndBoundariesTest.java    |  321 +++++
 .../cdcr/CdcrReplicationDistributedZkTest.java  |  681 ---------
 .../apache/solr/cloud/cdcr/CdcrTestsUtil.java   |  132 +-
 .../cloud/cdcr/CdcrWithNodesRestartsTest.java   |  343 +++++
 .../cloud/hdfs/HdfsBasicDistributedZk2Test.java |    2 +
 .../apache/solr/cloud/hdfs/StressHdfsTest.java  |    1 +
 .../solr/cloud/rule/ImplicitSnitchTest.java     |    2 +
 .../apache/solr/core/TestDynamicLoading.java    |    2 +-
 .../FieldAnalysisRequestHandlerTest.java        |    2 +-
 .../apache/solr/handler/RequestLoggingTest.java |    6 +-
 .../solr/handler/TestReplicationHandler.java    |    5 +-
 .../org/apache/solr/handler/TestSQLHandler.java |  244 +++-
 .../TestSolrConfigHandlerConcurrent.java        |   38 +-
 .../solr/handler/admin/MetricsHandlerTest.java  |    4 +-
 .../admin/MetricsHistoryHandlerTest.java        |    1 +
 .../admin/SegmentsInfoRequestHandlerTest.java   |   59 +-
 .../admin/ZookeeperStatusHandlerTest.java       |    1 +
 .../DistributedDebugComponentTest.java          |    4 +-
 .../component/DistributedMLTComponentTest.java  |    3 +-
 .../PhrasesIdentificationComponentTest.java     |  796 +++++++++++
 .../handler/component/StatsComponentTest.java   |   10 +-
 .../solr/handler/export/TestExportWriter.java   |   49 +
 .../solr/metrics/SolrMetricReporterTest.java    |    4 +-
 .../reporters/solr/SolrCloudReportersTest.java  |    5 +-
 .../metrics/rrd/SolrRrdBackendFactoryTest.java  |    3 +-
 .../apache/solr/request/SimpleFacetsTest.java   |    2 +-
 .../response/TestRetrieveFieldsOptimizer.java   |  642 ++++++++-
 .../transform/TestChildDocTransformer.java      |   58 +-
 .../TestChildDocTransformerHierarchy.java       |  387 +++++
 .../solr/rest/TestManagedResourceStorage.java   |    3 +-
 .../schema/TestFieldCollectionResource.java     |   10 +-
 .../solr/rest/schema/TestFieldTypeResource.java |    3 +-
 .../solr/schema/CurrencyFieldTypeTest.java      |    2 +-
 .../solr/schema/SchemaApiFailureTest.java       |    1 +
 .../org/apache/solr/schema/TestPointFields.java |    2 +-
 .../solr/schema/TestSortableTextField.java      |    4 +-
 .../search/CurrencyRangeFacetCloudTest.java     |    4 +-
 .../apache/solr/search/QueryEqualityTest.java   |    2 +-
 .../solr/search/TestCollapseQParserPlugin.java  |   18 +-
 .../solr/search/TestHashQParserPlugin.java      |   35 +-
 .../org/apache/solr/search/TestRangeQuery.java  |    2 +-
 .../apache/solr/search/TestRankQueryPlugin.java |   39 +-
 .../apache/solr/search/TestStressRecovery.java  |    3 +
 .../solr/search/facet/RangeFacetCloudTest.java  |    2 +-
 .../search/function/SortByFunctionTest.java     |    8 +-
 .../solr/search/stats/TestDistribIDF.java       |    3 +-
 .../solr/security/BasicAuthIntegrationTest.java |    2 +-
 .../hadoop/TestDelegationWithHadoopAuth.java    |    3 +-
 .../solr/servlet/HttpSolrCallGetCoreTest.java   |    3 +-
 .../solr/store/hdfs/HdfsDirectoryTest.java      |    7 +-
 .../TestDocTermOrdsUninvertLimit.java           |    2 +-
 .../solr/update/MaxSizeAutoCommitTest.java      |  268 +---
 .../apache/solr/update/TestHdfsUpdateLog.java   |    2 +
 .../solr/update/TestInPlaceUpdatesDistrib.java  |    3 +-
 .../solr/update/TestNestedUpdateProcessor.java  |   14 +-
 ...dSchemaFieldsUpdateProcessorFactoryTest.java |   15 +
 .../ParsingFieldUpdateProcessorsTest.java       |  145 +-
 .../processor/TestNamedUpdateProcessors.java    |    2 +-
 .../TimeRoutedAliasUpdateProcessorTest.java     |  237 +++-
 .../TrackingUpdateProcessorFactory.java         |  136 +-
 .../apache/solr/util/DateMathParserTest.java    |    4 +-
 .../solr/util/TestMaxTokenLenTokenizer.java     |   20 +-
 .../example-DIH/solr/db/conf/managed-schema     |   34 +
 .../example-DIH/solr/mail/conf/managed-schema   |   34 +
 .../example-DIH/solr/solr/conf/managed-schema   |   34 +
 solr/example/files/conf/managed-schema          |    9 +
 solr/example/files/conf/solrconfig.xml          |    8 +-
 solr/licenses/commons-compress-1.16.1.jar.sha1  |    1 -
 solr/licenses/commons-compress-1.18.jar.sha1    |    1 +
 solr/licenses/junit4-ant-2.6.0.jar.sha1         |    1 -
 solr/licenses/junit4-ant-2.6.4.jar.sha1         |    1 +
 .../randomizedtesting-runner-2.6.0.jar.sha1     |    1 -
 .../randomizedtesting-runner-2.6.4.jar.sha1     |    1 +
 .../configsets/_default/conf/managed-schema     |   34 +
 .../configsets/_default/conf/solrconfig.xml     |    8 +-
 .../conf/managed-schema                         |   34 +
 solr/solr-ref-guide/build.xml                   |   18 +-
 solr/solr-ref-guide/src/_layouts/page.html      |    2 +-
 solr/solr-ref-guide/src/analytics.adoc          |    2 +-
 .../src/basic-authentication-plugin.adoc        |    4 +-
 solr/solr-ref-guide/src/cloud-screens.adoc      |   12 +-
 solr/solr-ref-guide/src/collections-api.adoc    |   92 +-
 .../src/colocating-collections.adoc             |   26 +-
 .../src/common-query-parameters.adoc            |    6 +-
 solr/solr-ref-guide/src/configsets-api.adoc     |    2 +-
 .../src/configuring-solrconfig-xml.adoc         |    4 +-
 solr/solr-ref-guide/src/coreadmin-api.adoc      |    8 +-
 solr/solr-ref-guide/src/css/ref-guide.css       |    5 +
 solr/solr-ref-guide/src/css/theme-solr.css      |   21 +-
 solr/solr-ref-guide/src/curve-fitting.adoc      |  166 ++-
 .../detecting-languages-during-indexing.adoc    |    2 +-
 .../src/distributed-requests.adoc               |    4 +-
 solr/solr-ref-guide/src/docvalues.adoc          |   22 +-
 solr/solr-ref-guide/src/dsp.adoc                |   74 +-
 .../solr-ref-guide/src/filter-descriptions.adoc |    8 +-
 solr/solr-ref-guide/src/format-of-solr-xml.adoc |    4 +-
 solr/solr-ref-guide/src/index.adoc              |   19 +-
 .../src/indexconfig-in-solrconfig.adoc          |   14 +-
 .../src/initparams-in-solrconfig.adoc           |    2 +-
 solr/solr-ref-guide/src/json-facet-api.adoc     |  123 +-
 solr/solr-ref-guide/src/language-analysis.adoc  |   45 +-
 solr/solr-ref-guide/src/learning-to-rank.adoc   |    2 +-
 .../src/lib-directives-in-solrconfig.adoc       |   38 -
 .../src/local-parameters-in-queries.adoc        |    2 +-
 solr/solr-ref-guide/src/machine-learning.adoc   |  406 ++++--
 .../src/making-and-restoring-backups.adoc       |    2 +
 solr/solr-ref-guide/src/math-expressions.adoc   |   30 +-
 solr/solr-ref-guide/src/matrix-math.adoc        |   20 +-
 solr/solr-ref-guide/src/metrics-reporting.adoc  |    6 +-
 solr/solr-ref-guide/src/numerical-analysis.adoc |  114 +-
 solr/solr-ref-guide/src/other-parsers.adoc      |    6 +-
 .../src/other-schema-elements.adoc              |    2 +-
 .../src/pagination-of-results.adoc              |    2 +-
 .../src/probability-distributions.adoc          |  100 +-
 solr/solr-ref-guide/src/regression.adoc         |   77 +-
 .../src/resource-and-plugin-loading.adoc        |   86 ++
 .../src/rule-based-replica-placement.adoc       |    2 +-
 solr/solr-ref-guide/src/scalar-math.adoc        |    4 +-
 solr/solr-ref-guide/src/schemaless-mode.adoc    |    8 +-
 solr/solr-ref-guide/src/searching.adoc          |    2 -
 solr/solr-ref-guide/src/simulations.adoc        |  122 +-
 solr/solr-ref-guide/src/solr-upgrade-notes.adoc |   73 +-
 ...solrcloud-autoscaling-auto-add-replicas.adoc |    6 +-
 .../src/solrcloud-autoscaling-overview.adoc     |   25 +-
 ...olrcloud-autoscaling-policy-preferences.adoc |  316 +++--
 .../src/solrcloud-autoscaling-triggers.adoc     |  391 ++++--
 ...rcloud-query-routing-and-read-tolerance.adoc |   60 +-
 solr/solr-ref-guide/src/spell-checking.adoc     |    2 +-
 .../src/statistical-programming.adoc            |  741 ----------
 solr/solr-ref-guide/src/statistics.adoc         |   58 +-
 .../src/stream-decorator-reference.adoc         |  160 ++-
 .../src/stream-evaluator-reference.adoc         |    4 +-
 .../src/stream-source-reference.adoc            |   36 +-
 .../src/streaming-expressions.adoc              |    2 +-
 solr/solr-ref-guide/src/suggester.adoc          |    8 +-
 solr/solr-ref-guide/src/term-vectors.adoc       |   91 +-
 solr/solr-ref-guide/src/time-series.adoc        |   14 +-
 solr/solr-ref-guide/src/tokenizers.adoc         |    2 +-
 .../transforming-and-indexing-custom-json.adoc  |    2 +-
 .../src/transforming-result-documents.adoc      |   65 +-
 .../src/update-request-processors.adoc          |    4 +-
 .../src/uploading-data-with-index-handlers.adoc |   83 +-
 ...store-data-with-the-data-import-handler.adoc |   33 +-
 solr/solr-ref-guide/src/variables.adoc          |  197 ++-
 solr/solr-ref-guide/src/vector-math.adoc        |   50 +-
 solr/solr-ref-guide/src/vectorization.adoc      |  108 +-
 .../tools/CheckLinksAndAnchors.java             |    2 +-
 .../cloud/autoscaling/AddReplicaSuggester.java  |   10 +-
 .../cloud/autoscaling/AutoScalingConfig.java    |   44 +-
 .../client/solrj/cloud/autoscaling/Clause.java  |  270 ++--
 .../solrj/cloud/autoscaling/Condition.java      |   18 +-
 .../solrj/cloud/autoscaling/CoresVariable.java  |    8 +-
 .../cloud/autoscaling/FreeDiskVariable.java     |   40 +-
 .../cloud/autoscaling/MoveReplicaSuggester.java |    3 +-
 .../solrj/cloud/autoscaling/NodeVariable.java   |    5 +-
 .../client/solrj/cloud/autoscaling/Operand.java |    1 +
 .../client/solrj/cloud/autoscaling/Policy.java  |   32 +-
 .../solrj/cloud/autoscaling/PolicyHelper.java   |   70 +-
 .../solrj/cloud/autoscaling/RangeVal.java       |   10 +-
 .../solrj/cloud/autoscaling/ReplicaCount.java   |   54 +-
 .../solrj/cloud/autoscaling/ReplicaInfo.java    |   45 +-
 .../cloud/autoscaling/ReplicaVariable.java      |   19 +-
 .../client/solrj/cloud/autoscaling/Row.java     |   35 +-
 .../solrj/cloud/autoscaling/Suggester.java      |   14 +-
 .../solrj/cloud/autoscaling/Suggestion.java     |   43 +-
 .../solrj/cloud/autoscaling/Variable.java       |   31 +-
 .../solrj/cloud/autoscaling/VariableBase.java   |   31 +-
 .../solrj/cloud/autoscaling/Violation.java      |   39 +-
 .../autoscaling/WithCollectionVariable.java     |    3 +-
 .../solr/client/solrj/impl/CloudSolrClient.java |   13 +-
 .../solr/client/solrj/impl/HttpClientUtil.java  |   14 +-
 .../solrj/impl/Krb5HttpClientBuilder.java       |   12 +-
 .../solrj/impl/SolrClientNodeStateProvider.java |    2 +-
 .../org/apache/solr/client/solrj/io/Lang.java   |   10 +
 .../client/solrj/io/eval/GaussFitEvaluator.java |   91 ++
 .../client/solrj/io/eval/GetCacheEvaluator.java |   57 +
 .../solr/client/solrj/io/eval/KnnEvaluator.java |   22 +-
 .../solrj/io/eval/KnnRegressionEvaluator.java   |  238 ++++
 .../solrj/io/eval/LatLonVectorsEvaluator.java   |  115 ++
 .../solrj/io/eval/ListCacheEvaluator.java       |   73 +
 .../solrj/io/eval/MinMaxScaleEvaluator.java     |    2 +-
 .../client/solrj/io/eval/OutliersEvaluator.java |  138 ++
 .../client/solrj/io/eval/PredictEvaluator.java  |   34 +-
 .../client/solrj/io/eval/PutCacheEvaluator.java |   61 +
 .../solrj/io/eval/RemoveCacheEvaluator.java     |   57 +
 .../solr/client/solrj/io/sql/StatementImpl.java |    2 +-
 .../client/solrj/io/stream/CloudSolrStream.java |   10 +-
 .../client/solrj/io/stream/CommitStream.java    |    4 +-
 .../client/solrj/io/stream/DaemonStream.java    |   14 +-
 .../client/solrj/io/stream/ExecutorStream.java  |    8 +-
 .../client/solrj/io/stream/FacetStream.java     |    7 +-
 .../io/stream/FeaturesSelectionStream.java      |    2 +-
 .../solr/client/solrj/io/stream/SolrStream.java |    6 +-
 .../client/solrj/io/stream/StreamContext.java   |   10 +
 .../client/solrj/io/stream/TextLogitStream.java |    2 +-
 .../solrj/io/stream/TimeSeriesStream.java       |    2 +
 .../client/solrj/io/stream/TopicStream.java     |    6 +-
 .../client/solrj/io/stream/TupleStream.java     |    2 +-
 .../client/solrj/io/stream/UpdateStream.java    |    6 +-
 .../solrj/request/CollectionAdminRequest.java   |   72 +
 .../solrj/request/ConfigSetAdminRequest.java    |    5 +-
 .../solr/client/solrj/request/V2Request.java    |    2 +-
 .../solrj/request/schema/SchemaRequest.java     |    2 +-
 .../solr/common/ConditionalMapWriter.java       |   82 ++
 .../java/org/apache/solr/common/MapWriter.java  |    6 +
 .../org/apache/solr/common/SolrDocument.java    |    4 +-
 .../solr/common/cloud/ClusterProperties.java    |   23 +-
 .../solr/common/cloud/ClusterStateUtil.java     |    4 +-
 .../solr/common/cloud/CompositeIdRouter.java    |    2 +-
 .../apache/solr/common/cloud/DocCollection.java |    9 +
 .../solr/common/cloud/HashBasedRouter.java      |    3 +-
 .../solr/common/cloud/ZkConfigManager.java      |    4 +-
 .../apache/solr/common/cloud/ZkStateReader.java |  140 +-
 .../org/apache/solr/common/util/IOUtils.java    |    4 +-
 .../java/org/apache/solr/common/util/Utils.java |   56 +-
 .../apispec/cluster.configs.Commands.json       |    2 +-
 .../resources/apispec/collections.Commands.json |    4 +
 .../testAutoScalingHandlerFailure.json          |  141 ++
 .../testScheduledTriggerFailure.json            |   52 +
 .../solrj/solr/autoscaling/testSortError.json   |  225 +++
 .../autoscaling/testSysPropSuggestions.json     |  119 ++
 .../autoscaling/testUtilizeNodeFailure.json     |   69 +
 .../autoscaling/testUtilizeNodeFailure2.json    |   66 +
 .../solrj/solr/collection1/conf/schema-sql.xml  |   13 -
 .../solrj/solr/collection1/conf/schema.xml      |   13 -
 .../solr/configsets/streaming/conf/schema.xml   |   11 -
 .../solr/client/solrj/SolrExampleTests.java     |    4 +-
 .../solr/client/solrj/SolrExceptionTest.java    |    3 +
 .../solrj/beans/TestDocumentObjectBinder.java   |    4 +
 .../solrj/cloud/autoscaling/TestPolicy.java     |  611 +-------
 .../solrj/cloud/autoscaling/TestPolicy2.java    |  111 +-
 .../solrj/embedded/LargeVolumeJettyTest.java    |    3 +-
 .../solrj/impl/CloudSolrClientBuilderTest.java  |    6 +
 .../CloudSolrClientMultiConstructorTest.java    |    3 +
 .../solrj/impl/CloudSolrClientRetryTest.java    |   79 ++
 .../client/solrj/impl/CloudSolrClientTest.java  |    5 +-
 .../ConcurrentUpdateSolrClientBuilderTest.java  |    1 +
 .../client/solrj/impl/HttpClientUtilTest.java   |    6 +-
 .../client/solrj/impl/LBHttpSolrClientTest.java |    2 +
 .../apache/solr/client/solrj/io/TestLang.java   |    3 +-
 .../solrj/io/graph/GraphExpressionTest.java     |    2 +-
 .../solr/client/solrj/io/graph/GraphTest.java   |    2 +-
 .../solrj/io/stream/MathExpressionTest.java     |  334 ++++-
 .../solrj/io/stream/StreamDecoratorTest.java    |   29 +-
 .../solrj/io/stream/StreamExpressionTest.java   |   18 +-
 .../stream/StreamExpressionToExpessionTest.java |    2 +
 .../StreamExpressionToExplanationTest.java      |    2 +
 .../client/solrj/io/stream/StreamingTest.java   |   68 +
 .../request/TestCollectionAdminRequest.java     |    5 +
 .../request/TestConfigSetAdminRequest.java      |    2 -
 .../solrj/request/TestUpdateRequestCodec.java   |    5 +-
 .../solrj/request/TestV1toV2ApiMapper.java      |   11 +-
 .../solrj/response/QueryResponseTest.java       |    6 +-
 .../response/TestDelegationTokenResponse.java   |    2 +
 .../solr/common/TestToleratedUpdateError.java   |    5 +-
 .../cloud/TestCloudCollectionsListeners.java    |    3 +
 .../solr/common/params/ShardParamsTest.java     |    5 +-
 .../apache/solr/common/util/NamedListTest.java  |    7 +-
 .../solr/common/util/TestFastInputStream.java   |    1 +
 .../solr/common/util/TestNamedListCodec.java    |   11 +-
 .../solr/BaseDistributedSearchTestCase.java     |    2 +-
 .../apache/solr/cloud/MiniSolrCloudCluster.java |    9 +-
 .../apache/solr/cloud/SolrCloudTestCase.java    |   88 +-
 .../java/org/apache/solr/util/TestHarness.java  |    5 +-
 solr/webapp/web/WEB-INF/web.xml                 |  101 +-
 solr/webapp/web/js/angular/controllers/cloud.js |    9 +-
 934 files changed, 31484 insertions(+), 15805 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/08f7e670/solr/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/08f7e670/solr/webapp/web/WEB-INF/web.xml
----------------------------------------------------------------------


[04/27] lucene-solr:solr7896-login-page: WIP add login page with bootstrap

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/libs/bootstrap.min.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/libs/bootstrap.min.js b/solr/webapp/web/libs/bootstrap.min.js
new file mode 100644
index 0000000..1a6258e
--- /dev/null
+++ b/solr/webapp/web/libs/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert"
 )),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b
 =!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.
 options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this
 .interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeC
 lass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data(
 )),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.remov
 eClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTra
 nsitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function
 (b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled
 ")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this
 .options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&
 !b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.rem
 ove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal
 ",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigg
 er:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefau
 lts();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade")
 ;var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a
 ,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transitio
 n&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeo
 f c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tool
 tip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getConte
 nt=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.of
 fsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarge
 t=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.
 find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [d
 ata-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unp
 in&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file


[17/27] lucene-solr:solr7896-login-page: WIP - login screen now works, but static always require login.

Posted by ja...@apache.org.
WIP - login screen now works, but static always require login.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/90dcf6ed
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/90dcf6ed
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/90dcf6ed

Branch: refs/heads/solr7896-login-page
Commit: 90dcf6eda70610eb32652ba7257b9f3656558f82
Parents: 5bb585c
Author: Jan Høydahl <ja...@apache.org>
Authored: Tue Sep 25 00:40:33 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Tue Sep 25 00:40:33 2018 +0200

----------------------------------------------------------------------
 solr/webapp/web/index.html                      |  2 +-
 solr/webapp/web/js/angular/app.js               |  5 +++++
 solr/webapp/web/js/angular/controllers/login.js | 21 +++++++++++---------
 solr/webapp/web/js/angular/services.js          | 16 +++++++--------
 solr/webapp/web/partials/login.html             | 10 ++++------
 5 files changed, 30 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index f36dc13..d832155 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -23,7 +23,7 @@ limitations under the License.
   <link rel="icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
   <link rel="shortcut icon" type="image/x-icon" href="img/favicon.ico?_=${version}">
 
-  <link rel="stylesheet" type="text/css" href="css/bootstrap-3.3/bootstrap.min.css?_=${version}">
+  <!--<link rel="stylesheet" type="text/css" href="css/bootstrap-3.3/bootstrap.min.css?_=${version}">-->
   <link rel="stylesheet" type="text/css" href="css/angular/common.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/analysis.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/cloud.css?_=${version}">

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index a0bc4ab..71dd98b 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -410,10 +410,13 @@ solrAdminApp.config([
   // so that the browser will not interfer with the login dialogue
   $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
 })
+    
+    
 // NOCOMMIT: just for testing     
 .run(['$rootScope', '$location', '$cookieStore', '$http',
   function ($rootScope, $location, $cookieStore, $http) {
     // keep user logged in after page refresh
+    // Replace with interceptor
     $rootScope.globals = $cookieStore.get('globals') || {};
     if ($rootScope.globals.currentUser) {
       $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
@@ -426,6 +429,8 @@ solrAdminApp.config([
       }
     });
   }])
+
+    
 .directive('fileModel', function ($parse) {
   return {
     restrict: 'A',

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index b0b7096..653ca14 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -23,14 +23,17 @@ solrAdminApp.controller('LoginController',
 
         $scope.login = function () {
           $scope.dataLoading = true;
-          AuthenticationService.Login($scope.username, $scope.password, function (response) {
-            if (response.success) {
-              AuthenticationService.SetCredentials($scope.username, $scope.password);
-              $location.path('/');
-            } else {
-              $scope.error = response.message;
-              $scope.dataLoading = false;
-            }
-          });
+          AuthenticationService.SetCredentials($scope.username, $scope.password);
+          $location.path('/');
+          // TODO: "login" by hitting the failing URL again
+          // AuthenticationService.Login($scope.username, $scope.password, function (response) {
+          //   if (response.success) {
+          //     AuthenticationService.SetCredentials($scope.username, $scope.password);
+          //     $location.path('/');
+          //   } else {
+          //     $scope.error = response.message;
+          //     $scope.dataLoading = false;
+          //   }
+          // });
         };
       }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index ffd7135..b6df864 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -272,18 +272,18 @@ solrAdminServices.factory('System',
 
           /* NOCOMMIT Dummy authentication for testing, uses $timeout to simulate api call
            ----------------------------------------------*/
-          $timeout(function () {
-            var response = { success: username === 'test' && password === 'test' };
-            if (!response.success) {
-              response.message = 'Username or password is incorrect';
-            }
-            callback(response);
-          }, 1000);
+          // $timeout(function () {
+          //   var response = { success: username === 'test' && password === 'test' };
+          //   if (!response.success) {
+          //     response.message = 'Username or password is incorrect';
+          //   }
+          //   callback(response);
+          // }, 1000);
 
 
           /* Use this for real authentication
            ----------------------------------------------*/
-          //$http.post('/api/authenticate', { username: username, password: password })
+          // $http.post('/api/authenticate', { username: username, password: password })
           //    .success(function (response) {
           //        callback(response);
           //    });

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/90dcf6ed/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
index cae1cc8..65be563 100644
--- a/solr/webapp/web/partials/login.html
+++ b/solr/webapp/web/partials/login.html
@@ -14,13 +14,11 @@ 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.
 -->
-<div id="login" class="jumbotron">
-
+<div id="login">
   <div class="col-xs-offset-2 col-xs-8">
-    <div class="alert alert-info">
-      Username: test<br />
-      Password: test
-    </div>
+    <h1>Please log in</h1>
+    Basic Authentication 
+    
     <div ng-show="error" class="alert alert-danger">{{error}}</div>
     <form name="form" ng-submit="login()" role="form">
         <div class="form-group">


[12/27] lucene-solr:solr7896-login-page: Add RefGuide section

Posted by ja...@apache.org.
Add RefGuide section


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/c31d8df7
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/c31d8df7
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/c31d8df7

Branch: refs/heads/solr7896-login-page
Commit: c31d8df715b0aec025aca2eaa3cadefc89204e89
Parents: 08f7e67
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Sep 24 14:43:50 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Sep 24 14:43:50 2018 +0200

----------------------------------------------------------------------
 solr/CHANGES.txt                                          |  2 +-
 .../src/authentication-and-authorization-plugins.adoc     | 10 ++++++++++
 solr/webapp/web/js/angular/app.js                         |  2 +-
 3 files changed, 12 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c31d8df7/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 3e22b42..500da1b 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -529,7 +529,7 @@ New Features
 * SOLR-11913: SolrJ SolrParams now implements Iterable<Map.Entry<String, String[]>> and also has a stream() method
   using it for convenience. (David Smiley, Tapan Vaishnav)
 
-* SOLR-7896: Add a login page to Admin UI (janhoy)
+* SOLR-7896: Add a login page to Admin UI, with initial support for Basic Auth (janhoy)
 
 * SOLR-11924: Added the ability to listen to changes in the set of active collections in a cloud
   in the ZkStateReader, through the CloudCollectionsListener. (Houston Putman, Dennis Gove)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c31d8df7/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc b/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc
index 971dbcd..dabd869 100644
--- a/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc
+++ b/solr/solr-ref-guide/src/authentication-and-authorization-plugins.adoc
@@ -157,6 +157,16 @@ Solr has one implementation of an authorization plugin:
 
 * <<rule-based-authorization-plugin.adoc#rule-based-authorization-plugin,Rule-Based Authorization Plugin>>
 
+== Authenticating in the Admin UI
+
+Whenever an authentication plugin is enabled, authentication is also required for all or some operations in the Admin UI. The Admin UI is an AngularJS application running inside your browser, and is treated as any other external client by Solr.
+
+When authentication is required the Admin UI will presented you with a login dialogue. The authentication plugins currently supported by the Admin UI are:
+
+* `BasicAuthPlugin`
+ 
+If your plugin of choice is not supported, you will have to interact with Solr sending HTTP requests instead of through the graphical user interface of the Admin UI. All operations supported by Admin UI can be performed through Solr's RESTful APIs.
+
 == Securing Inter-Node Requests
 
 There are a lot of requests that originate from the Solr nodes itself. For example, requests from overseer to nodes, recovery threads, etc. Each Authentication plugin declares whether it is capable of securing inter-node requests or not. If not, Solr will fall back to using a special internode authentication mechanism where each Solr node is a super user and is fully trusted by other Solr nodes, described below.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c31d8df7/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 3f781cd..fe686fe 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -402,7 +402,7 @@ solrAdminApp.config([
   $httpProvider.interceptors.push("httpInterceptor");
   $httpProvider.interceptors.push("authInterceptor");
   // Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
-  // so that the browser will not intercept the login dialogue
+  // so that the browser will not interfer with the login dialogue
   $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
 })
 .directive('fileModel', function ($parse) {


[07/27] lucene-solr:solr7896-login-page: WIP add login page with bootstrap

Posted by ja...@apache.org.
WIP add login page with bootstrap


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/5728c9be
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/5728c9be
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/5728c9be

Branch: refs/heads/solr7896-login-page
Commit: 5728c9be70a4decb0747080b9f3fc4ebc10e0d6c
Parents: 2ac10e4
Author: Jan Høydahl <ja...@apache.org>
Authored: Fri Apr 20 13:43:14 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Fri Apr 20 13:43:14 2018 +0200

----------------------------------------------------------------------
 solr/webapp/templates/loginDialog.html          |   30 +
 solr/webapp/templates/logoutLink.html           |    1 +
 solr/webapp/web/WEB-INF/web.xml                 |    2 +-
 solr/webapp/web/css/bootstrap.min.css           |    7 +
 solr/webapp/web/index.html                      |    3 +
 solr/webapp/web/js/angular/app.js               |    2 +-
 solr/webapp/web/js/angular/directives.js        |   68 +
 .../web/js/angular/http-auth-interceptor.js     |  122 ++
 solr/webapp/web/js/angular/login-controllers.js |   37 +
 solr/webapp/web/libs/bootstrap.js               | 2006 ++++++++++++++++++
 solr/webapp/web/libs/bootstrap.min.js           |    7 +
 11 files changed, 2283 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/templates/loginDialog.html
----------------------------------------------------------------------
diff --git a/solr/webapp/templates/loginDialog.html b/solr/webapp/templates/loginDialog.html
new file mode 100644
index 0000000..a217daa
--- /dev/null
+++ b/solr/webapp/templates/loginDialog.html
@@ -0,0 +1,30 @@
+<div class="modal fade" id="loginModal" tabindex="-1" role="dialog" aria-labelledby="loginModalLabel" aria-hidden="true" data-backdrop="static">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <form ng-submit="submit()" name="loginCredentialsForm" role="form">
+                <div class="modal-header">
+                    <h4 class="modal-title" id="loginModalLabel">Enter credentials</h4>
+                </div>
+                <div class="modal-body">
+                    <div class="form-horizontal">
+                        <div class="form-group">
+                            <label class="col-lg-4 control-label" for="userName">User name</label>
+                            <div class="col-lg-4">
+                                <input type="text" class="form-control" ng-model="credentials.userName" id="userName" placeholder="User name">
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-lg-4 control-label" for="password">Password</label>
+                            <div class="col-lg-4">
+                                <input type="password" class="form-control" ng-model="credentials.password" id="password" placeholder="Password">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <input type="submit" class="btn btn-primary" value="Log in"></input>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/templates/logoutLink.html
----------------------------------------------------------------------
diff --git a/solr/webapp/templates/logoutLink.html b/solr/webapp/templates/logoutLink.html
new file mode 100644
index 0000000..0796ed9
--- /dev/null
+++ b/solr/webapp/templates/logoutLink.html
@@ -0,0 +1 @@
+<p ng-show="isLoggedIn()" class="navbar-text navbar-right"><a href="" ng-click="logOut()">Log out</a></p>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/solr/webapp/web/WEB-INF/web.xml b/solr/webapp/web/WEB-INF/web.xml
index 22082c8..d3ec13e 100644
--- a/solr/webapp/web/WEB-INF/web.xml
+++ b/solr/webapp/web/WEB-INF/web.xml
@@ -56,7 +56,7 @@
     -->
     <init-param>
       <param-name>excludePatterns</param-name>
-      <param-value>/partials/.+,/libs/.+,/css/.+,/js/.+,/img/.+</param-value>
+      <param-value>/partials/.+,/libs/.+,/css/.+,/js/.+,/img/.+,/templates/.+</param-value>
     </init-param>
   </filter>
 


[25/27] lucene-solr:solr7896-login-page: Working for basic auth

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54dfca9a/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css b/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
deleted file mode 100644
index ed3905e..0000000
--- a/solr/webapp/web/css/bootstrap-3.3/bootstrap.min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-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:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;fo
 nt-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}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{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:
 auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px so
 lid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\
 270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:bef
 ore{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:b
 efore{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:befo
 re{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{con
 tent:"\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-bu
 llhorn: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{co
 ntent:"\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"}.gly
 phicon-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-hambu
 rger: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}:after,:before{-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}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6
 px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;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}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weigh
 t:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.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-c
 apitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px
 ;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height
 :1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}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:#3
 33;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg
 -3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{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{rig
 ht:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6
 {margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33
 333333%}.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-offs
 et-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-
 push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.666666
 67%}.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>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid 
 #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;di
 splay:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{bac
 kground-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>t
 d,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin
 -bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr
 >th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border: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:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{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[ty
 pe=checkbox]:focus,input[type=radio]:focus{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,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-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,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-p
 laceholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.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].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-g
 roup-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disable
 d],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left: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}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .f
 orm-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.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}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-con
 trol-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color
 :#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error
 .radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.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 .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-ali
 gn:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba
 (0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-def
 ault:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggl
 e.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;bo
 rder-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.b
 tn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;
 border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning
 :focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-dang
 er.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;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:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm
 {padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-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-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;wid
 th:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.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:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-deco
 ration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bott
 om:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{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,.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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.b
 tn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(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-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-chi
 ld){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle
 =buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height
 :auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon
 {padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:no
 t(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-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:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-dec
 oration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-ta
 bs.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:focus,.nav-tabs.nav-justified>.active>a:hover{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:focus,.nav-tabs.nav-justified>.active>a:hover{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:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-
 cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{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:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-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{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent
 ;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;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-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.
 container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{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;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{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;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;bord
 er-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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@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{padding:10px 15px;margin-top:8px;margin-right:-15
 px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;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 .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .rad
 io label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@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;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-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-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd
 }.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:f
 ocus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>
 .active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@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 .na
 vbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color
 :#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.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;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pag
 ination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3p
 x;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager 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:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{posit
 ion:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-
 1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;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{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;paddin
 g: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 a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.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:700}.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{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9ed
 f7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.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}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:ce
 nter;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:prog
 ress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-i
 mage:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-dang
 er{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{ver
 tical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:non

<TRUNCATED>

[26/27] lucene-solr:solr7896-login-page: Working for basic auth

Posted by ja...@apache.org.
Working for basic auth


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/54dfca9a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/54dfca9a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/54dfca9a

Branch: refs/heads/solr7896-login-page
Commit: 54dfca9a7243debff2b6b8ccaa19ae3ab78cceff
Parents: 44fa134
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Oct 8 16:14:20 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Oct 8 16:14:20 2018 +0200

----------------------------------------------------------------------
 .../web/css/bootstrap-3.3/bootstrap.min.css     |    6 -
 solr/webapp/web/index.html                      |    1 -
 solr/webapp/web/js/angular/app.js               |   22 +-
 solr/webapp/web/js/angular/controllers/login.js |  116 +-
 solr/webapp/web/js/angular/services.js          |    6 +-
 solr/webapp/web/libs/bootstrap.js               | 2006 ------------------
 solr/webapp/web/libs/bootstrap.min.js           |    7 -
 solr/webapp/web/partials/login.html             |   12 +-
 8 files changed, 121 insertions(+), 2055 deletions(-)
----------------------------------------------------------------------



[27/27] lucene-solr:solr7896-login-page: Styled the login page Conditional show login/logout xxx menu, with icon

Posted by ja...@apache.org.
Styled the login page
Conditional show login/logout xxx menu, with icon


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/954cbf12
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/954cbf12
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/954cbf12

Branch: refs/heads/solr7896-login-page
Commit: 954cbf1273992213e9048b62507719c168f58ea5
Parents: 54dfca9
Author: Jan Høydahl <ja...@apache.org>
Authored: Tue Oct 9 11:08:42 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Tue Oct 9 11:08:42 2018 +0200

----------------------------------------------------------------------
 solr/webapp/web/css/angular/login.css           | 95 ++++++++++++++++++++
 solr/webapp/web/css/angular/menu.css            |  2 +
 solr/webapp/web/index.html                      |  3 +-
 solr/webapp/web/js/angular/app.js               |  8 ++
 solr/webapp/web/js/angular/controllers/login.js |  7 +-
 solr/webapp/web/js/angular/services.js          | 31 +------
 solr/webapp/web/partials/login.html             | 70 ++++++++-------
 7 files changed, 154 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/css/angular/login.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/angular/login.css b/solr/webapp/web/css/angular/login.css
new file mode 100644
index 0000000..43cd715
--- /dev/null
+++ b/solr/webapp/web/css/angular/login.css
@@ -0,0 +1,95 @@
+/*
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+
+*/
+
+#content #login
+{
+  background-position: 0 50%;
+  padding-left: 21px;
+  vertical-align: center;
+  horiz-align: center;
+}
+
+#content #login h1,
+#content #login .h1 {
+  font-size: 2.5rem;
+}
+
+#content #login h2, 
+#content #login .h2 {
+  font-size: 2rem;
+}
+
+#content #login p
+{
+  margin-top: 0;
+  margin-bottom: 1rem;
+}
+
+#content #login button {
+  border-radius: 0;
+}
+
+#content #login button:focus {
+  outline: 1px dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+}
+
+#content #login .btn {
+  display: inline-block;
+  font-weight: 400;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  border: 1px solid transparent;
+  padding: 0.375rem 0.75rem;
+  font-size: 1rem;
+  line-height: 1.5;
+  border-radius: 0.25rem;
+  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+
+#content #login .form-inline .form-group {
+  display: -ms-flexbox;
+  display: flex;
+  -ms-flex: 0 0 auto;
+  flex: 0 0 auto;
+  -ms-flex-flow: row wrap;
+  flex-flow: row wrap;
+  -ms-flex-align: center;
+  align-items: center;
+  margin-bottom: 0;
+}
+
+#content #login .form-control {
+  display: block;
+  width: 80%;
+  padding: 0.375rem 0.75rem;
+  font-size: 1rem;
+  line-height: 1.5;
+  color: #495057;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid #ced4da;
+  border-radius: 0.25rem;
+  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/css/angular/menu.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/angular/menu.css b/solr/webapp/web/css/angular/menu.css
index f4e04c1..67041e5 100644
--- a/solr/webapp/web/css/angular/menu.css
+++ b/solr/webapp/web/css/angular/menu.css
@@ -247,6 +247,8 @@ limitations under the License.
 
 #menu #index.global p a { background-image: url( ../../img/ico/dashboard.png ); }
 
+#menu #login.global p a { background-image: url( ../../img/ico/users.png ); }
+
 #menu #logging.global p a { background-image: url( ../../img/ico/inbox-document-text.png ); }
 #menu #logging.global .level a { background-image: url( ../../img/ico/gear.png ); }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index 3729aaf..9b36814 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -34,6 +34,7 @@ limitations under the License.
   <link rel="stylesheet" type="text/css" href="css/angular/index.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/java-properties.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/logging.css?_=${version}">
+  <link rel="stylesheet" type="text/css" href="css/angular/login.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/menu.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/plugins.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/documents.css?_=${version}">
@@ -140,7 +141,7 @@ limitations under the License.
         <div>
 
           <ul id="menu">
-            <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Login {{$root.globals.currentUser.username}} {{$root.globals}}</a></p></li>
+            <li id="login" class="global" ng-class="{active:page=='login'}" ng-show="http401 || currentUser"><p><a href="#/login">{{http401 ? "Login" : "Logout " + currentUser}}</a></p></li>
             
             <li id="index" class="global" ng-class="{active:page=='index'}"><p><a href="#/">Dashboard</a></p></li>
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index e7fb0b2..d38f914 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -384,6 +384,10 @@ solrAdminApp.config([
   };
 
   var ended = function(response) {
+    sessionStorage.removeItem("auth.statusText");
+    if ($location.path() !== '/login') {
+      sessionStorage.removeItem("http401");
+    }
     return response || $q.when(response);
   };
 
@@ -392,6 +396,7 @@ solrAdminApp.config([
       var headers = rejection.headers();
       var wwwAuthHeader = headers['www-authenticate'];
       sessionStorage.setItem("auth.wwwAuthHeader", wwwAuthHeader);
+      sessionStorage.setItem("auth.statusText", rejection.statusText);
       var authDataHeader = headers['X-Solr-AuthData'];
       if (authDataHeader !== null) {
         sessionStorage.setItem("auth.config", authDataHeader);
@@ -401,6 +406,7 @@ solrAdminApp.config([
       } else {
         sessionStorage.setItem("auth.location", $location.path());
       }
+      sessionStorage.setItem("http401", "true");
       sessionStorage.removeItem("auth.scheme");
       sessionStorage.removeItem("auth.realm");
       sessionStorage.removeItem("auth.username");
@@ -489,6 +495,8 @@ solrAdminApp.controller('MainController', function($scope, $route, $rootScope, $
     $scope.showingLogging = page.lastIndexOf("logging", 0) === 0;
     $scope.showingCloud = page.lastIndexOf("cloud", 0) === 0;
     $scope.page = page;
+    $scope.currentUser = sessionStorage.getItem("auth.username");
+    $scope.http401 = sessionStorage.getItem("http401");
   };
 
   $scope.ping = function() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index 0c983d0..403f175 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -16,8 +16,10 @@
 */
 
 solrAdminApp.controller('LoginController',
-    ['$scope', '$routeParams', '$rootScope', '$location', 'AuthenticationService',
-      function ($scope, $routeParams, $rootScope, $location, AuthenticationService) {
+    ['$scope', '$routeParams', '$rootScope', '$location', 'AuthenticationService', 'Constants',
+      function ($scope, $routeParams, $rootScope, $location, AuthenticationService, Constants) {
+        $scope.resetMenu("login", Constants.IS_ROOT_PAGE);
+
         // Session variables set in app.js 401 interceptor
         var wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
         var authDataHeader = sessionStorage.getItem("auth.config");
@@ -45,6 +47,7 @@ solrAdminApp.controller('LoginController',
 
         $scope.authScheme = sessionStorage.getItem("auth.scheme");
         $scope.wwwAuthHeader = sessionStorage.getItem("auth.wwwAuthHeader");
+        $scope.statusText = sessionStorage.getItem("auth.statusText");
         $scope.authConfig = sessionStorage.getItem("auth.config");
         $scope.authLocation = sessionStorage.getItem("auth.location");
         $scope.authLoggedinUser = sessionStorage.getItem("auth.username");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index a055c4b..7f27198 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -268,28 +268,6 @@ solrAdminServices.factory('System',
       function (Base64, $http, $rootScope, $timeout) {
         var service = {};
 
-        service.Login = function (username, password, callback) {
-
-          /* NOCOMMIT Dummy authentication for testing, uses $timeout to simulate api call
-           ----------------------------------------------*/
-          // $timeout(function () {
-          //   var response = { success: username === 'test' && password === 'test' };
-          //   if (!response.success) {
-          //     response.message = 'Username or password is incorrect';
-          //   }
-          //   callback(response);
-          // }, 1000);
-
-
-          /* Use this for real authentication
-           ----------------------------------------------*/
-          // $http.post('/api/authenticate', { username: username, password: password })
-          //    .success(function (response) {
-          //        callback(response);
-          //    });
-
-        };
-
         service.SetCredentials = function (username, password) {
           var authdata = Base64.encode(username + ':' + password);
 
@@ -300,22 +278,21 @@ solrAdminServices.factory('System',
           //   }
           // };
           //
-          sessionStorage.setItem('globals', $rootScope.globals);
+          // sessionStorage.setItem('globals', $rootScope.globals);
           sessionStorage.setItem("auth.header", "Basic " + authdata);
           sessionStorage.setItem("auth.username", username);
-          // $http.defaults.headers.common.Authorization = "Basic " + authdata;
           console.log("Stored auth data on session storage");
         };
 
         service.ClearCredentials = function () {
-          $rootScope.globals = {};
-          sessionStorage.removeItem('globals');
+          // $rootScope.globals = {};
+          // sessionStorage.removeItem('globals');
           sessionStorage.removeItem("auth.header");
           sessionStorage.removeItem("auth.scheme");
           sessionStorage.removeItem("auth.realm");
           sessionStorage.removeItem("auth.username");
           sessionStorage.removeItem("auth.wwwAuthHeader");
-          // $http.defaults.headers.common.Authorization = null;
+          sessionStorage.removeItem("auth.statusText");
           console.log("Cleared stored auth data");
         };
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/954cbf12/solr/webapp/web/partials/login.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/partials/login.html b/solr/webapp/web/partials/login.html
index 89dd427..348eb1f 100644
--- a/solr/webapp/web/partials/login.html
+++ b/solr/webapp/web/partials/login.html
@@ -17,53 +17,59 @@ limitations under the License.
 <div id="login" class="clearfix">
 
   <div ng-show="authScheme === 'Basic'">
-    <h1>Basic Authentication</h1>     
-    
-    <p>Scheme: {{authScheme}}</p>
-    <p>Realm: {{authRealm}}</p>
-    <p>WWW-Header: {{wwwAuthHeader}}</p>
-    <p>Config: {{authConfig}}</p>
-    <p>Redirect: {{authLocation}}</p>
-    <p>LoggedinUser: {{authLoggedinUser}}</p>
-    <p>AuthHeader: {{authHeader}}</p>
-
-    <div ng-show="error" class="alert alert-danger">{{error}}</div>
-    <form name="form" ng-submit="login()" role="form" ng-show="!isLoggedIn()">
+    <h1>Basic Authentication</h1>
+    <div ng-show="statusText !== 'require authentication'">
+      <b>{{statusText}}</b>
+    </div>
+    <div ng-show="!isLoggedIn()">
+      <p>
+        Solr requires authentication for resource {{authLocation === '/' ? 'Dashboard' : authLocation}}.<br/>
+        Please log in with your username and password for realm {{authRealm}}.
+      </p>
+      <br/>
+      <div ng-show="error" class="alert alert-danger">{{error}}</div>
+      <form name="form" ng-submit="login()" role="form">
         <div class="form-group">
-            <label for="username">Username</label>
-            <i class="fa fa-key"></i>
-            <input type="text" name="username" id="username" class="form-control" ng-model="username" required />
-            <span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Username is required</span>
+          <label for="username">Username</label>
+          <input type="text" name="username" id="username" class="form-control" ng-model="username" required />
+          <span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Username is required</span>
         </div>
         <div class="form-group">
-            <label for="password">Password</label>
-            <i class="fa fa-lock"></i>
-            <input type="password" name="password" id="password" class="form-control" ng-model="password" required />
-            <span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Password is required</span>
+          <label for="password">Password</label>
+          <input type="password" name="password" id="password" class="form-control" ng-model="password" required />
+          <span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Password is required</span>
         </div>
+        <br/>
         <div class="form-actions">
-            <button type="submit" ng-disabled="form.$invalid || dataLoading" class="btn btn-danger">Login</button>
-            <img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
+          <button type="submit" ng-disabled="form.$invalid" class="btn btn-danger">Login</button>
         </div>
-    </form>
-    <form name="logoutForm" ng-submit="logout()" role="form" ng-show="isLoggedIn()">
+      </form>
+    </div>
+
+    <div ng-show="isLoggedIn()">
+      <p>
+        Logged in as user {{authLoggedinUser}}. Realm={{authRealm}}.<br/>
+      </p>
+      <br/>
+      <form name="logoutForm" ng-submit="logout()" role="form" ng-show="isLoggedIn()">
         <div class="form-actions">
-            <button type="submit" class="btn btn-danger">Logout</button>
+          <button type="submit" class="btn btn-danger">Logout</button>
         </div>
-    </form>
-    
+      </form>
+    </div>
+
   </div>
-  
-  
+
+
   <div ng-show="authScheme === 'unknown'">
-    <h1>Authentication type not supported</h1>     
-    
+    <h1>Authentication type not supported</h1>
+
     <p>Type: {{authScheme}}</p>
     <p>WWW-Header: {{wwwAuthHeader}}</p>
     <p>Config: {{authConfig}}</p>
     <p>Redirect: {{authLocation}}</p>
     <p>LoggedinUser: {{authLoggedinUser}}</p>
 
-    You cannot use Solr's Admin UI for this operation. Please use another client that supports this type. 
+    You cannot use Solr's Admin UI for this operation. Please use another client that supports this type.
   </div>
 </div>


[05/27] lucene-solr:solr7896-login-page: WIP add login page with bootstrap

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index 0f9ff84..779f672 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -60,6 +60,9 @@ limitations under the License.
   <script src="libs/d3.js"></script>
   <script src="js/angular/app.js"></script>
   <script src="js/angular/services.js"></script>
+  <script src="js/angular/directives.js"></script>
+  <script src="js/angular/http-auth-interceptor.js"></script>
+  <script src="js/angular/login-controllers.js"></script>
   <script src="js/angular/controllers/index.js"></script>
   <script src="js/angular/controllers/logging.js"></script>
   <script src="js/angular/controllers/cloud.js"></script>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 3a2009a..9be1ee5 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -398,7 +398,7 @@ solrAdminApp.config([
 })
 .config(function($httpProvider) {
   $httpProvider.interceptors.push("httpInterceptor");
-  $httpProvider.interceptors.push("authInterceptor");
+  //$httpProvider.interceptors.push("authInterceptor");
   // Tell the BasicAuth plugin that we are Admin UI so it can serve us a 'Authorization: xBasic xxxx' header
   // so that the browser will not intercept the login dialogue
   $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/js/angular/directives.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/directives.js b/solr/webapp/web/js/angular/directives.js
new file mode 100644
index 0000000..ba6e701
--- /dev/null
+++ b/solr/webapp/web/js/angular/directives.js
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+'use strict';
+
+angular.module('loginDirectives', []).
+directive('loginDialog', function($timeout) {
+   return {
+       templateUrl: '/templates/loginDialog.html',
+       restrict: 'E',
+       replace: true,
+       controller: CredentialsController,
+       link: function(scope, element, attributes, controller) {
+           var isShowing = false;
+           
+           element.on('shown.bs.modal', function(e) {
+               element.find('#userName').focus();
+           });
+
+           scope.$on('event:auth-loginRequired', function() {
+               if (isShowing) {
+                   return;
+               }
+               
+               // If we're in the process of hiding the modal, we need to wait for
+               // all CSS animations to complete before showing the modal again.
+               // Otherwise, we might end up with an invisible modal, making the whole
+               // view rather unusable. I've been unable to control the transitions
+               // between "showing", "shown", "hiding", and "hidden" tightly using
+               // JQuery notifications without collecting more and more modal backdrops
+               // in the DOM, so the dirty solution here is to simply wait a second
+               // before showing the log-in dialog.
+               isShowing = true;
+               $timeout(function() {
+                   element.modal('show');
+                   isShowing = false;
+               }, 1000);
+           });
+
+           scope.$on('event:auth-loginConfirmed', function() {
+               element.modal('hide');
+               scope.credentials.password = '';
+           });
+       }
+   } 
+}).
+directive('logoutLink', function() {
+   return {
+       templateUrl: '/templates/logoutLink.html',
+       restrict: 'E',
+       replace: true,
+       controller: LoginController
+   } 
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/js/angular/http-auth-interceptor.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/http-auth-interceptor.js b/solr/webapp/web/js/angular/http-auth-interceptor.js
new file mode 100644
index 0000000..2f34861
--- /dev/null
+++ b/solr/webapp/web/js/angular/http-auth-interceptor.js
@@ -0,0 +1,122 @@
+/*global angular:true, browser:true */
+
+/**
+ * @license HTTP Auth Interceptor Module for AngularJS
+ * (c) 2012 Witold Szczerba
+ * License: MIT
+ */
+(function () {
+  'use strict';
+
+  angular.module('http-auth-interceptor', ['http-auth-interceptor-buffer'])
+
+  .factory('authService', ['$rootScope','httpBuffer', function($rootScope, httpBuffer) {
+    return {
+      /**
+       * Call this function to indicate that authentication was successfull and trigger a
+       * retry of all deferred requests.
+       * @param data an optional argument to pass on to $broadcast which may be useful for
+       * example if you need to pass through details of the user that was logged in
+       */
+      loginConfirmed: function(data, configUpdater) {
+        var updater = configUpdater || function(config) {return config;};
+        $rootScope.$broadcast('event:auth-loginConfirmed', data);
+        httpBuffer.retryAll(updater);
+      },
+
+      /**
+       * Call this function to indicate that authentication should not proceed.
+       * All deferred requests will be abandoned or rejected (if reason is provided).
+       * @param data an optional argument to pass on to $broadcast.
+       * @param reason if provided, the requests are rejected; abandoned otherwise.
+       */
+      loginCancelled: function(data, reason) {
+        httpBuffer.rejectAll(reason);
+        $rootScope.$broadcast('event:auth-loginCancelled', data);
+      }
+    };
+  }])
+
+  /**
+   * $http interceptor.
+   * On 401 response (without 'ignoreAuthModule' option) stores the request
+   * and broadcasts 'event:angular-auth-loginRequired'.
+   */
+  .config(['$httpProvider', function($httpProvider) {
+    $httpProvider.interceptors.push(['$rootScope', '$q', 'httpBuffer', function($rootScope, $q, httpBuffer) {
+      return {
+        responseError: function(rejection) {
+          if (rejection.status === 401 && !rejection.config.ignoreAuthModule) {
+            var deferred = $q.defer();
+            httpBuffer.append(rejection.config, deferred);
+            $rootScope.$broadcast('event:auth-loginRequired', rejection);
+            return deferred.promise;
+          }
+          // otherwise, default behaviour
+          return $q.reject(rejection);
+        }
+      };
+    }]);
+  }]);
+
+  /**
+   * Private module, a utility, required internally by 'http-auth-interceptor'.
+   */
+  angular.module('http-auth-interceptor-buffer', [])
+
+  .factory('httpBuffer', ['$injector', function($injector) {
+    /** Holds all the requests, so they can be re-requested in future. */
+    var buffer = [];
+
+    /** Service initialized later because of circular dependency problem. */
+    var $http;
+
+    function retryHttpRequest(config, deferred) {
+      // Make room for new 'Authenticate' header value
+      delete config.headers['Authorization'];
+
+      function successCallback(response) {
+        deferred.resolve(response);
+      }
+      function errorCallback(response) {
+        deferred.reject(response);
+      }
+      $http = $http || $injector.get('$http');
+      $http(config).then(successCallback, errorCallback);
+    }
+
+    return {
+      /**
+       * Appends HTTP request configuration object with deferred response attached to buffer.
+       */
+      append: function(config, deferred) {
+        buffer.push({
+          config: config,
+          deferred: deferred
+        });
+      },
+
+      /**
+       * Abandon or reject (if reason provided) all the buffered requests.
+       */
+      rejectAll: function(reason) {
+        if (reason) {
+          for (var i = 0; i < buffer.length; ++i) {
+            buffer[i].deferred.reject(reason);
+          }
+        }
+        buffer = [];
+      },
+
+      /**
+       * Retries all the buffered requests clears the buffer.
+       */
+      retryAll: function(updater) {
+        for (var i = 0; i < buffer.length; ++i) {
+          retryHttpRequest(updater(buffer[i].config), buffer[i].deferred);
+        }
+        buffer = [];
+      }
+    };
+  }]);
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/js/angular/login-controllers.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/login-controllers.js b/solr/webapp/web/js/angular/login-controllers.js
new file mode 100644
index 0000000..819ccb3
--- /dev/null
+++ b/solr/webapp/web/js/angular/login-controllers.js
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+'use strict';
+
+function CredentialsController($scope, loginService) {
+    $scope.credentials = { userName: '', password: '' };
+    
+    $scope.submit = function() {
+        loginService.setUserNameAndPassword($scope.credentials.userName, $scope.credentials.password);
+    }
+}
+
+function LoginController($scope, $location, loginService) {
+    $scope.isLoggedIn = function() {
+        return loginService.isLoggedIn();
+    }
+    
+    $scope.logOut = function() {
+        loginService.logOut();
+        $location.path('/about');
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5728c9be/solr/webapp/web/libs/bootstrap.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/libs/bootstrap.js b/solr/webapp/web/libs/bootstrap.js
new file mode 100644
index 0000000..850e6e5
--- /dev/null
+++ b/solr/webapp/web/libs/bootstrap.js
@@ -0,0 +1,2006 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.0.3
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      'WebkitTransition' : 'webkitTransitionEnd'
+    , 'MozTransition'    : 'transitionend'
+    , 'OTransition'      : 'oTransitionEnd otransitionend'
+    , 'transition'       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+  }
+
+  // http://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false, $el = this
+    $(this).one($.support.transition.end, function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.0.3
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = $(selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.hasClass('alert') ? $this : $this.parent()
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      $parent.trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one($.support.transition.end, removeElement)
+        .emulateTransitionEnd(150) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  var old = $.fn.alert
+
+  $.fn.alert = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.0.3
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element = $(element)
+    this.options  = $.extend({}, Button.DEFAULTS, options)
+  }
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state = state + 'Text'
+
+    if (!data.resetText) $el.data('resetText', $el[val]())
+
+    $el[val](data[state] || this.options[state])
+
+    // push to event loop to allow forms to submit
+    setTimeout(function () {
+      state == 'loadingText' ?
+        $el.addClass(d).attr(d, d) :
+        $el.removeClass(d).removeAttr(d);
+    }, 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+    var changed = true
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') === 'radio') {
+        // see if clicking on current one
+        if ($input.prop('checked') && this.$element.hasClass('active'))
+          changed = false
+        else
+          $parent.find('.active').removeClass('active')
+      }
+      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+    }
+
+    if (changed) this.$element.toggleClass('active')
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  var old = $.fn.button
+
+  $.fn.button = function (option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
+    var $btn = $(e.target)
+    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+    $btn.button('toggle')
+    e.preventDefault()
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.0.3
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      =
+    this.sliding     =
+    this.interval    =
+    this.$active     =
+    this.$items      = null
+
+    this.options.pause == 'hover' && this.$element
+      .on('mouseenter', $.proxy(this.pause, this))
+      .on('mouseleave', $.proxy(this.cycle, this))
+  }
+
+  Carousel.DEFAULTS = {
+    interval: 5000
+  , pause: 'hover'
+  , wrap: true
+  }
+
+  Carousel.prototype.cycle =  function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getActiveIndex = function () {
+    this.$active = this.$element.find('.item.active')
+    this.$items  = this.$active.parent().children()
+
+    return this.$items.index(this.$active)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getActiveIndex()
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || $active[type]()
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var fallback  = type == 'next' ? 'first' : 'last'
+    var that      = this
+
+    if (!$next.length) {
+      if (!this.options.wrap) return
+      $next = this.$element.find('.item')[fallback]()
+    }
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
+
+    if ($next.hasClass('active')) return
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      this.$element.one('slid.bs.carousel', function () {
+        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+        $nextIndicator && $nextIndicator.addClass('active')
+      })
+    }
+
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      this.$element.trigger(e)
+      if (e.isDefaultPrevented()) return
+      $next.addClass(type)
+      $next[0].offsetWidth // force reflow
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one($.support.transition.end, function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
+        })
+        .emulateTransitionEnd(600)
+    } else {
+      this.$element.trigger(e)
+      if (e.isDefaultPrevented()) return
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger('slid.bs.carousel')
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  var old = $.fn.carousel
+
+  $.fn.carousel = function (option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+    var $this   = $(this), href
+    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    $target.carousel(options)
+
+    if (slideIndex = $this.attr('data-slide-to')) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  })
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      $carousel.carousel($carousel.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.0.3
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.transitioning = null
+
+    if (this.options.parent) this.$parent = $(this.options.parent)
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.DEFAULTS = {
+    toggle: true
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var actives = this.$parent && this.$parent.find('> .panel > .in')
+
+    if (actives && actives.length) {
+      var hasData = actives.data('bs.collapse')
+      if (hasData && hasData.transitioning) return
+      actives.collapse('hide')
+      hasData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')
+      [dimension](0)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('in')
+        [dimension]('auto')
+      this.transitioning = 0
+      this.$element.trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one($.support.transition.end, $.proxy(complete, this))
+      .emulateTransitionEnd(350)
+      [dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element
+      [dimension](this.$element[dimension]())
+      [0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse')
+      .removeClass('in')
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .trigger('hidden.bs.collapse')
+        .removeClass('collapsing')
+        .addClass('collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one($.support.transition.end, $.proxy(complete, this))
+      .emulateTransitionEnd(350)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  var old = $.fn.collapse
+
+  $.fn.collapse = function (option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
+    var $this   = $(this), href
+    var target  = $this.attr('data-target')
+        || e.preventDefault()
+        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+    var $target = $(target)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $this.data()
+    var parent  = $this.attr('data-parent')
+    var $parent = parent && $(parent)
+
+    if (!data || !data.transitioning) {
+      if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
+      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+    }
+
+    $target.collapse(option)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.0.3
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle=dropdown]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
+      }
+
+      $parent.trigger(e = $.Event('show.bs.dropdown'))
+
+      if (e.isDefaultPrevented()) return
+
+      $parent
+        .toggleClass('open')
+        .trigger('shown.bs.dropdown')
+
+      $this.focus()
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27)/.test(e.keyCode)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if (!isActive || (isActive && e.keyCode == 27)) {
+      if (e.which == 27) $parent.find(toggle).focus()
+      return $this.click()
+    }
+
+    var $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+    if (!$items.length) return
+
+    var index = $items.index($items.filter(':focus'))
+
+    if (e.keyCode == 38 && index > 0)                 index--                        // up
+    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+    if (!~index)                                      index=0
+
+    $items.eq(index).focus()
+  }
+
+  function clearMenus() {
+    $(backdrop).remove()
+    $(toggle).each(function (e) {
+      var $parent = getParent($(this))
+      if (!$parent.hasClass('open')) return
+      $parent.trigger(e = $.Event('hide.bs.dropdown'))
+      if (e.isDefaultPrevented()) return
+      $parent.removeClass('open').trigger('hidden.bs.dropdown')
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    var $parent = selector && $(selector)
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.0.3
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options   = options
+    this.$element  = $(element)
+    this.$backdrop =
+    this.isShown   = null
+
+    if (this.options.remote) this.$element.load(this.options.remote)
+  }
+
+  Modal.DEFAULTS = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.escape()
+
+    this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(document.body) // don't move modals dom position
+      }
+
+      that.$element.show()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element
+        .addClass('in')
+        .attr('aria-hidden', false)
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$element.find('.modal-dialog') // wait for modal to slide in
+          .one($.support.transition.end, function () {
+            that.$element.focus().trigger(e)
+          })
+          .emulateTransitionEnd(300) :
+        that.$element.focus().trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .attr('aria-hidden', true)
+      .off('click.dismiss.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one($.support.transition.end, $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(300) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+          this.$element.focus()
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keyup.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.removeBackdrop()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that    = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+        .appendTo(document.body)
+
+      this.$element.on('click.dismiss.modal', $.proxy(function (e) {
+        if (e.target !== e.currentTarget) return
+        this.options.backdrop == 'static'
+          ? this.$element[0].focus.call(this.$element[0])
+          : this.hide.call(this)
+      }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one($.support.transition.end, callback)
+          .emulateTransitionEnd(150) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      $.support.transition && this.$element.hasClass('fade')?
+        this.$backdrop
+          .one($.support.transition.end, callback)
+          .emulateTransitionEnd(150) :
+        callback()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  var old = $.fn.modal
+
+  $.fn.modal = function (option, _relatedTarget) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    e.preventDefault()
+
+    $target
+      .modal(option, this)
+      .one('hide', function () {
+        $this.is(':visible') && $this.focus()
+      })
+  })
+
+  $(document)
+    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
+    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.0.3
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       =
+    this.options    =
+    this.enabled    =
+    this.timeout    =
+    this.hoverState =
+    this.$element   = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.DEFAULTS = {
+    animation: true
+  , placement: 'top'
+  , selector: false
+  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+  , trigger: 'hover focus'
+  , title: ''
+  , delay: 0
+  , html: false
+  , container: false
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled  = true
+    this.type     = type
+    this.$element = $(element)
+    this.options  = this.getOptions(options)
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay
+      , hide: options.delay
+      }
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.'+ this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      var $tip = this.tip()
+
+      this.setContent()
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+
+      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var $parent = this.$element.parent()
+
+        var orgPlacement = placement
+        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop
+        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()
+        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
+        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left
+
+        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :
+                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :
+                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :
+                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+      this.$element.trigger('shown.bs.' + this.type)
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function(offset, placement) {
+    var replace
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  = offset.top  + marginTop
+    offset.left = offset.left + marginLeft
+
+    $tip
+      .offset(offset)
+      .addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      replace = true
+      offset.top = offset.top + height - actualHeight
+    }
+
+    if (/bottom|top/.test(placement)) {
+      var delta = 0
+
+      if (offset.left < 0) {
+        delta       = offset.left * -2
+        offset.left = 0
+
+        $tip.offset(offset)
+
+        actualWidth  = $tip[0].offsetWidth
+        actualHeight = $tip[0].offsetHeight
+      }
+
+      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+    } else {
+      this.replaceArrow(actualHeight - height, actualHeight, 'top')
+    }
+
+    if (replace) $tip.offset(offset)
+  }
+
+  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {
+    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function () {
+    var that = this
+    var $tip = this.tip()
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && this.$tip.hasClass('fade') ?
+      $tip
+        .one($.support.transition.end, complete)
+        .emulateTransitionEnd(150) :
+      complete()
+
+    this.$element.trigger('hidden.bs.' + this.type)
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function () {
+    var el = this.$element[0]
+    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+      width: el.offsetWidth
+    , height: el.offsetHeight
+    }, this.$element.offset())
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.tip = function () {
+    return this.$tip = this.$tip || $(this.options.template)
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
+  }
+
+  Tooltip.prototype.validate = function () {
+    if (!this.$element[0].parentNode) {
+      this.hide()
+      this.$element = null
+      this.options  = null
+    }
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
+    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+  }
+
+  Tooltip.prototype.destroy = function () {
+    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
+  }
+
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip = function (option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.0.3
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right'
+  , trigger: 'click'
+  , content: ''
+  , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+            o.content.call($e[0]) :
+            o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return this.$arrow = this.$arrow || this.tip().find('.arrow')
+  }
+
+  Popover.prototype.tip = function () {
+    if (!this.$tip) this.$tip = $(this.options.template)
+    return this.$tip
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  var old = $.fn.popover
+
+  $.fn.popover = function (option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.0.3
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    var href
+    var process  = $.proxy(this.process, this)
+
+    this.$element       = $(element).is('body') ? $(window) : $(element)
+    this.$body          = $('body')
+    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target
+      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      || '') + ' .nav li > a'
+    this.offsets        = $([])
+    this.targets        = $([])
+    this.activeTarget   = null
+
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
+
+    this.offsets = $([])
+    this.targets = $([])
+
+    var self     = this
+    var $targets = this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#\w/.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        self.offsets.push(this[0])
+        self.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+    var maxScroll    = scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets.last()[0]) && this.activate(i)
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+        && this.activate( targets[i] )
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    $(this.selector)
+      .parents('.active')
+      .removeClass('active')
+
+    var selector = this.selector
+      + '[data-target="' + target + '"],'
+      + this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length)  {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy = function (option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      $spy.scrollspy($spy.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.0.3
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var previous = $ul.find('.active:last a')[0]
+    var e        = $.Event('show.bs.tab', {
+      relatedTarget: previous
+    })
+
+    $this.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    var $target = $(selector)
+
+    this.activate($this.parent('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $this.trigger({
+        type: 'shown.bs.tab'
+      , relatedTarget: previous
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && $active.hasClass('fade')
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+        .removeClass('active')
+
+      element.addClass('active')
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu')) {
+        element.closest('li.dropdown').addClass('active')
+      }
+
+      callback && callback()
+    }
+
+    transition ?
+      $active
+        .one($.support.transition.end, next)
+        .emulateTransitionEnd(150) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  var old = $.fn.tab
+
+  $.fn.tab = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+    e.preventDefault()
+    $(this).tab('show')
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.0.3
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================================== */
+
+
++function ($) { "use strict";
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+    this.$window = $(window)
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element = $(element)
+    this.affixed  =
+    this.unpin    = null
+
+    this.checkPosition()
+  }
+
+  Affix.RESET = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+    var scrollTop    = this.$window.scrollTop()
+    var position     = this.$element.offset()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top()
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :
+                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
+                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false
+
+    if (this.affixed === affix) return
+    if (this.unpin) this.$element.css('top', '')
+
+    this.affixed = affix
+    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null
+
+    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))
+
+    if (affix == 'bottom') {
+      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  var old = $.fn.affix
+
+  $.fn.affix = function (option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop)    data.offset.top    = data.offsetTop
+
+      $spy.affix(data)
+    })
+  })
+
+}(jQuery);


[14/27] lucene-solr:solr7896-login-page: Testing new approach

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5bb585c3/solr/webapp/web/css/bootstrap.min.css
----------------------------------------------------------------------
diff --git a/solr/webapp/web/css/bootstrap.min.css b/solr/webapp/web/css/bootstrap.min.css
deleted file mode 100644
index c547283..0000000
--- a/solr/webapp/web/css/bootstrap.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.0.3 (http://getbootstrap.com)
- * Copyright 2013 Twitter, Inc.
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
- */
-
-/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{paddi
 ng:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!impo
 rtant}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;
 color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;co
 lor: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:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-
 danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizon
 tal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:aft
 er{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970p
 x}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-x
 s-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-
 5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.c
 ol-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-s
 m-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{wid
 th:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333
 %}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-
 7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col
 -lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;bord
 er-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,
 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table
 >tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.
 table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-respon
 sive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="n
 umber"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-inp
 ut-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio
 [disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#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:#665
 12c;-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;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{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;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{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;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom: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}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .che
 ckbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-use
 r-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;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: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:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.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,.b
 tn-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:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active
 ,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9
 534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{colo
 r:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webk
 it-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:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0
 ;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{
 content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-do
 wnload: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-tex
 t-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"}.gl
 yphicon-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{conten
 t:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px 
 rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding
 :3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-grou
 p .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdo
 wn-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-grou
 p-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-rad
 ius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-gro
 up-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height: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{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-c
 hild),.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>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control
 :last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hov
 er,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-j
 ustified>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:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-
 width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border
 -radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar
 -static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margi
 n-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right
 :last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;pa
 dding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top: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-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;backg
 round-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-colo
 r:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;backgrou
 nd-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.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{color:#fff;background-color:#
 080808}@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:#999}.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:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 
 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagi
 nation>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding: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-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3p
 x;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.
 label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{dis
 play:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:
 block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.aler
 t-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,2
 55,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.1
 5) 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:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.
 15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item
  .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;cont
 ent:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.ta
 ble-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-c
 hild,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.d
 ropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#
 fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.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-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.c
 lose{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;le
 ft:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.too
 ltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#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-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5p
 x 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-co
 lor:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin
 -left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.car
 ousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opa

<TRUNCATED>

[21/27] lucene-solr:solr7896-login-page: WIP

Posted by ja...@apache.org.
WIP


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/7c964580
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/7c964580
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/7c964580

Branch: refs/heads/solr7896-login-page
Commit: 7c964580de6a1407d0371febdd709a8d7884bc8d
Parents: 9012e40
Author: Jan Høydahl <ja...@apache.org>
Authored: Mon Oct 8 12:48:45 2018 +0200
Committer: Jan Høydahl <ja...@apache.org>
Committed: Mon Oct 8 12:48:45 2018 +0200

----------------------------------------------------------------------
 solr/webapp/web/index.html                      |  2 +-
 solr/webapp/web/js/angular/app.js               | 50 ++++++--------------
 solr/webapp/web/js/angular/controllers/login.js | 11 -----
 solr/webapp/web/js/angular/services.js          | 27 +++++------
 4 files changed, 28 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7c964580/solr/webapp/web/index.html
----------------------------------------------------------------------
diff --git a/solr/webapp/web/index.html b/solr/webapp/web/index.html
index 4b83533..0f1478f 100644
--- a/solr/webapp/web/index.html
+++ b/solr/webapp/web/index.html
@@ -141,7 +141,7 @@ limitations under the License.
         <div>
 
           <ul id="menu">
-            <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Logout {{username}}</a></p></li>
+            <li id="login" class="global" ng-class="{active:page=='login'}"><p><a href="#/login">Login {{$root.globals.currentUser.username}} {{$root.globals}}</a></p></li>
             
             <li id="index" class="global" ng-class="{active:page=='index'}"><p><a href="#/">Dashboard</a></p></li>
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7c964580/solr/webapp/web/js/angular/app.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/app.js b/solr/webapp/web/js/angular/app.js
index 36dd07c..3c29fc4 100644
--- a/solr/webapp/web/js/angular/app.js
+++ b/solr/webapp/web/js/angular/app.js
@@ -376,21 +376,18 @@ solrAdminApp.config([
 // NOCOMMIT First iteration    
 .factory('authInterceptor', function($q, $rootScope, $location, $timeout, $injector) {
   var started = function(config) {
-    console.log("Request config: " + JSON.stringify(config, undefined, 2));
-    // var ah = "Basic c29scjpyb2Nrcw==";  // solr / SolrRocks
-    // config.headers['Authorization'] = ah;
-    // console.log("Added authorization header " + ah);
-    if (sessionStorage.getItem("auth.header") !== null) {
-      if (config.headers['Authorization'] === null) {
-        config.headers['Authorization'] = sessionStorage.getItem("auth.header");
-        console.log("We have a logged in user with header " + sessionStorage.getItem("auth.username") + ", appending header");
-      }
+    console.log("Request config headers: " + JSON.stringify(config.headers, undefined, 2));
+    if (sessionStorage.getItem("auth.header") && !config.headers['Authorization']) {
+      config.headers['Authorization'] = sessionStorage.getItem("auth.header");
+      console.log("We have a logged in user with header " + sessionStorage.getItem("auth.username") + ", appending header " + sessionStorage.getItem("auth.header"));
+    } else {
+      console.log("Not adding headers. Have auth.username=" + sessionStorage.getItem("auth.username") + ", auth.header=" + sessionStorage.getItem("auth.header") + ", config.headers=" + config.headers['Authorization']);
     }
     return config || $q.when(config);
   };
 
   var ended = function(response) {
-    console.log("Response headers: " + JSON.stringify(response.headers(), undefined, 2));
+    // console.log("Response headers: " + JSON.stringify(response.headers(), undefined, 2));
     return response || $q.when(response);
   };
 
@@ -410,15 +407,19 @@ solrAdminApp.config([
       var authType = wwwAuthHeader.split(" ")[0];
       console.log("AuthType is: " + authType);
       sessionStorage.setItem("auth.type", authType);
-      sessionStorage.setItem("auth.location", $location.path());
+      if ($location.path() === '/login') {
+        sessionStorage.setItem("auth.location", "/");
+      } else {
+        sessionStorage.setItem("auth.location", $location.path());
+      }
       sessionStorage.removeItem("auth.username");
       sessionStorage.removeItem("auth.header");
+      // $http.defaults.headers.common.Authorization = null;
       $location.path('/login');
     } else {
       console.log("Rejection status is " + rejection.status)
-    }
-    $rootScope.$broadcast('loadingStatusInactive');
-    return $q.reject(rejection);
+      $rootScope.$broadcast('loadingStatusInactive');
+      return $q.reject(rejection);    }
   };
 
   return {request: started, response: ended, responseError: failed};
@@ -429,27 +430,6 @@ solrAdminApp.config([
   // Force BasicAuth plugin to serve us a 'Authorization: xBasic xxxx' header so browser will not pop up login dialogue
   $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
 })
-    
-    
-// NOCOMMIT: just for testing     
-// .run(['$rootScope', '$location', '$cookieStore', '$http',
-//   function ($rootScope, $location, $cookieStore, $http) {
-//     // keep user logged in after page refresh
-//     // Replace with interceptor
-//     $rootScope.globals = $cookieStore.get('globals') || {};
-//     if ($rootScope.globals.currentUser) {
-//       $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
-//     }
-//
-//     // $rootScope.$on('$locationChangeStart', function (event, next, current) {
-//     //   // redirect to login page if not logged in
-//     //   if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
-//     //     $location.path('/login');
-//     //   }
-//     // });
-//   }])
-
-    
 .directive('fileModel', function ($parse) {
   return {
     restrict: 'A',

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7c964580/solr/webapp/web/js/angular/controllers/login.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/controllers/login.js b/solr/webapp/web/js/angular/controllers/login.js
index a67119c8..174a491 100644
--- a/solr/webapp/web/js/angular/controllers/login.js
+++ b/solr/webapp/web/js/angular/controllers/login.js
@@ -37,17 +37,6 @@ solrAdminApp.controller('LoginController',
           AuthenticationService.SetCredentials($scope.username, $scope.password);
           console.log("Redirecting back to " + $scope.authLocation);
           $location.path($scope.authLocation); // Redirect to the location that caused the login prompt
-          
-          // TODO: "login" by hitting the failing URL again
-          // AuthenticationService.Login($scope.username, $scope.password, function (response) {
-          //   if (response.success) {
-          //     AuthenticationService.SetCredentials($scope.username, $scope.password);
-          //     $location.path('/');
-          //   } else {
-          //     $scope.error = response.message;
-          //     $scope.dataLoading = false;
-          //   }
-          // });
         };
         
         $scope.logout = function() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7c964580/solr/webapp/web/js/angular/services.js
----------------------------------------------------------------------
diff --git a/solr/webapp/web/js/angular/services.js b/solr/webapp/web/js/angular/services.js
index 323bc8e..8f2d443 100644
--- a/solr/webapp/web/js/angular/services.js
+++ b/solr/webapp/web/js/angular/services.js
@@ -293,30 +293,27 @@ solrAdminServices.factory('System',
         service.SetCredentials = function (username, password) {
           var authdata = Base64.encode(username + ':' + password);
 
-          sessionStorage.setItem("auth.username", username);
-          $rootScope.username = username;
-
-          $rootScope.globals = {
-            currentUser: {
-              username: username,
-              authdata: authdata
-            }
-          };
-
-          // $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
-          $http.defaults.headers.common.Authorization = 'Basic ' + authdata;
-          // sessionStorage.setItem('globals', $rootScope.globals);
+          // $rootScope.globals = {
+          //   currentUser: {
+          //     username: username,
+          //     authdata: authdata
+          //   }
+          // };
+          //
+          sessionStorage.setItem('globals', $rootScope.globals);
           sessionStorage.setItem("auth.header", authdata);
+          sessionStorage.setItem("auth.username", username);
+          // $http.defaults.headers.common.Authorization = authdata;
           console.log("Stored auth data on session storage");
         };
 
         service.ClearCredentials = function () {
           $rootScope.globals = {};
-          // sessionStorage.removeItem('globals');
+          sessionStorage.removeItem('globals');
           sessionStorage.removeItem("auth.header");
           sessionStorage.removeItem("auth.username");
           sessionStorage.removeItem("auth.wwwAuthHeader");
-          $http.defaults.headers.common.Authorization = null;
+          // $http.defaults.headers.common.Authorization = null;
           console.log("Cleared stored auth data");
         };