You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@doris.apache.org by GitBox <gi...@apache.org> on 2018/11/09 06:30:11 UTC

[GitHub] imay closed pull request #290: Fix some license

imay closed pull request #290: Fix some license
URL: https://github.com/apache/incubator-doris/pull/290
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/LICENSE.txt b/LICENSE.txt
index 44ec0246..fc21cb8e 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -353,3 +353,104 @@ be/src/util/murmur_hash3.cpp : licensed under the following terms:
   MurmurHash3 was written by Austin Appleby, and is placed in the public
   omain. The author hereby disclaims copyright to this source code.
 
+--------------------------------------------------------------------------------
+
+webroot/static/jquery.js : MIT license
+
+  Copyright 2005, 2014 jQuery Foundation and other contributors,
+    https://jquery.org/
+
+  This software consists of voluntary contributions made by many individuals. For exact
+  contribution history, see the revision history available at
+  https://github.com/jquery/jquery
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy of this
+  software and associated documentation files (the "Software"), to deal in the Software
+  without restriction, including without limitation the rights to use, copy, modify,
+  merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+  permit persons to whom the Software is furnished to do so, subject to the following
+  conditions:
+
+  The above copyright notice and this permission notice shall be
+    included in all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+  INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+  PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+  OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+  OTHER DEALINGS IN THE SOFTWARE.
+
+--------------------------------------------------------------------------------
+
+jquery.dataTables.js and webroot/static/datatables*: MIT license
+
+  Copyright (C) 2008-2015, SpryMedia Ltd.
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy of this
+  software and associated documentation files (the "Software"), to deal in the Software
+  without restriction, including without limitation the rights to use, copy, modify,
+  merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+  permit persons to whom the Software is furnished to do so, subject to the following
+  conditions:
+
+  The above copyright notice and this permission notice shall be included in all copies or
+  substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+  INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+  PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+  OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+  OTHER DEALINGS IN THE SOFTWARE.
+
+--------------------------------------------------------------------------------
+
+webroot/static/bootstrap.css: MIT license
+
+  The MIT License (MIT)
+
+  Copyright (c) 2011-2015 Twitter, Inc.
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy of this
+  software and associated documentation files (the "Software"), to deal in the Software
+  without restriction, including without limitation the rights to use, copy, modify,
+  merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+  permit persons to whom the Software is furnished to do so, subject to the following
+  conditions:
+
+  The above copyright notice and this permission notice shall be included in all copies or
+  substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+  INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+  PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+  OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+  OTHER DEALINGS IN THE SOFTWARE.
+
+--------------------------------------------------------------------------------
+
+normalize.css embedded in webroot/static/bootstrap.css: MIT
+
+Copyright (c) Nicolas Gallagher and Jonathan Neal
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
diff --git a/be/test/olap/CMakeLists.txt b/be/test/olap/CMakeLists.txt
index e743c68b..5d169e49 100644
--- a/be/test/olap/CMakeLists.txt
+++ b/be/test/olap/CMakeLists.txt
@@ -1,3 +1,20 @@
+# 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.
+
 # where to put generated libraries
 set(LIBRARY_OUTPUT_PATH "${BUILD_DIR}/test/olap")
 
diff --git a/docs/Makefile b/docs/Makefile
index 032dee9f..d337c209 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1,3 +1,21 @@
+# 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.
+
+#
 # This file build all docs
 #
 
diff --git a/fe/src/main/java/org/apache/doris/http/action/WebBaseAction.java b/fe/src/main/java/org/apache/doris/http/action/WebBaseAction.java
index 565a952f..f87f079c 100644
--- a/fe/src/main/java/org/apache/doris/http/action/WebBaseAction.java
+++ b/fe/src/main/java/org/apache/doris/http/action/WebBaseAction.java
@@ -74,7 +74,6 @@
             + "  <script type=\"text/javascript\"> " + LINE_SEP
             + "    $(document).ready(function() { " + LINE_SEP
             + "      $('#table_id').dataTable({ " + LINE_SEP
-            + "        \"sScrollX\": \"100%\"," + LINE_SEP
             + "        \"aaSorting\": []," + LINE_SEP
             +       " });" + LINE_SEP
             + "    }); " + LINE_SEP
@@ -89,24 +88,14 @@
             + "<body>";
     protected static final String PAGE_FOOTER = "</div></body></html>";
     protected static final String NAVIGATION_BAR_PREFIX =
-              "  <div class=\"navbar navbar-inverse navbar-fixed-top\">"
-            + "    <div class=\"navbar-inner\">"
-            + "      <div class=\"container\">"
-            + "        <a class=\"btn btn-navbar\" data-toggle=\"collapse\" "
-            + "            data-target=\".nav-collapse\">"
-            + "          <span class=\"icon-bar\"></span>"
-            + "          <span class=\"icon-bar\"></span>"
-            + "          <span class=\"icon-bar\"></span>"
-            + "        </a>"
-            + "        <a class=\"brand\" href=\"/\">Palo</a>"
-            + "        <div class=\"nav-collapse collapse\">"
-            + "          <ul class=\"nav\">";
+              "  <nav class=\"navbar navbar-inverse navbar-fixed-top\" role=\"navigation\" style=\"text-align: center;\">"
+            + "    <div class=\"container-fluid\">"
+            + "    <div>"
+            + "      <ul class=\"nav nav-pills\" role=\"tablist\" style=\"display: inline-block;float: none; \">";
     protected static final String NAVIGATION_BAR_SUFFIX =
-              "          </ul>"
-            + "        </div>"
-            + "      </div>"
+              "      </ul>"
             + "    </div>"
-            + "  </div>"
+            + "  </nav>"
             + "  <div class=\"container\">";
 
     public WebBaseAction(ActionController controller) {
@@ -238,6 +227,9 @@ protected void getPageHeader(BaseRequest request, StringBuilder sb) {
         sb.append(NAVIGATION_BAR_PREFIX);
 
         // TODO(lingbin): maybe should change to register the menu item?
+        sb.append("<li class=\"active\"><a href=\"/\">")
+            .append("Doris")
+            .append("</a></li>");
         if (request.isAuthorized()) {
             sb.append("<li><a href=\"/system\">")
                     .append("system")
@@ -263,7 +255,7 @@ protected void getPageHeader(BaseRequest request, StringBuilder sb) {
         }
         sb.append("<li><a href=\"/help\">")
                 .append("help")
-                .append("</a></li>");
+                .append("</a></li></tr>");
 
         sb.append(NAVIGATION_BAR_SUFFIX);
     }
diff --git a/webroot/static/bootstrap.css b/webroot/static/bootstrap.css
index eb5f6831..42c79d6e 100644
--- a/webroot/static/bootstrap.css
+++ b/webroot/static/bootstrap.css
@@ -1,3 +1,17 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+html {
+  font-family: sans-serif;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+}
 article,
 aside,
 details,
@@ -6,4950 +20,6741 @@ figure,
 footer,
 header,
 hgroup,
+main,
+menu,
 nav,
-section {
-    display: block;
+section,
+summary {
+  display: block;
 }
 audio,
 canvas,
+progress,
 video {
-    display: inline-block;
-    *display: inline;
-    *zoom: 1;
-}  
+  display: inline-block;
+  vertical-align: baseline;
+}
 audio:not([controls]) {
-    display: none;
+  display: none;
+  height: 0;
 }
-html {
-    font-size: 100%;
-    -webkit-text-size-adjust: 100%;
-        -ms-text-size-adjust: 100%;
+[hidden],
+template {
+  display: none;
 }
-a:focus {
-    outline: thin dotted #333;
-    outline: 5px auto -webkit-focus-ring-color;
-    outline-offset: -2px;
+a {
+  background-color: transparent;
 }
-a:hover,
-a:active {
-    outline: 0;
+a:active,
+a:hover {
+  outline: 0;
+}
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+b,
+strong {
+  font-weight: bold;
+}
+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;
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
 }
 sup {
-    top: -0.5em;
+  top: -.5em;
 }
 sub {
-    bottom: -0.25em;
+  bottom: -.25em;
 }
 img {
-    width: auto\9;
-    height: auto;
-    max-width: 100%;
-    vertical-align: middle;
-    border: 0;
-    -ms-interpolation-mode: bicubic;
+  border: 0;
 }
-#map_canvas img,
-.google-maps img {
-    max-width: none;
+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;
+  font-size: 1em;
 }
 button,
 input,
+optgroup,
 select,
 textarea {
-    margin: 0;
-    font-size: 100%;
-    vertical-align: middle;
+  margin: 0;
+  font: inherit;
+  color: inherit;
 }
-button,
-input {
-  *overflow: visible;
-  line-height: normal;
+button {
+  overflow: visible;
 }
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-    padding: 0;
-    border: 0;
+button,
+select {
+  text-transform: none;
 }
 button,
 html input[type="button"],
 input[type="reset"],
 input[type="submit"] {
-    cursor: pointer;
-    -webkit-appearance: button;
+  -webkit-appearance: button;
+  cursor: pointer;
 }
-input[type="search"] {
-    -webkit-box-sizing: content-box;
-       -moz-box-sizing: content-box;
-            box-sizing: content-box;
-    -webkit-appearance: textfield;
+button[disabled],
+html input[disabled] {
+  cursor: default;
 }
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
-    -webkit-appearance: none;
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
 }
-textarea {
-    overflow: auto;
-    vertical-align: top;
+input {
+  line-height: normal;
 }
-.clearfix {
-    *zoom: 1;
+input[type="checkbox"],
+input[type="radio"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  padding: 0;
 }
-.clearfix:before,
-.clearfix:after {
-    display: table;
-    line-height: 0;
-    content: "";
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
 }
-.clearfix:after {
-    clear: both;
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
 }
-.hide-text {
-    font: 0/0 a;
-    color: transparent;
-    text-shadow: none;
-    background-color: transparent;
-    border: 0;
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
 }
-.input-block-level {
-    display: block;
-    width: 100%;
-    min-height: 30px;
-    -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-            box-sizing: border-box;
+fieldset {
+  padding: .35em .625em .75em;
+  margin: 0 2px;
+  border: 1px solid #c0c0c0;
 }
-body {
-    margin: 0;
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-    font-size: 14px;
-    line-height: 20px;
-    color: #333333;
-    background-color: #ffffff;
+legend {
+  padding: 0;
+  border: 0;
 }
-a {
-    color: #0088cc;
-    text-decoration: none;
+textarea {
+  overflow: auto;
 }
-a:hover {
-    color: #005580;
+optgroup {
+  font-weight: bold;
+}
+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 {
+  *,
+  *:before,
+  *:after {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !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^="#"]:after,
+  a[href^="javascript:"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  .navbar {
+    display: none;
+  }
+  .btn > .caret,
+  .dropup > .btn > .caret {
+    border-top-color: #000 !important;
+  }
+  .label {
+    border: 1px solid #000;
+  }
+  .table {
+    border-collapse: collapse !important;
+  }
+  .table td,
+  .table th {
+    background-color: #fff !important;
+  }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important;
+  }
+}
+@font-face {
+  font-family: 'Glyphicons Halflings';
+
+  src: url('../fonts/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: normal;
+  line-height: 1;
+
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
 }
-.img-rounded {
-    -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
-            border-radius: 6px;
-}
-.img-polaroid {
-    padding: 4px;
-    background-color: #fff;
-    border: 1px solid #ccc;
-    border: 1px solid rgba(0, 0, 0, 0.2);
-    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-       -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+.glyphicon-asterisk:before {
+  content: "\002a";
 }
-.img-circle {
-    -webkit-border-radius: 500px;
-       -moz-border-radius: 500px;
-            border-radius: 500px;
+.glyphicon-plus:before {
+  content: "\002b";
 }
-.row {
-    margin-left: -20px;
-    *zoom: 1;
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+  content: "\20ac";
 }
-.row:before,
-.row:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.glyphicon-minus:before {
+  content: "\2212";
 }
-.row:after {
-    clear: both;
+.glyphicon-cloud:before {
+  content: "\2601";
 }
-[class*="span"] {
-    float: left;
-    min-height: 1px;
-    margin-left: 20px;
+.glyphicon-envelope:before {
+  content: "\2709";
 }
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-    width: 1280px;
+.glyphicon-pencil:before {
+  content: "\270f";
 }
-.span12 {
-    width: 940px;
+.glyphicon-glass:before {
+  content: "\e001";
 }
-.span11 {
-    width: 860px;
+.glyphicon-music:before {
+  content: "\e002";
 }
-.span10 {
-    width: 780px;
+.glyphicon-search:before {
+  content: "\e003";
 }
-.span9 {
-    width: 700px;
+.glyphicon-heart:before {
+  content: "\e005";
 }
-.span8 {
-    width: 620px;
+.glyphicon-star:before {
+  content: "\e006";
 }
-.span7 {
-    width: 540px;
+.glyphicon-star-empty:before {
+  content: "\e007";
 }
-.span6 {
-    width: 460px;
+.glyphicon-user:before {
+  content: "\e008";
 }
-.span5 {
-    width: 380px;
+.glyphicon-film:before {
+  content: "\e009";
 }
-.span4 {
-    width: 300px;
+.glyphicon-th-large:before {
+  content: "\e010";
 }
-.span3 {
-    width: 220px;
+.glyphicon-th:before {
+  content: "\e011";
 }
-.span2 {
-    width: 140px;
+.glyphicon-th-list:before {
+  content: "\e012";
 }
-.span1 {
-    width: 60px;
+.glyphicon-ok:before {
+  content: "\e013";
 }
-.offset12 {
-    margin-left: 980px;
+.glyphicon-remove:before {
+  content: "\e014";
 }
-.offset11 {
-    margin-left: 900px;
+.glyphicon-zoom-in:before {
+  content: "\e015";
 }
-.offset10 {
-    margin-left: 820px;
+.glyphicon-zoom-out:before {
+  content: "\e016";
 }
-.offset9 {
-    margin-left: 740px;
+.glyphicon-off:before {
+  content: "\e017";
 }
-.offset8 {
-    margin-left: 660px;
+.glyphicon-signal:before {
+  content: "\e018";
 }
-.offset7 {
-    margin-left: 580px;
+.glyphicon-cog:before {
+  content: "\e019";
 }
-.offset6 {
-    margin-left: 500px;
+.glyphicon-trash:before {
+  content: "\e020";
 }
-.offset5 {
-    margin-left: 420px;
+.glyphicon-home:before {
+  content: "\e021";
 }
-.offset4 {
-    margin-left: 340px;
+.glyphicon-file:before {
+  content: "\e022";
 }
-.offset3 {
-    margin-left: 260px;
+.glyphicon-time:before {
+  content: "\e023";
 }
-.offset2 {
-    margin-left: 180px;
+.glyphicon-road:before {
+  content: "\e024";
 }
-.offset1 {
-    margin-left: 100px;
+.glyphicon-download-alt:before {
+  content: "\e025";
 }
-.row-fluid {
-    width: 100%;
-    *zoom: 1;
+.glyphicon-download:before {
+  content: "\e026";
 }
-.row-fluid:before,
-.row-fluid:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.glyphicon-upload:before {
+  content: "\e027";
 }
-.row-fluid:after {
-    clear: both;
+.glyphicon-inbox:before {
+  content: "\e028";
 }
-.row-fluid [class*="span"] {
-    display: block;
-    float: left;
-    width: 100%;
-    min-height: 30px;
-    margin-left: 2.127659574468085%;
-    *margin-left: 2.074468085106383%;
-    -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-            box-sizing: border-box;
-}
-.row-fluid [class*="span"]:first-child {
-    margin-left: 0;
+.glyphicon-play-circle:before {
+  content: "\e029";
 }
-.row-fluid .controls-row [class*="span"] + [class*="span"] {
-    margin-left: 2.127659574468085%;
+.glyphicon-repeat:before {
+  content: "\e030";
 }
-.row-fluid .span12 {
-    width: 100%;
-    *width: 99.94680851063829%;
+.glyphicon-refresh:before {
+  content: "\e031";
 }
-.row-fluid .span11 {
-    width: 91.48936170212765%;
-    *width: 91.43617021276594%;
+.glyphicon-list-alt:before {
+  content: "\e032";
 }
-.row-fluid .span10 {
-    width: 82.97872340425532%;
-    *width: 82.92553191489361%;
+.glyphicon-lock:before {
+  content: "\e033";
 }
-.row-fluid .span9 {
-    width: 74.46808510638297%;
-    *width: 74.41489361702126%;
+.glyphicon-flag:before {
+  content: "\e034";
 }
-.row-fluid .span8 {
-    width: 65.95744680851064%;
-    *width: 65.90425531914893%;
+.glyphicon-headphones:before {
+  content: "\e035";
 }
-.row-fluid .span7 {
-    width: 57.44680851063829%;
-    *width: 57.39361702127659%;
+.glyphicon-volume-off:before {
+  content: "\e036";
 }
-.row-fluid .span6 {
-    width: 48.93617021276595%;
-    *width: 48.88297872340425%;
+.glyphicon-volume-down:before {
+  content: "\e037";
 }
-.row-fluid .span5 {
-    width: 40.42553191489362%;
-    *width: 40.37234042553192%;
+.glyphicon-volume-up:before {
+  content: "\e038";
 }
-.row-fluid .span4 {
-    width: 31.914893617021278%;
-    *width: 31.861702127659576%;
+.glyphicon-qrcode:before {
+  content: "\e039";
 }
-.row-fluid .span3 {
-    width: 23.404255319148934%;
-    *width: 23.351063829787233%;
+.glyphicon-barcode:before {
+  content: "\e040";
 }
-.row-fluid .span2 {
-    width: 14.893617021276595%;
-    *width: 14.840425531914894%;
+.glyphicon-tag:before {
+  content: "\e041";
 }
-.row-fluid .span1 {
-    width: 6.382978723404255%;
-    *width: 6.329787234042553%;
+.glyphicon-tags:before {
+  content: "\e042";
 }
-.row-fluid .offset12 {
-    margin-left: 104.25531914893617%;
-    *margin-left: 104.14893617021275%;
+.glyphicon-book:before {
+  content: "\e043";
 }
-.row-fluid .offset12:first-child {
-    margin-left: 102.12765957446808%;
-    *margin-left: 102.02127659574467%;
+.glyphicon-bookmark:before {
+  content: "\e044";
 }
-.row-fluid .offset11 {
-    margin-left: 95.74468085106382%;
-    *margin-left: 95.6382978723404%;
+.glyphicon-print:before {
+  content: "\e045";
 }
-.row-fluid .offset11:first-child {
-    margin-left: 93.61702127659574%;
-    *margin-left: 93.51063829787232%;
+.glyphicon-camera:before {
+  content: "\e046";
 }
-.row-fluid .offset10 {
-    margin-left: 87.23404255319149%;
-    *margin-left: 87.12765957446807%;
+.glyphicon-font:before {
+  content: "\e047";
 }
-.row-fluid .offset10:first-child {
-    margin-left: 85.1063829787234%;
-    *margin-left: 84.99999999999999%;
+.glyphicon-bold:before {
+  content: "\e048";
 }
-.row-fluid .offset9 {
-    margin-left: 78.72340425531914%;
-    *margin-left: 78.61702127659572%;
+.glyphicon-italic:before {
+  content: "\e049";
 }
-.row-fluid .offset9:first-child {
-    margin-left: 76.59574468085106%;
-    *margin-left: 76.48936170212764%;
+.glyphicon-text-height:before {
+  content: "\e050";
 }
-.row-fluid .offset8 {
-    margin-left: 70.2127659574468%;
-    *margin-left: 70.10638297872339%;
+.glyphicon-text-width:before {
+  content: "\e051";
 }
-.row-fluid .offset8:first-child {
-    margin-left: 68.08510638297872%;
-    *margin-left: 67.9787234042553%;
+.glyphicon-align-left:before {
+  content: "\e052";
 }
-.row-fluid .offset7 {
-    margin-left: 61.70212765957446%;
-    *margin-left: 61.59574468085106%;
+.glyphicon-align-center:before {
+  content: "\e053";
 }
-.row-fluid .offset7:first-child {
-    margin-left: 59.574468085106375%;
-    *margin-left: 59.46808510638297%;
+.glyphicon-align-right:before {
+  content: "\e054";
 }
-.row-fluid .offset6 {
-    margin-left: 53.191489361702125%;
-    *margin-left: 53.085106382978715%;
+.glyphicon-align-justify:before {
+  content: "\e055";
 }
-.row-fluid .offset6:first-child {
-    margin-left: 51.063829787234035%;
-    *margin-left: 50.95744680851063%;
+.glyphicon-list:before {
+  content: "\e056";
 }
-.row-fluid .offset5 {
-    margin-left: 44.68085106382979%;
-    *margin-left: 44.57446808510638%;
+.glyphicon-indent-left:before {
+  content: "\e057";
 }
-.row-fluid .offset5:first-child {
-    margin-left: 42.5531914893617%;
-    *margin-left: 42.4468085106383%;
+.glyphicon-indent-right:before {
+  content: "\e058";
 }
-.row-fluid .offset4 {
-    margin-left: 36.170212765957444%;
-    *margin-left: 36.06382978723405%;
+.glyphicon-facetime-video:before {
+  content: "\e059";
 }
-.row-fluid .offset4:first-child {
-    margin-left: 34.04255319148936%;
-    *margin-left: 33.93617021276596%;
+.glyphicon-picture:before {
+  content: "\e060";
 }
-.row-fluid .offset3 {
-    margin-left: 27.659574468085104%;
-    *margin-left: 27.5531914893617%;
+.glyphicon-map-marker:before {
+  content: "\e062";
 }
-.row-fluid .offset3:first-child {
-    margin-left: 25.53191489361702%;
-    *margin-left: 25.425531914893618%;
+.glyphicon-adjust:before {
+  content: "\e063";
 }
-.row-fluid .offset2 {
-    margin-left: 19.148936170212764%;
-    *margin-left: 19.04255319148936%;
+.glyphicon-tint:before {
+  content: "\e064";
 }
-.row-fluid .offset2:first-child {
-    margin-left: 17.02127659574468%;
-    *margin-left: 16.914893617021278%;
+.glyphicon-edit:before {
+  content: "\e065";
 }
-.row-fluid .offset1 {
-    margin-left: 10.638297872340425%;
-    *margin-left: 10.53191489361702%;
+.glyphicon-share:before {
+  content: "\e066";
 }
-.row-fluid .offset1:first-child {
-    margin-left: 8.51063829787234%;
-    *margin-left: 8.404255319148938%;
+.glyphicon-check:before {
+  content: "\e067";
 }
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
-    display: none;
+.glyphicon-move:before {
+  content: "\e068";
 }
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
-    float: right;
+.glyphicon-step-backward:before {
+  content: "\e069";
 }
-.container {
-    margin-right: auto;
-    margin-left: auto;
-    *zoom: 1;
+.glyphicon-fast-backward:before {
+  content: "\e070";
 }
-.container:before,
-.container:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.glyphicon-backward:before {
+  content: "\e071";
 }
-.container:after {
-    clear: both;
+.glyphicon-play:before {
+  content: "\e072";
 }
-.container-fluid {
-    padding-right: 20px;
-    padding-left: 20px;
-    *zoom: 1;
+.glyphicon-pause:before {
+  content: "\e073";
 }
-.container-fluid:before,
-.container-fluid:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.glyphicon-stop:before {
+  content: "\e074";
 }
-.container-fluid:after {
-    clear: both;
+.glyphicon-forward:before {
+  content: "\e075";
 }
-p {
-    margin: 0 0 10px;
+.glyphicon-fast-forward:before {
+  content: "\e076";
 }
-.lead {
-    margin-bottom: 20px;
-    font-size: 21px;
-    font-weight: 200;
-    line-height: 30px;
+.glyphicon-step-forward:before {
+  content: "\e077";
 }
-small {
-    font-size: 85%;
+.glyphicon-eject:before {
+  content: "\e078";
 }
-strong {
-    font-weight: bold;
+.glyphicon-chevron-left:before {
+  content: "\e079";
 }
-em {
-    font-style: italic;
+.glyphicon-chevron-right:before {
+  content: "\e080";
 }
-cite {
-    font-style: normal;
+.glyphicon-plus-sign:before {
+  content: "\e081";
 }
-.muted {
-    color: #999999;
+.glyphicon-minus-sign:before {
+  content: "\e082";
 }
-.text-warning {
-    color: #c09853;
+.glyphicon-remove-sign:before {
+  content: "\e083";
 }
-a.text-warning:hover {
-    color: #a47e3c;
+.glyphicon-ok-sign:before {
+  content: "\e084";
 }
-.text-error {
-    color: #b94a48;
+.glyphicon-question-sign:before {
+  content: "\e085";
 }
-a.text-error:hover {
-    color: #953b39;
+.glyphicon-info-sign:before {
+  content: "\e086";
 }
-.text-info {
-    color: #3a87ad;
+.glyphicon-screenshot:before {
+  content: "\e087";
 }
-a.text-info:hover {
-    color: #2d6987;
+.glyphicon-remove-circle:before {
+  content: "\e088";
 }
-.text-success {
-    color: #468847;
+.glyphicon-ok-circle:before {
+  content: "\e089";
 }
-a.text-success:hover {
-    color: #356635;
+.glyphicon-ban-circle:before {
+  content: "\e090";
 }
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-    margin: 10px 0;
-    font-family: inherit;
-    font-weight: bold;
-    line-height: 20px;
-    color: inherit;
-    text-rendering: optimizelegibility;
+.glyphicon-arrow-left:before {
+  content: "\e091";
 }
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
-    font-weight: normal;
-    line-height: 1;
-    color: #999999;
+.glyphicon-arrow-right:before {
+  content: "\e092";
 }
-h1,
-h2,
-h3 {
-    line-height: 40px;
+.glyphicon-arrow-up:before {
+  content: "\e093";
 }
-h1 {
-    font-size: 38.5px;
+.glyphicon-arrow-down:before {
+  content: "\e094";
 }
-h2 {
-    font-size: 31.5px;
+.glyphicon-share-alt:before {
+  content: "\e095";
 }
-h3 {
-    font-size: 24.5px;
+.glyphicon-resize-full:before {
+  content: "\e096";
 }
-h4 {
-    font-size: 17.5px;
+.glyphicon-resize-small:before {
+  content: "\e097";
 }
-h5 {
-    font-size: 14px;
+.glyphicon-exclamation-sign:before {
+  content: "\e101";
 }
-h6 {
-    font-size: 11.9px;
+.glyphicon-gift:before {
+  content: "\e102";
 }
-h1 small {
-    font-size: 24.5px;
+.glyphicon-leaf:before {
+  content: "\e103";
 }
-h2 small {
-    font-size: 17.5px;
+.glyphicon-fire:before {
+  content: "\e104";
 }
-h3 small {
-    font-size: 14px;
+.glyphicon-eye-open:before {
+  content: "\e105";
 }
-h4 small {
-    font-size: 14px;
+.glyphicon-eye-close:before {
+  content: "\e106";
 }
-.page-header {
-    padding-bottom: 9px;
-    margin: 20px 0 30px;
-    border-bottom: 1px solid #eeeeee;
+.glyphicon-warning-sign:before {
+  content: "\e107";
 }
-ul,
-ol {
-    padding: 0;
-    margin: 0 0 10px 25px;
+.glyphicon-plane:before {
+  content: "\e108";
 }
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-    margin-bottom: 0;
+.glyphicon-calendar:before {
+  content: "\e109";
 }
-li {
-    line-height: 20px;
+.glyphicon-random:before {
+  content: "\e110";
 }
-ul.unstyled,
-ol.unstyled {
-    margin-left: 0;
-    list-style: none;
+.glyphicon-comment:before {
+  content: "\e111";
 }
-dl {
-    margin-bottom: 20px;
+.glyphicon-magnet:before {
+  content: "\e112";
 }
-dt,
-dd {
-    line-height: 20px;
+.glyphicon-chevron-up:before {
+  content: "\e113";
 }
-dt {
-    font-weight: bold;
+.glyphicon-chevron-down:before {
+  content: "\e114";
 }
-dd {
-    margin-left: 10px;
+.glyphicon-retweet:before {
+  content: "\e115";
 }
-.dl-horizontal {
-    *zoom: 1;
+.glyphicon-shopping-cart:before {
+  content: "\e116";
 }
-.dl-horizontal:before,
-.dl-horizontal:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.glyphicon-folder-close:before {
+  content: "\e117";
 }
-.dl-horizontal:after {
-    clear: both;
+.glyphicon-folder-open:before {
+  content: "\e118";
 }
-.dl-horizontal dt {
-    float: left;
-    width: 160px;
-    overflow: hidden;
-    clear: left;
-    text-align: right;
-    text-overflow: ellipsis;
-    white-space: nowrap;
+.glyphicon-resize-vertical:before {
+  content: "\e119";
 }
-.dl-horizontal dd {
-    margin-left: 180px;
+.glyphicon-resize-horizontal:before {
+  content: "\e120";
 }
-hr {
-    margin: 20px 0;
-    border: 0;
-    border-top: 1px solid #eeeeee;
-    border-bottom: 1px solid #ffffff;
+.glyphicon-hdd:before {
+  content: "\e121";
 }
-abbr[title],
-abbr[data-original-title] {
-    cursor: help;
-    border-bottom: 1px dotted #999999;
+.glyphicon-bullhorn:before {
+  content: "\e122";
 }
-abbr.initialism {
-    font-size: 90%;
-    text-transform: uppercase;
+.glyphicon-bell:before {
+  content: "\e123";
 }
-blockquote {
-    padding: 0 0 0 15px;
-    margin: 0 0 20px;
-    border-left: 5px solid #eeeeee;
+.glyphicon-certificate:before {
+  content: "\e124";
 }
-blockquote p {
-    margin-bottom: 0;
-    font-size: 16px;
-    font-weight: 300;
-    line-height: 25px;
+.glyphicon-thumbs-up:before {
+  content: "\e125";
 }
-blockquote small {
-    display: block;
-    line-height: 20px;
-    color: #999999;
+.glyphicon-thumbs-down:before {
+  content: "\e126";
 }
-blockquote small:before {
-    content: '\2014 \00A0';
+.glyphicon-hand-right:before {
+  content: "\e127";
 }
-blockquote.pull-right {
-    float: right;
-    padding-right: 15px;
-    padding-left: 0;
-    border-right: 5px solid #eeeeee;
-    border-left: 0;
+.glyphicon-hand-left:before {
+  content: "\e128";
 }
-blockquote.pull-right p,
-blockquote.pull-right small {
-    text-align: right;
+.glyphicon-hand-up:before {
+  content: "\e129";
 }
-blockquote.pull-right small:before {
-    content: '';
+.glyphicon-hand-down:before {
+  content: "\e130";
 }
-blockquote.pull-right small:after {
-    content: '\00A0 \2014';
+.glyphicon-circle-arrow-right:before {
+  content: "\e131";
 }
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
-    content: "";
+.glyphicon-circle-arrow-left:before {
+  content: "\e132";
 }
-address {
-    display: block;
-    margin-bottom: 20px;
-    font-style: normal;
-    line-height: 20px;
+.glyphicon-circle-arrow-up:before {
+  content: "\e133";
 }
-code,
-pre {
-    padding: 0 3px 2px;
-    font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-    font-size: 12px;
-    color: #333333;
-    -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
-            border-radius: 3px;
+.glyphicon-circle-arrow-down:before {
+  content: "\e134";
 }
-code {
-    padding: 2px 4px;
-    color: #d14;
-    background-color: #f7f7f9;
-    border: 1px solid #e1e1e8;
+.glyphicon-globe:before {
+  content: "\e135";
 }
-pre {
-    display: block;
-    padding: 9.5px;
-    margin: 0 0 10px;
-    font-size: 13px;
-    line-height: 20px;
-    word-break: break-all;
-    word-wrap: break-word;
-    white-space: pre;
-    white-space: pre-wrap;
-    background-color: #f5f5f5;
-    border: 1px solid #ccc;
-    border: 1px solid rgba(0, 0, 0, 0.15);
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-}
-pre.prettyprint {
-    margin-bottom: 20px;
+.glyphicon-wrench:before {
+  content: "\e136";
 }
-pre code {
-    padding: 0;
-    color: inherit;
-    background-color: transparent;
-    border: 0;
+.glyphicon-tasks:before {
+  content: "\e137";
 }
-.pre-scrollable {
-    max-height: 340px;
-    overflow-y: scroll;
+.glyphicon-filter:before {
+  content: "\e138";
 }
-form {
-    margin: 0 0 20px;
+.glyphicon-briefcase:before {
+  content: "\e139";
 }
-fieldset {
-    padding: 0;
-    margin: 0;
-    border: 0;
+.glyphicon-fullscreen:before {
+  content: "\e140";
 }
-legend {
-    display: block;
-    width: 100%;
-    padding: 0;
-    margin-bottom: 20px;
-    font-size: 21px;
-    line-height: 40px;
-    color: #333333;
-    border: 0;
-    border-bottom: 1px solid #e5e5e5;
+.glyphicon-dashboard:before {
+  content: "\e141";
 }
-legend small {
-    font-size: 15px;
-    color: #999999;
+.glyphicon-paperclip:before {
+  content: "\e142";
 }
-label,
-input,
-button,
-select,
-textarea {
-    font-size: 14px;
-    font-weight: normal;
-    line-height: 20px;
+.glyphicon-heart-empty:before {
+  content: "\e143";
 }
-input,
-button,
-select,
-textarea {
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+.glyphicon-link:before {
+  content: "\e144";
 }
-label {
-    display: block;
-    margin-bottom: 5px;
+.glyphicon-phone:before {
+  content: "\e145";
 }
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-    display: inline-block;
-    height: 20px;
-    padding: 4px 6px;
-    margin-bottom: 10px;
-    font-size: 14px;
-    line-height: 20px;
-    color: #555555;
-    vertical-align: middle;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
+.glyphicon-pushpin:before {
+  content: "\e146";
 }
-input,
-textarea,
-.uneditable-input {
-    width: 206px;
+.glyphicon-usd:before {
+  content: "\e148";
 }
-textarea {
-    height: auto;
-}
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-    background-color: #ffffff;
-    border: 1px solid #cccccc;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-       -moz-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 linear 0.2s, box-shadow linear 0.2s;
-       -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-         -o-transition: border linear 0.2s, box-shadow linear 0.2s;
-            transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
-    border-color: rgba(82, 168, 236, 0.8);
-    outline: 0;
-    outline: thin dotted \9;
-    /* IE6-9 */
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+.glyphicon-gbp:before {
+  content: "\e149";
 }
-input[type="radio"],
-input[type="checkbox"] {
-    margin: 4px 0 0;
-    margin-top: 1px \9;
-    *margin-top: 0;
-    line-height: normal;
-    cursor: pointer;
-}
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
-    width: auto;
+.glyphicon-sort:before {
+  content: "\e150";
 }
-select,
-input[type="file"] {
-    height: 30px;
-    /* In IE7, the height of the select element cannot be changed by height, only font-size */
-    *margin-top: 4px;
-    /* For IE7, add top margin to align select with labels */
-    line-height: 30px;
+.glyphicon-sort-by-alphabet:before {
+  content: "\e151";
 }
-select {
-    width: 220px;
-    background-color: #ffffff;
-    border: 1px solid #cccccc;
+.glyphicon-sort-by-alphabet-alt:before {
+  content: "\e152";
 }
-select[multiple],
-select[size] {
-    height: auto;
+.glyphicon-sort-by-order:before {
+  content: "\e153";
 }
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-    outline: thin dotted #333;
-    outline: 5px auto -webkit-focus-ring-color;
-    outline-offset: -2px;
-}
-.uneditable-input,
-.uneditable-textarea {
-    color: #999999;
-    cursor: not-allowed;
-    background-color: #fcfcfc;
-    border-color: #cccccc;
-    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-       -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-            box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-}
-.uneditable-input {
-    overflow: hidden;
-    white-space: nowrap;
+.glyphicon-sort-by-order-alt:before {
+  content: "\e154";
 }
-.uneditable-textarea {
-    width: auto;
-    height: auto;
+.glyphicon-sort-by-attributes:before {
+  content: "\e155";
 }
-input:-moz-placeholder,
-textarea:-moz-placeholder {
-    color: #999999;
+.glyphicon-sort-by-attributes-alt:before {
+  content: "\e156";
 }
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
-    color: #999999;
+.glyphicon-unchecked:before {
+  content: "\e157";
 }
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
-    color: #999999;
+.glyphicon-expand:before {
+  content: "\e158";
 }
-.radio,
-.checkbox {
-    min-height: 20px;
-    padding-left: 20px;
+.glyphicon-collapse-down:before {
+  content: "\e159";
 }
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
-    float: left;
-    margin-left: -20px;
+.glyphicon-collapse-up:before {
+  content: "\e160";
 }
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
-    padding-top: 5px;
+.glyphicon-log-in:before {
+  content: "\e161";
 }
-.radio.inline,
-.checkbox.inline {
-    display: inline-block;
-    padding-top: 5px;
-    margin-bottom: 0;
-    vertical-align: middle;
+.glyphicon-flash:before {
+  content: "\e162";
 }
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
-    margin-left: 10px;
+.glyphicon-log-out:before {
+  content: "\e163";
 }
-.input-mini {
-    width: 60px;
+.glyphicon-new-window:before {
+  content: "\e164";
 }
-.input-small {
-    width: 90px;
+.glyphicon-record:before {
+  content: "\e165";
 }
-.input-medium {
-    width: 150px;
+.glyphicon-save:before {
+  content: "\e166";
 }
-.input-large {
-    width: 210px;
+.glyphicon-open:before {
+  content: "\e167";
 }
-.input-xlarge {
-    width: 270px;
+.glyphicon-saved:before {
+  content: "\e168";
 }
-.input-xxlarge {
-    width: 530px;
+.glyphicon-import:before {
+  content: "\e169";
 }
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
-    float: none;
-    margin-left: 0;
+.glyphicon-export:before {
+  content: "\e170";
 }
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
-    display: inline-block;
+.glyphicon-send:before {
+  content: "\e171";
 }
-input,
-textarea,
-.uneditable-input {
-    margin-left: 0;
+.glyphicon-floppy-disk:before {
+  content: "\e172";
 }
-.controls-row [class*="span"] + [class*="span"] {
-    margin-left: 20px;
-}
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
-    width: 926px;
-}
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
-    width: 846px;
-}
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
-    width: 766px;
-}
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
-    width: 686px;
-}
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
-    width: 606px;
-}
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
-    width: 526px;
-}
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
-    width: 446px;
-}
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
-    width: 366px;
-}
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
-    width: 286px;
-}
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
-    width: 206px;
-}
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
-    width: 126px;
-}
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
-    width: 46px;
-}
-.controls-row {
-    *zoom: 1;
-}
-.controls-row:before,
-.controls-row:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.glyphicon-floppy-saved:before {
+  content: "\e173";
 }
-.controls-row:after {
-    clear: both;
+.glyphicon-floppy-remove:before {
+  content: "\e174";
 }
-.controls-row [class*="span"],
-.row-fluid .controls-row [class*="span"] {
-    float: left;
+.glyphicon-floppy-save:before {
+  content: "\e175";
 }
-.controls-row .checkbox[class*="span"],
-.controls-row .radio[class*="span"] {
-    padding-top: 5px;
+.glyphicon-floppy-open:before {
+  content: "\e176";
 }
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
-    cursor: not-allowed;
-    background-color: #eeeeee;
+.glyphicon-credit-card:before {
+  content: "\e177";
 }
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
-    background-color: transparent;
+.glyphicon-transfer:before {
+  content: "\e178";
 }
-.control-group.warning > label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
-    color: #c09853;
-}
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-    color: #c09853;
-}
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-    border-color: #c09853;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
-    border-color: #a47e3c;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
-    color: #c09853;
-    background-color: #fcf8e3;
-    border-color: #c09853;
-}
-.control-group.error > label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
-    color: #b94a48;
-}
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-    color: #b94a48;
-}
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-    border-color: #b94a48;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
-    border-color: #953b39;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
-    color: #b94a48;
-    background-color: #f2dede;
-    border-color: #b94a48;
-}
-.control-group.success > label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
-    color: #468847;
-}
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-    color: #468847;
-}
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-    border-color: #468847;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
-    border-color: #356635;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
-    color: #468847;
-    background-color: #dff0d8;
-    border-color: #468847;
-}
-.control-group.info > label,
-.control-group.info .help-block,
-.control-group.info .help-inline {
-    color: #3a87ad;
-}
-.control-group.info .checkbox,
-.control-group.info .radio,
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
-    color: #3a87ad;
-}
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
-    border-color: #3a87ad;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.info input:focus,
-.control-group.info select:focus,
-.control-group.info textarea:focus {
-    border-color: #2d6987;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-}
-.control-group.info .input-prepend .add-on,
-.control-group.info .input-append .add-on {
-    color: #3a87ad;
-    background-color: #d9edf7;
-    border-color: #3a87ad;
-}
-input:focus:required:invalid,
-textarea:focus:required:invalid,
-select:focus:required:invalid {
-    color: #b94a48;
-    border-color: #ee5f5b;
-}
-input:focus:required:invalid:focus,
-textarea:focus:required:invalid:focus,
-select:focus:required:invalid:focus {
-    border-color: #e9322d;
-    -webkit-box-shadow: 0 0 6px #f8b9b7;
-       -moz-box-shadow: 0 0 6px #f8b9b7;
-            box-shadow: 0 0 6px #f8b9b7;
-}
-.form-actions {
-    padding: 19px 20px 20px;
-    margin-top: 20px;
-    margin-bottom: 20px;
-    background-color: #f5f5f5;
-    border-top: 1px solid #e5e5e5;
-    *zoom: 1;
-}
-.form-actions:before,
-.form-actions:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.glyphicon-cutlery:before {
+  content: "\e179";
 }
-.form-actions:after {
-    clear: both;
+.glyphicon-header:before {
+  content: "\e180";
 }
-.help-block,
-.help-inline {
-    color: #595959;
+.glyphicon-compressed:before {
+  content: "\e181";
 }
-.help-block {
-    display: block;
-    margin-bottom: 10px;
+.glyphicon-earphone:before {
+  content: "\e182";
 }
-.help-inline {
-    display: inline-block;
-    *display: inline;
-    padding-left: 5px;
-    vertical-align: middle;
-    *zoom: 1;
+.glyphicon-phone-alt:before {
+  content: "\e183";
 }
-.input-append,
-.input-prepend {
-    margin-bottom: 5px;
-    font-size: 0;
-    white-space: nowrap;
+.glyphicon-tower:before {
+  content: "\e184";
 }
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input,
-.input-append .dropdown-menu,
-.input-prepend .dropdown-menu {
-    font-size: 14px;
-}
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
-    position: relative;
-    margin-bottom: 0;
-    *margin-left: 0;
-    vertical-align: top;
-    -webkit-border-radius: 0 4px 4px 0;
-       -moz-border-radius: 0 4px 4px 0;
-            border-radius: 0 4px 4px 0;
-}
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
-    z-index: 2;
-}
-.input-append .add-on,
-.input-prepend .add-on {
-    display: inline-block;
-    width: auto;
-    height: 20px;
-    min-width: 16px;
-    padding: 4px 5px;
-    font-size: 14px;
-    font-weight: normal;
-    line-height: 20px;
-    text-align: center;
-    text-shadow: 0 1px 0 #ffffff;
-    background-color: #eeeeee;
-    border: 1px solid #ccc;
-}
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn {
-    vertical-align: top;
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
-}
-.input-append .active,
-.input-prepend .active {
-    background-color: #a9dba9;
-    border-color: #46a546;
-}
-.input-prepend .add-on,
-.input-prepend .btn {
-    margin-right: -1px;
-}
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
-    -webkit-border-radius: 4px 0 0 4px;
-       -moz-border-radius: 4px 0 0 4px;
-            border-radius: 4px 0 0 4px;
-}
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
-    -webkit-border-radius: 4px 0 0 4px;
-       -moz-border-radius: 4px 0 0 4px;
-            border-radius: 4px 0 0 4px;
-}
-.input-append input + .btn-group .btn,
-.input-append select + .btn-group .btn,
-.input-append .uneditable-input + .btn-group .btn {
-    -webkit-border-radius: 0 4px 4px 0;
-       -moz-border-radius: 0 4px 4px 0;
-            border-radius: 0 4px 4px 0;
-}
-.input-append .add-on,
-.input-append .btn,
-.input-append .btn-group {
-    margin-left: -1px;
-}
-.input-append .add-on:last-child,
-.input-append .btn:last-child {
-    -webkit-border-radius: 0 4px 4px 0;
-       -moz-border-radius: 0 4px 4px 0;
-            border-radius: 0 4px 4px 0;
-}
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
-}
-.input-prepend.input-append input + .btn-group .btn,
-.input-prepend.input-append select + .btn-group .btn,
-.input-prepend.input-append .uneditable-input + .btn-group .btn {
-    -webkit-border-radius: 0 4px 4px 0;
-       -moz-border-radius: 0 4px 4px 0;
-            border-radius: 0 4px 4px 0;
-}
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
-    margin-right: -1px;
-    -webkit-border-radius: 4px 0 0 4px;
-       -moz-border-radius: 4px 0 0 4px;
-            border-radius: 4px 0 0 4px;
-}
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
-    margin-left: -1px;
-    -webkit-border-radius: 0 4px 4px 0;
-       -moz-border-radius: 0 4px 4px 0;
-            border-radius: 0 4px 4px 0;
-}
-.input-prepend.input-append .btn-group:first-child {
-    margin-left: 0;
+.glyphicon-stats:before {
+  content: "\e185";
 }
-input.search-query {
-    padding-right: 14px;
-    padding-right: 4px \9;
-    padding-left: 14px;
-    padding-left: 4px \9;
-    /* IE7-8 doesn't have border-radius, so don't indent the padding */
-    margin-bottom: 0;
-    -webkit-border-radius: 15px;
-       -moz-border-radius: 15px;
-            border-radius: 15px;
-}
-/* Allow for input prepend/append in search forms */
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
-}
-.form-search .input-append .search-query {
-    -webkit-border-radius: 14px 0 0 14px;
-       -moz-border-radius: 14px 0 0 14px;
-            border-radius: 14px 0 0 14px;
-}
-.form-search .input-append .btn {
-    -webkit-border-radius: 0 14px 14px 0;
-       -moz-border-radius: 0 14px 14px 0;
-            border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .search-query {
-    -webkit-border-radius: 0 14px 14px 0;
-       -moz-border-radius: 0 14px 14px 0;
-            border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .btn {
-    -webkit-border-radius: 14px 0 0 14px;
-       -moz-border-radius: 14px 0 0 14px;
-            border-radius: 14px 0 0 14px;
-}
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
-    display: inline-block;
-    *display: inline;
-    margin-bottom: 0;
-    vertical-align: middle;
-    *zoom: 1;
+.glyphicon-sd-video:before {
+  content: "\e186";
 }
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
-    display: none;
+.glyphicon-hd-video:before {
+  content: "\e187";
 }
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
-    display: inline-block;
+.glyphicon-subtitles:before {
+  content: "\e188";
 }
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
-    margin-bottom: 0;
+.glyphicon-sound-stereo:before {
+  content: "\e189";
 }
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
-    padding-left: 0;
-    margin-bottom: 0;
-    vertical-align: middle;
+.glyphicon-sound-dolby:before {
+  content: "\e190";
 }
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
-    float: left;
-    margin-right: 3px;
-    margin-left: 0;
+.glyphicon-sound-5-1:before {
+  content: "\e191";
 }
-.control-group {
-    margin-bottom: 10px;
+.glyphicon-sound-6-1:before {
+  content: "\e192";
 }
-legend + .control-group {
-    margin-top: 20px;
-    -webkit-margin-top-collapse: separate;
+.glyphicon-sound-7-1:before {
+  content: "\e193";
 }
-.form-horizontal .control-group {
-    margin-bottom: 20px;
-    *zoom: 1;
+.glyphicon-copyright-mark:before {
+  content: "\e194";
 }
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.glyphicon-registration-mark:before {
+  content: "\e195";
 }
-.form-horizontal .control-group:after {
-    clear: both;
+.glyphicon-cloud-download:before {
+  content: "\e197";
 }
-.form-horizontal .control-label {
-    float: left;
-    width: 160px;
-    padding-top: 5px;
-    text-align: right;
+.glyphicon-cloud-upload:before {
+  content: "\e198";
 }
-.form-horizontal .controls {
-    *display: inline-block;
-    *padding-left: 20px;
-    margin-left: 180px;
-    *margin-left: 0;
+.glyphicon-tree-conifer:before {
+  content: "\e199";
 }
-.form-horizontal .controls:first-child {
-    *padding-left: 180px;
+.glyphicon-tree-deciduous:before {
+  content: "\e200";
 }
-.form-horizontal .help-block {
-    margin-bottom: 0;
+.glyphicon-cd:before {
+  content: "\e201";
 }
-.form-horizontal input + .help-block,
-.form-horizontal select + .help-block,
-.form-horizontal textarea + .help-block {
-    margin-top: 10px;
+.glyphicon-save-file:before {
+  content: "\e202";
 }
-.form-horizontal .form-actions {
-    padding-left: 180px;
+.glyphicon-open-file:before {
+  content: "\e203";
 }
-table {
-    max-width: 100%;
-    background-color: transparent;
-    border-collapse: collapse;
-    border-spacing: 0;
+.glyphicon-level-up:before {
+  content: "\e204";
 }
-.table {
-    width: 100%;
-    margin-bottom: 20px;
+.glyphicon-copy:before {
+  content: "\e205";
 }
-.table th,
-.table td {
-    padding: 8px;
-    line-height: 20px;
-    text-align: left;
-    vertical-align: top;
-    border-top: 1px solid #dddddd;
-}
-.table th {
-    font-weight: bold;
-}
-.table thead th {
-    vertical-align: bottom;
-}
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
-    border-top: 0;
+.glyphicon-paste:before {
+  content: "\e206";
 }
-.table tbody + tbody {
-    border-top: 2px solid #dddddd;
+.glyphicon-alert:before {
+  content: "\e209";
 }
-.table-condensed th,
-.table-condensed td {
-    padding: 4px 5px;
+.glyphicon-equalizer:before {
+  content: "\e210";
 }
-.table-bordered {
-    border: 1px solid #dddddd;
-    border-collapse: separate;
-    *border-collapse: collapse;
-    border-left: 0;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-}
-.table-bordered th,
-.table-bordered td {
-    border-left: 1px solid #dddddd;
-}
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
-    border-top: 0;
-}
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
-    -webkit-border-top-left-radius: 4px;
-            border-top-left-radius: 4px;
-    -moz-border-radius-topleft: 4px;
-}
-.table-bordered thead:first-child tr:first-child th:last-child,
-.table-bordered tbody:first-child tr:first-child td:last-child {
-    -webkit-border-top-right-radius: 4px;
-            border-top-right-radius: 4px;
-    -moz-border-radius-topright: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:first-child,
-.table-bordered tbody:last-child tr:last-child td:first-child,
-.table-bordered tfoot:last-child tr:last-child td:first-child {
-    -webkit-border-radius: 0 0 0 4px;
-       -moz-border-radius: 0 0 0 4px;
-            border-radius: 0 0 0 4px;
-    -webkit-border-bottom-left-radius: 4px;
-            border-bottom-left-radius: 4px;
-    -moz-border-radius-bottomleft: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:last-child,
-.table-bordered tbody:last-child tr:last-child td:last-child,
-.table-bordered tfoot:last-child tr:last-child td:last-child {
-    -webkit-border-bottom-right-radius: 4px;
-            border-bottom-right-radius: 4px;
-    -moz-border-radius-bottomright: 4px;
-}
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
-    -webkit-border-top-left-radius: 4px;
-            border-top-left-radius: 4px;
-    -moz-border-radius-topleft: 4px;
-}
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
-    -webkit-border-top-right-radius: 4px;
-            border-top-right-radius: 4px;
-    -moz-border-radius-topright: 4px;
-}
-.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 td[class*="span"],
-table th[class*="span"],
-.row-fluid table td[class*="span"],
-.row-fluid table th[class*="span"] {
-    display: table-cell;
-    float: none;
-    margin-left: 0;
-}
-.table td.span1,
-.table th.span1 {
-    float: none;
-    width: 44px;
-    margin-left: 0;
+.glyphicon-king:before {
+  content: "\e211";
 }
-.table td.span2,
-.table th.span2 {
-    float: none;
-    width: 124px;
-    margin-left: 0;
+.glyphicon-queen:before {
+  content: "\e212";
 }
-.table td.span3,
-.table th.span3 {
-    float: none;
-    width: 204px;
-    margin-left: 0;
+.glyphicon-pawn:before {
+  content: "\e213";
 }
-.table td.span4,
-.table th.span4 {
-    float: none;
-    width: 284px;
-    margin-left: 0;
+.glyphicon-bishop:before {
+  content: "\e214";
 }
-.table td.span5,
-.table th.span5 {
-    float: none;
-    width: 364px;
-    margin-left: 0;
+.glyphicon-knight:before {
+  content: "\e215";
 }
-.table td.span6,
-.table th.span6 {
-    float: none;
-    width: 444px;
-    margin-left: 0;
+.glyphicon-baby-formula:before {
+  content: "\e216";
 }
-.table td.span7,
-.table th.span7 {
-    float: none;
-    width: 524px;
-    margin-left: 0;
+.glyphicon-tent:before {
+  content: "\26fa";
 }
-.table td.span8,
-.table th.span8 {
-    float: none;
-    width: 604px;
-    margin-left: 0;
+.glyphicon-blackboard:before {
+  content: "\e218";
 }
-.table td.span9,
-.table th.span9 {
-    float: none;
-    width: 684px;
-    margin-left: 0;
+.glyphicon-bed:before {
+  content: "\e219";
 }
-.table td.span10,
-.table th.span10 {
-    float: none;
-    width: 764px;
-    margin-left: 0;
+.glyphicon-apple:before {
+  content: "\f8ff";
 }
-.table td.span11,
-.table th.span11 {
-    float: none;
-    width: 844px;
-    margin-left: 0;
+.glyphicon-erase:before {
+  content: "\e221";
 }
-.table td.span12,
-.table th.span12 {
-    float: none;
-    width: 924px;
-    margin-left: 0;
+.glyphicon-hourglass:before {
+  content: "\231b";
 }
-.table tbody tr.success td {
-    background-color: #dff0d8;
+.glyphicon-lamp:before {
+  content: "\e223";
 }
-.table tbody tr.error td {
-    background-color: #f2dede;
+.glyphicon-duplicate:before {
+  content: "\e224";
 }
-.table tbody tr.warning td {
-    background-color: #fcf8e3;
+.glyphicon-piggy-bank:before {
+  content: "\e225";
 }
-.table tbody tr.info td {
-    background-color: #d9edf7;
+.glyphicon-scissors:before {
+  content: "\e226";
 }
-.table-hover tbody tr.success:hover td {
-    background-color: #d0e9c6;
+.glyphicon-bitcoin:before {
+  content: "\e227";
 }
-.table-hover tbody tr.error:hover td {
-    background-color: #ebcccc;
+.glyphicon-btc:before {
+  content: "\e227";
 }
-.table-hover tbody tr.warning:hover td {
-    background-color: #faf2cc;
+.glyphicon-xbt:before {
+  content: "\e227";
 }
-.table-hover tbody tr.info:hover td {
-    background-color: #c4e3f3;
+.glyphicon-yen:before {
+  content: "\00a5";
 }
-[class^="icon-"],
-[class*=" icon-"] {
-    display: inline-block;
-    width: 14px;
-    height: 14px;
-    margin-top: 1px;
-    *margin-right: .3em;
-    line-height: 14px;
-    vertical-align: text-top;
-    background-image: url("../img/glyphicons-halflings.png");
-    background-position: 14px 14px;
-    background-repeat: no-repeat;
+.glyphicon-jpy:before {
+  content: "\00a5";
 }
-/* White icons with optional class, or on hover/active states of certain elements */
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"] {
-    background-image: url("../img/glyphicons-halflings-white.png");
+.glyphicon-ruble:before {
+  content: "\20bd";
 }
-.icon-glass {
-    background-position: 0      0;
+.glyphicon-rub:before {
+  content: "\20bd";
 }
-.icon-music {
-    background-position: -24px 0;
+.glyphicon-scale:before {
+  content: "\e230";
 }
-.icon-search {
-    background-position: -48px 0;
+.glyphicon-ice-lolly:before {
+  content: "\e231";
 }
-.icon-envelope {
-    background-position: -72px 0;
+.glyphicon-ice-lolly-tasted:before {
+  content: "\e232";
 }
-.icon-heart {
-    background-position: -96px 0;
+.glyphicon-education:before {
+  content: "\e233";
 }
-.icon-star {
-    background-position: -120px 0;
+.glyphicon-option-horizontal:before {
+  content: "\e234";
 }
-.icon-star-empty {
-    background-position: -144px 0;
+.glyphicon-option-vertical:before {
+  content: "\e235";
 }
-.icon-user {
-    background-position: -168px 0;
+.glyphicon-menu-hamburger:before {
+  content: "\e236";
 }
-.icon-film {
-    background-position: -192px 0;
+.glyphicon-modal-window:before {
+  content: "\e237";
 }
-.icon-th-large {
-    background-position: -216px 0;
+.glyphicon-oil:before {
+  content: "\e238";
 }
-.icon-th {
-    background-position: -240px 0;
+.glyphicon-grain:before {
+  content: "\e239";
 }
-.icon-th-list {
-    background-position: -264px 0;
+.glyphicon-sunglasses:before {
+  content: "\e240";
 }
-.icon-ok {
-    background-position: -288px 0;
+.glyphicon-text-size:before {
+  content: "\e241";
 }
-.icon-remove {
-    background-position: -312px 0;
+.glyphicon-text-color:before {
+  content: "\e242";
 }
-.icon-zoom-in {
-    background-position: -336px 0;
+.glyphicon-text-background:before {
+  content: "\e243";
 }
-.icon-zoom-out {
-    background-position: -360px 0;
+.glyphicon-object-align-top:before {
+  content: "\e244";
 }
-.icon-off {
-    background-position: -384px 0;
+.glyphicon-object-align-bottom:before {
+  content: "\e245";
 }
-.icon-signal {
-    background-position: -408px 0;
+.glyphicon-object-align-horizontal:before {
+  content: "\e246";
 }
-.icon-cog {
-    background-position: -432px 0;
+.glyphicon-object-align-left:before {
+  content: "\e247";
 }
-.icon-trash {
-    background-position: -456px 0;
+.glyphicon-object-align-vertical:before {
+  content: "\e248";
 }
-.icon-home {
-    background-position: 0 -24px;
+.glyphicon-object-align-right:before {
+  content: "\e249";
 }
-.icon-file {
-    background-position: -24px -24px;
+.glyphicon-triangle-right:before {
+  content: "\e250";
 }
-.icon-time {
-    background-position: -48px -24px;
+.glyphicon-triangle-left:before {
+  content: "\e251";
 }
-.icon-road {
-    background-position: -72px -24px;
+.glyphicon-triangle-bottom:before {
+  content: "\e252";
 }
-.icon-download-alt {
-    background-position: -96px -24px;
+.glyphicon-triangle-top:before {
+  content: "\e253";
 }
-.icon-download {
-    background-position: -120px -24px;
+.glyphicon-console:before {
+  content: "\e254";
 }
-.icon-upload {
-    background-position: -144px -24px;
+.glyphicon-superscript:before {
+  content: "\e255";
 }
-.icon-inbox {
-    background-position: -168px -24px;
+.glyphicon-subscript:before {
+  content: "\e256";
 }
-.icon-play-circle {
-    background-position: -192px -24px;
+.glyphicon-menu-left:before {
+  content: "\e257";
 }
-.icon-repeat {
-    background-position: -216px -24px;
+.glyphicon-menu-right:before {
+  content: "\e258";
 }
-.icon-refresh {
-    background-position: -240px -24px;
+.glyphicon-menu-down:before {
+  content: "\e259";
 }
-.icon-list-alt {
-    background-position: -264px -24px;
+.glyphicon-menu-up:before {
+  content: "\e260";
 }
-.icon-lock {
-    background-position: -287px -24px;
+* {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
-.icon-flag {
-    background-position: -312px -24px;
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
-.icon-headphones {
-    background-position: -336px -24px;
+html {
+  font-size: 10px;
+
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
 }
-.icon-volume-off {
-    background-position: -360px -24px;
+body {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #333;
+  background-color: #fff;
 }
-.icon-volume-down {
-    background-position: -384px -24px;
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
 }
-.icon-volume-up {
-    background-position: -408px -24px;
+a {
+  color: #337ab7;
+  text-decoration: none;
 }
-.icon-qrcode {
-    background-position: -432px -24px;
+a:hover,
+a:focus {
+  color: #23527c;
+  text-decoration: underline;
 }
-.icon-barcode {
-    background-position: -456px -24px;
+a:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
 }
-.icon-tag {
-    background-position: 0 -48px;
+figure {
+  margin: 0;
 }
-.icon-tags {
-    background-position: -25px -48px;
+img {
+  vertical-align: middle;
 }
-.icon-book {
-    background-position: -48px -48px;
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  max-width: 100%;
+  height: auto;
 }
-.icon-bookmark {
-    background-position: -72px -48px;
+.img-rounded {
+  border-radius: 6px;
+}
+.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;
 }
-.icon-print {
-    background-position: -96px -48px;
+.img-circle {
+  border-radius: 50%;
 }
-.icon-camera {
-    background-position: -120px -48px;
+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;
 }
-.icon-font {
-    background-position: -144px -48px;
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit;
 }
-.icon-bold {
-    background-position: -167px -48px;
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+  font-weight: normal;
+  line-height: 1;
+  color: #777;
 }
-.icon-italic {
-    background-position: -192px -48px;
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+  margin-top: 20px;
+  margin-bottom: 10px;
 }
-.icon-text-height {
-    background-position: -216px -48px;
+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%;
 }
-.icon-text-width {
-    background-position: -240px -48px;
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+  margin-top: 10px;
+  margin-bottom: 10px;
 }
-.icon-align-left {
-    background-position: -264px -48px;
+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%;
 }
-.icon-align-center {
-    background-position: -288px -48px;
+h1,
+.h1 {
+  font-size: 36px;
 }
-.icon-align-right {
-    background-position: -312px -48px;
+h2,
+.h2 {
+  font-size: 30px;
 }
-.icon-align-justify {
-    background-position: -336px -48px;
+h3,
+.h3 {
+  font-size: 24px;
 }
-.icon-list {
-    background-position: -360px -48px;
+h4,
+.h4 {
+  font-size: 18px;
 }
-.icon-indent-left {
-    background-position: -384px -48px;
+h5,
+.h5 {
+  font-size: 14px;
 }
-.icon-indent-right {
-    background-position: -408px -48px;
+h6,
+.h6 {
+  font-size: 12px;
 }
-.icon-facetime-video {
-    background-position: -432px -48px;
+p {
+  margin: 0 0 10px;
 }
-.icon-picture {
-    background-position: -456px -48px;
+.lead {
+  margin-bottom: 20px;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 1.4;
 }
-.icon-pencil {
-    background-position: 0 -72px;
+@media (min-width: 768px) {
+  .lead {
+    font-size: 21px;
+  }
 }
-.icon-map-marker {
-    background-position: -24px -72px;
+small,
+.small {
+  font-size: 85%;
 }
-.icon-adjust {
-    background-position: -48px -72px;
+mark,
+.mark {
+  padding: .2em;
+  background-color: #fcf8e3;
 }
-.icon-tint {
-    background-position: -72px -72px;
+.text-left {
+  text-align: left;
 }
-.icon-edit {
-    background-position: -96px -72px;
+.text-right {
+  text-align: right;
 }
-.icon-share {
-    background-position: -120px -72px;
+.text-center {
+  text-align: center;
 }
-.icon-check {
-    background-position: -144px -72px;
+.text-justify {
+  text-align: justify;
 }
-.icon-move {
-    background-position: -168px -72px;
+.text-nowrap {
+  white-space: nowrap;
 }
-.icon-step-backward {
-    background-position: -192px -72px;
+.text-lowercase {
+  text-transform: lowercase;
 }
-.icon-fast-backward {
-    background-position: -216px -72px;
+.text-uppercase {
+  text-transform: uppercase;
 }
-.icon-backward {
-    background-position: -240px -72px;
+.text-capitalize {
+  text-transform: capitalize;
 }
-.icon-play {
-    background-position: -264px -72px;
+.text-muted {
+  color: #777;
 }
-.icon-pause {
-    background-position: -288px -72px;
+.text-primary {
+  color: #337ab7;
 }
-.icon-stop {
-    background-position: -312px -72px;
+a.text-primary:hover,
+a.text-primary:focus {
+  color: #286090;
 }
-.icon-forward {
-    background-position: -336px -72px;
+.text-success {
+  color: #3c763d;
 }
-.icon-fast-forward {
-    background-position: -360px -72px;
+a.text-success:hover,
+a.text-success:focus {
+  color: #2b542c;
 }
-.icon-step-forward {
-    background-position: -384px -72px;
+.text-info {
+  color: #31708f;
 }
-.icon-eject {
-    background-position: -408px -72px;
+a.text-info:hover,
+a.text-info:focus {
+  color: #245269;
 }
-.icon-chevron-left {
-    background-position: -432px -72px;
+.text-warning {
+  color: #8a6d3b;
 }
-.icon-chevron-right {
-    background-position: -456px -72px;
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #66512c;
 }
-.icon-plus-sign {
-    background-position: 0 -96px;
+.text-danger {
+  color: #a94442;
 }
-.icon-minus-sign {
-    background-position: -24px -96px;
+a.text-danger:hover,
+a.text-danger:focus {
+  color: #843534;
 }
-.icon-remove-sign {
-    background-position: -48px -96px;
+.bg-primary {
+  color: #fff;
+  background-color: #337ab7;
 }
-.icon-ok-sign {
-    background-position: -72px -96px;
+a.bg-primary:hover,
+a.bg-primary:focus {
+  background-color: #286090;
 }
-.icon-question-sign {
-    background-position: -96px -96px;
+.bg-success {
+  background-color: #dff0d8;
 }
-.icon-info-sign {
-    background-position: -120px -96px;
+a.bg-success:hover,
+a.bg-success:focus {
+  background-color: #c1e2b3;
 }
-.icon-screenshot {
-    background-position: -144px -96px;
+.bg-info {
+  background-color: #d9edf7;
 }
-.icon-remove-circle {
-    background-position: -168px -96px;
+a.bg-info:hover,
+a.bg-info:focus {
+  background-color: #afd9ee;
 }
-.icon-ok-circle {
-    background-position: -192px -96px;
+.bg-warning {
+  background-color: #fcf8e3;
 }
-.icon-ban-circle {
-    background-position: -216px -96px;
+a.bg-warning:hover,
+a.bg-warning:focus {
+  background-color: #f7ecb5;
 }
-.icon-arrow-left {
-    background-position: -240px -96px;
+.bg-danger {
+  background-color: #f2dede;
 }
-.icon-arrow-right {
-    background-position: -264px -96px;
+a.bg-danger:hover,
+a.bg-danger:focus {
+  background-color: #e4b9b9;
 }
-.icon-arrow-up {
-    background-position: -289px -96px;
+.page-header {
+  padding-bottom: 9px;
+  margin: 40px 0 20px;
+  border-bottom: 1px solid #eee;
 }
-.icon-arrow-down {
-    background-position: -312px -96px;
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: 10px;
 }
-.icon-share-alt {
-    background-position: -336px -96px;
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+  margin-bottom: 0;
 }
-.icon-resize-full {
-    background-position: -360px -96px;
+.list-unstyled {
+  padding-left: 0;
+  list-style: none;
 }
-.icon-resize-small {
-    background-position: -384px -96px;
+.list-inline {
+  padding-left: 0;
+  margin-left: -5px;
+  list-style: none;
 }
-.icon-plus {
-    background-position: -408px -96px;
+.list-inline > li {
+  display: inline-block;
+  padding-right: 5px;
+  padding-left: 5px;
 }
-.icon-minus {
-    background-position: -433px -96px;
+dl {
+  margin-top: 0;
+  margin-bottom: 20px;
 }
-.icon-asterisk {
-    background-position: -456px -96px;
+dt,
+dd {
+  line-height: 1.42857143;
 }
-.icon-exclamation-sign {
-    background-position: 0 -120px;
+dt {
+  font-weight: bold;
 }
-.icon-gift {
-    background-position: -24px -120px;
+dd {
+  margin-left: 0;
 }
-.icon-leaf {
-    background-position: -48px -120px;
+@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;
+  }
 }
-.icon-fire {
-    background-position: -72px -120px;
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #777;
 }
-.icon-eye-open {
-    background-position: -96px -120px;
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
 }
-.icon-eye-close {
-    background-position: -120px -120px;
+blockquote {
+  padding: 10px 20px;
+  margin: 0 0 20px;
+  font-size: 17.5px;
+  border-left: 5px solid #eee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+  margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.42857143;
+  color: #777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+  content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  text-align: right;
+  border-right: 5px solid #eee;
+  border-left: 0;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+  content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+  content: '\00A0 \2014';
 }
-.icon-warning-sign {
-    background-position: -144px -120px;
+address {
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 1.42857143;
 }
-.icon-plane {
-    background-position: -168px -120px;
+code,
+kbd,
+pre,
+samp {
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
 }
-.icon-calendar {
-    background-position: -192px -120px;
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #c7254e;
+  background-color: #f9f2f4;
+  border-radius: 4px;
+}
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #fff;
+  background-color: #333;
+  border-radius: 3px;
+  -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: bold;
+  -webkit-box-shadow: none;
+          box-shadow: none;
 }
-.icon-random {
-    width: 16px;
-    background-position: -216px -120px;
+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;
 }
-.icon-comment {
-    background-position: -240px -120px;
+pre code {
+  padding: 0;
+  font-size: inherit;
+  color: inherit;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border-radius: 0;
 }
-.icon-magnet {
-    background-position: -264px -120px;
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
 }
-.icon-chevron-up {
-    background-position: -288px -120px;
+.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;
+  }
 }
-.icon-chevron-down {
-    background-position: -313px -119px;
+.container-fluid {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
 }
-.icon-retweet {
-    background-position: -336px -120px;
+.row {
+  margin-right: -15px;
+  margin-left: -15px;
 }
-.icon-shopping-cart {
-    background-position: -360px -120px;
+.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;
 }
-.icon-folder-close {
-    background-position: -384px -120px;
+.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;
 }
-.icon-folder-open {
-    width: 16px;
-    background-position: -408px -120px;
+.col-xs-12 {
+  width: 100%;
 }
-.icon-resize-vertical {
-    background-position: -432px -119px;
+.col-xs-11 {
+  width: 91.66666667%;
 }
-.icon-resize-horizontal {
-    background-position: -456px -118px;
+.col-xs-10 {
+  width: 83.33333333%;
 }
-.icon-hdd {
-    background-position: 0 -144px;
+.col-xs-9 {
+  width: 75%;
 }
-.icon-bullhorn {
-    background-position: -24px -144px;
+.col-xs-8 {
+  width: 66.66666667%;
 }
-.icon-bell {
-    background-position: -48px -144px;
+.col-xs-7 {
+  width: 58.33333333%;
 }
-.icon-certificate {
-    background-position: -72px -144px;
+.col-xs-6 {
+  width: 50%;
 }
-.icon-thumbs-up {
-    background-position: -96px -144px;
+.col-xs-5 {
+  width: 41.66666667%;
 }
-.icon-thumbs-down {
-    background-position: -120px -144px;
+.col-xs-4 {
+  width: 33.33333333%;
 }
-.icon-hand-right {
-    background-position: -144px -144px;
+.col-xs-3 {
+  width: 25%;
 }
-.icon-hand-left {
-    background-position: -168px -144px;
+.col-xs-2 {
+  width: 16.66666667%;
 }
-.icon-hand-up {
-    background-position: -192px -144px;
+.col-xs-1 {
+  width: 8.33333333%;
 }
-.icon-hand-down {
-    background-position: -216px -144px;
+.col-xs-pull-12 {
+  right: 100%;
 }
-.icon-circle-arrow-right {
-    background-position: -240px -144px;
+.col-xs-pull-11 {
+  right: 91.66666667%;
 }
-.icon-circle-arrow-left {
-    background-position: -264px -144px;
+.col-xs-pull-10 {
+  right: 83.33333333%;
 }
-.icon-circle-arrow-up {
-    background-position: -288px -144px;
+.col-xs-pull-9 {
+  right: 75%;
 }
-.icon-circle-arrow-down {
-    background-position: -312px -144px;
+.col-xs-pull-8 {
+  right: 66.66666667%;
 }
-.icon-globe {
-    background-position: -336px -144px;
+.col-xs-pull-7 {
+  right: 58.33333333%;
 }
-.icon-wrench {
-    background-position: -360px -144px;
+.col-xs-pull-6 {
+  right: 50%;
 }
-.icon-tasks {
-    background-position: -384px -144px;
+.col-xs-pull-5 {
+  right: 41.66666667%;
 }
-.icon-filter {
-    background-position: -408px -144px;
+.col-xs-pull-4 {
+  right: 33.33333333%;
 }
-.icon-briefcase {
-    background-position: -432px -144px;
+.col-xs-pull-3 {
+  right: 25%;
 }
-.icon-fullscreen {
-    background-position: -456px -144px;
+.col-xs-pull-2 {
+  right: 16.66666667%;
 }
-.dropup,
-.dropdown {
-    position: relative;
+.col-xs-pull-1 {
+  right: 8.33333333%;
 }
-.dropdown-toggle {
-    *margin-bottom: -3px;
+.col-xs-pull-0 {
+  right: auto;
 }
-.dropdown-toggle:active,
-.open .dropdown-toggle {
-    outline: 0;
+.col-xs-push-12 {
+  left: 100%;
 }
-.caret {
-    display: inline-block;
-    width: 0;
-    height: 0;
-    vertical-align: top;
-    border-top: 4px solid #000000;
-    border-right: 4px solid transparent;
-    border-left: 4px solid transparent;
-    content: "";
+.col-xs-push-11 {
+  left: 91.66666667%;
 }
-.dropdown .caret {
-    margin-top: 8px;
-    margin-left: 2px;
+.col-xs-push-10 {
+  left: 83.33333333%;
 }
-.dropdown-menu {
-    position: absolute;
-    top: 100%;
-    left: 0;
-    z-index: 1000;
-    display: none;
-    float: left;
-    min-width: 160px;
-    padding: 5px 0;
-    margin: 2px 0 0;
-    list-style: none;
-    background-color: #ffffff;
-    border: 1px solid #ccc;
-    border: 1px solid rgba(0, 0, 0, 0.2);
-    *border-right-width: 2px;
-    *border-bottom-width: 2px;
-    -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
-            border-radius: 6px;
-    -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-       -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-            box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-    -webkit-background-clip: padding-box;
-       -moz-background-clip: padding;
-            background-clip: padding-box;
+.col-xs-push-9 {
+  left: 75%;
 }
-.dropdown-menu.pull-right {
-    right: 0;
-    left: auto;
+.col-xs-push-8 {
+  left: 66.66666667%;
 }
-.dropdown-menu .divider {
-    *width: 100%;
-    height: 1px;
-    margin: 9px 1px;
-    *margin: -5px 0 5px;
-    overflow: hidden;
-    background-color: #e5e5e5;
-    border-bottom: 1px solid #ffffff;
-}
-.dropdown-menu li > a {
-    display: block;
-    padding: 3px 20px;
-    clear: both;
-    font-weight: normal;
-    line-height: 20px;
-    color: #333333;
-    white-space: nowrap;
+.col-xs-push-7 {
+  left: 58.33333333%;
 }
-.dropdown-menu li > a:hover,
-.dropdown-menu li > a:focus,
-.dropdown-submenu:hover > a {
-    color: #ffffff;
-    text-decoration: none;
-    background-color: #0081c2;
-    background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
-    background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
-    background-image: -o-linear-gradient(top, #0088cc, #0077b3);
-    background-image: linear-gradient(to bottom, #0088cc, #0077b3);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-.dropdown-menu .active > a,
-.dropdown-menu .active > a:hover {
-    color: #333333;
-    text-decoration: none;
-    background-color: #0081c2;
-    background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
-    background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
-    background-image: -o-linear-gradient(top, #0088cc, #0077b3);
-    background-image: linear-gradient(to bottom, #0088cc, #0077b3);
-    background-repeat: repeat-x;
-    outline: 0;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-.dropdown-menu .disabled > a,
-.dropdown-menu .disabled > a:hover {
-    color: #999999;
-}
-.dropdown-menu .disabled > a:hover {
-    text-decoration: none;
-    cursor: default;
-    background-color: transparent;
-    background-image: none;
+.col-xs-push-6 {
+  left: 50%;
 }
-.open {
-    *z-index: 1000;
+.col-xs-push-5 {
+  left: 41.66666667%;
 }
-.open > .dropdown-menu {
-    display: block;
+.col-xs-push-4 {
+  left: 33.33333333%;
 }
-.pull-right > .dropdown-menu {
-    right: 0;
-    left: auto;
+.col-xs-push-3 {
+  left: 25%;
 }
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-    border-top: 0;
-    border-bottom: 4px solid #000000;
-    content: "";
+.col-xs-push-2 {
+  left: 16.66666667%;
 }
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-    top: auto;
-    bottom: 100%;
-    margin-bottom: 1px;
+.col-xs-push-1 {
+  left: 8.33333333%;
 }
-.dropdown-submenu {
-    position: relative;
+.col-xs-push-0 {
+  left: auto;
 }
-.dropdown-submenu > .dropdown-menu {
-    top: 0;
-    left: 100%;
-    margin-top: -6px;
-    margin-left: -1px;
-    -webkit-border-radius: 0 6px 6px 6px;
-       -moz-border-radius: 0 6px 6px 6px;
-            border-radius: 0 6px 6px 6px;
-}
-.dropdown-submenu:hover > .dropdown-menu {
-    display: block;
-}
-.dropup .dropdown-submenu > .dropdown-menu {
-    top: auto;
-    bottom: 0;
-    margin-top: 0;
-    margin-bottom: -2px;
-    -webkit-border-radius: 5px 5px 5px 0;
-       -moz-border-radius: 5px 5px 5px 0;
-            border-radius: 5px 5px 5px 0;
-}
-.dropdown-submenu > a:after {
-    display: block;
-    float: right;
-    width: 0;
-    height: 0;
-    margin-top: 5px;
-    margin-right: -10px;
-    border-color: transparent;
-    border-left-color: #cccccc;
-    border-style: solid;
-    border-width: 5px 0 5px 5px;
-    content: " ";
+.col-xs-offset-12 {
+  margin-left: 100%;
 }
-.dropdown-submenu:hover > a:after {
-    border-left-color: #ffffff;
+.col-xs-offset-11 {
+  margin-left: 91.66666667%;
 }
-.dropdown-submenu.pull-left {
-    float: none;
+.col-xs-offset-10 {
+  margin-left: 83.33333333%;
 }
-.dropdown-submenu.pull-left > .dropdown-menu {
-    left: -100%;
-    margin-left: 10px;
-    -webkit-border-radius: 6px 0 6px 6px;
-       -moz-border-radius: 6px 0 6px 6px;
-            border-radius: 6px 0 6px 6px;
+.col-xs-offset-9 {
+  margin-left: 75%;
 }
-.dropdown .dropdown-menu .nav-header {
-    padding-right: 20px;
-    padding-left: 20px;
+.col-xs-offset-8 {
+  margin-left: 66.66666667%;
 }
-.typeahead {
-    margin-top: 2px;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
+.col-xs-offset-7 {
+  margin-left: 58.33333333%;
 }
-.well {
-    min-height: 20px;
-    padding: 19px;
-    margin-bottom: 20px;
-    background-color: #f5f5f5;
-    border: 1px solid #e3e3e3;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-            box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+.col-xs-offset-6 {
+  margin-left: 50%;
 }
-.well blockquote {
-    border-color: #ddd;
-    border-color: rgba(0, 0, 0, 0.15);
+.col-xs-offset-5 {
+  margin-left: 41.66666667%;
 }
-.well-large {
-    padding: 24px;
-    -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
-            border-radius: 6px;
+.col-xs-offset-4 {
+  margin-left: 33.33333333%;
 }
-.well-small {
-    padding: 9px;
-    -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
-            border-radius: 3px;
+.col-xs-offset-3 {
+  margin-left: 25%;
 }
-.fade {
-    opacity: 0;
-    -webkit-transition: opacity 0.15s linear;
-       -moz-transition: opacity 0.15s linear;
-         -o-transition: opacity 0.15s linear;
-            transition: opacity 0.15s linear;
+.col-xs-offset-2 {
+  margin-left: 16.66666667%;
 }
-.fade.in {
-    opacity: 1;
+.col-xs-offset-1 {
+  margin-left: 8.33333333%;
 }
-.collapse {
-    position: relative;
-    height: 0;
-    overflow: hidden;
-    -webkit-transition: height 0.35s ease;
-       -moz-transition: height 0.35s ease;
-         -o-transition: height 0.35s ease;
-            transition: height 0.35s ease;
+.col-xs-offset-0 {
+  margin-left: 0;
 }
-.collapse.in {
-    height: auto;
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left;
+  }
+  .col-sm-12 {
+    width: 100%;
+  }
+  .col-sm-11 {
+    width: 91.66666667%;
+  }
+  .col-sm-10 {
+    width: 83.33333333%;
+  }
+  .col-sm-9 {
+    width: 75%;
+  }
+  .col-sm-8 {
+    width: 66.66666667%;
+  }
+  .col-sm-7 {
+    width: 58.33333333%;
+  }
+  .col-sm-6 {
+    width: 50%;
+  }
+  .col-sm-5 {
+    width: 41.66666667%;
+  }
+  .col-sm-4 {
+    width: 33.33333333%;
+  }
+  .col-sm-3 {
+    width: 25%;
+  }
+  .col-sm-2 {
+    width: 16.66666667%;
+  }
+  .col-sm-1 {
+    width: 8.33333333%;
+  }
+  .col-sm-pull-12 {
+    right: 100%;
+  }
+  .col-sm-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-sm-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-sm-pull-9 {
+    right: 75%;
+  }
+  .col-sm-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-sm-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-sm-pull-6 {
+    right: 50%;
+  }
+  .col-sm-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-sm-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-sm-pull-3 {
+    right: 25%;
+  }
+  .col-sm-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-sm-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-sm-pull-0 {
+    right: auto;
+  }
+  .col-sm-push-12 {
+    left: 100%;
+  }
+  .col-sm-push-11 {
+    left: 91.66666667%;
+  }
+  .col-sm-push-10 {
+    left: 83.33333333%;
+  }
+  .col-sm-push-9 {
+    left: 75%;
+  }
+  .col-sm-push-8 {
+    left: 66.66666667%;
+  }
+  .col-sm-push-7 {
+    left: 58.33333333%;
+  }
+  .col-sm-push-6 {
+    left: 50%;
+  }
+  .col-sm-push-5 {
+    left: 41.66666667%;
+  }
+  .col-sm-push-4 {
+    left: 33.33333333%;
+  }
+  .col-sm-push-3 {
+    left: 25%;
+  }
+  .col-sm-push-2 {
+    left: 16.66666667%;
+  }
+  .col-sm-push-1 {
+    left: 8.33333333%;
+  }
+  .col-sm-push-0 {
+    left: auto;
+  }
+  .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+  .col-sm-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-sm-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+  .col-sm-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-sm-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+  .col-sm-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-sm-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+  .col-sm-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-sm-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-sm-offset-0 {
+    margin-left: 0;
+  }
 }
-.close {
-    float: right;
-    font-size: 20px;
-    font-weight: bold;
-    line-height: 20px;
-    color: #000000;
-    text-shadow: 0 1px 0 #ffffff;
-    opacity: 0.2;
-    filter: alpha(opacity=20);
-}
-.close:hover {
-    color: #000000;
-    text-decoration: none;
-    cursor: pointer;
-    opacity: 0.4;
-    filter: alpha(opacity=40);
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left;
+  }
+  .col-md-12 {
+    width: 100%;
+  }
+  .col-md-11 {
+    width: 91.66666667%;
+  }
+  .col-md-10 {
+    width: 83.33333333%;
+  }
+  .col-md-9 {
+    width: 75%;
+  }
+  .col-md-8 {
+    width: 66.66666667%;
+  }
+  .col-md-7 {
+    width: 58.33333333%;
+  }
+  .col-md-6 {
+    width: 50%;
+  }
+  .col-md-5 {
+    width: 41.66666667%;
+  }
+  .col-md-4 {
+    width: 33.33333333%;
+  }
+  .col-md-3 {
+    width: 25%;
+  }
+  .col-md-2 {
+    width: 16.66666667%;
+  }
+  .col-md-1 {
+    width: 8.33333333%;
+  }
+  .col-md-pull-12 {
+    right: 100%;
+  }
+  .col-md-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-md-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-md-pull-9 {
+    right: 75%;
+  }
+  .col-md-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-md-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-md-pull-6 {
+    right: 50%;
+  }
+  .col-md-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-md-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-md-pull-3 {
+    right: 25%;
+  }
+  .col-md-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-md-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-md-pull-0 {
+    right: auto;
+  }
+  .col-md-push-12 {
+    left: 100%;
+  }
+  .col-md-push-11 {
+    left: 91.66666667%;
+  }
+  .col-md-push-10 {
+    left: 83.33333333%;
+  }
+  .col-md-push-9 {
+    left: 75%;
+  }
+  .col-md-push-8 {
+    left: 66.66666667%;
+  }
+  .col-md-push-7 {
+    left: 58.33333333%;
+  }
+  .col-md-push-6 {
+    left: 50%;
+  }
+  .col-md-push-5 {
+    left: 41.66666667%;
+  }
+  .col-md-push-4 {
+    left: 33.33333333%;
+  }
+  .col-md-push-3 {
+    left: 25%;
+  }
+  .col-md-push-2 {
+    left: 16.66666667%;
+  }
+  .col-md-push-1 {
+    left: 8.33333333%;
+  }
+  .col-md-push-0 {
+    left: auto;
+  }
+  .col-md-offset-12 {
+    margin-left: 100%;
+  }
+  .col-md-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-md-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-md-offset-9 {
+    margin-left: 75%;
+  }
+  .col-md-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-md-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-md-offset-6 {
+    margin-left: 50%;
+  }
+  .col-md-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-md-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-md-offset-3 {
+    margin-left: 25%;
+  }
+  .col-md-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-md-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-md-offset-0 {
+    margin-left: 0;
+  }
 }
-button.close {
-    padding: 0;
-    cursor: pointer;
-    background: transparent;
-    border: 0;
-    -webkit-appearance: none;
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left;
+  }
+  .col-lg-12 {
+    width: 100%;
+  }
+  .col-lg-11 {
+    width: 91.66666667%;
+  }
+  .col-lg-10 {
+    width: 83.33333333%;
+  }
+  .col-lg-9 {
+    width: 75%;
+  }
+  .col-lg-8 {
+    width: 66.66666667%;
+  }
+  .col-lg-7 {
+    width: 58.33333333%;
+  }
+  .col-lg-6 {
+    width: 50%;
+  }
+  .col-lg-5 {
+    width: 41.66666667%;
+  }
+  .col-lg-4 {
+    width: 33.33333333%;
+  }
+  .col-lg-3 {
+    width: 25%;
+  }
+  .col-lg-2 {
+    width: 16.66666667%;
+  }
+  .col-lg-1 {
+    width: 8.33333333%;
+  }
+  .col-lg-pull-12 {
+    right: 100%;
+  }
+  .col-lg-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-lg-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-lg-pull-9 {
+    right: 75%;
+  }
+  .col-lg-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-lg-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-lg-pull-6 {
+    right: 50%;
+  }
+  .col-lg-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-lg-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-lg-pull-3 {
+    right: 25%;
+  }
+  .col-lg-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-lg-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-lg-pull-0 {
+    right: auto;
+  }
+  .col-lg-push-12 {
+    left: 100%;
+  }
+  .col-lg-push-11 {
+    left: 91.66666667%;
+  }
+  .col-lg-push-10 {
+    left: 83.33333333%;
+  }
+  .col-lg-push-9 {
+    left: 75%;
+  }
+  .col-lg-push-8 {
+    left: 66.66666667%;
+  }
+  .col-lg-push-7 {
+    left: 58.33333333%;
+  }
+  .col-lg-push-6 {
+    left: 50%;
+  }
+  .col-lg-push-5 {
+    left: 41.66666667%;
+  }
+  .col-lg-push-4 {
+    left: 33.33333333%;
+  }
+  .col-lg-push-3 {
+    left: 25%;
+  }
+  .col-lg-push-2 {
+    left: 16.66666667%;
+  }
+  .col-lg-push-1 {
+    left: 8.33333333%;
+  }
+  .col-lg-push-0 {
+    left: auto;
+  }
+  .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+  .col-lg-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-lg-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+  .col-lg-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-lg-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+  .col-lg-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-lg-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+  .col-lg-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-lg-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-lg-offset-0 {
+    margin-left: 0;
+  }
 }
-.btn {
-    display: inline-block;
-    *display: inline;
-    padding: 4px 12px;
-    margin-bottom: 0;
-    *margin-left: .3em;
-    font-size: 14px;
-    line-height: 20px;
-    *line-height: 20px;
-    color: #333333;
-    text-align: center;
-    text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-    vertical-align: middle;
-    cursor: pointer;
-    background-color: #f5f5f5;
-    *background-color: #e6e6e6;
-    background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-    background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-    background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-    background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-    background-repeat: repeat-x;
-    border: 1px solid #bbbbbb;
-    *border: 0;
-    border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    border-bottom-color: #a2a2a2;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-    *zoom: 1;
-    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+table {
+  background-color: transparent;
 }
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
-    color: #333333;
-    background-color: #e6e6e6;
-    *background-color: #d9d9d9;
+caption {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  color: #777;
+  text-align: left;
 }
-.btn:active,
-.btn.active {
-    background-color: #cccccc \9;
-}
-.btn:first-child {
-    *margin-left: 0;
-}
-.btn:hover {
-    color: #333333;
-    text-decoration: none;
-    background-color: #e6e6e6;
-    *background-color: #d9d9d9;
-    /* Buttons in IE7 don't get borders, so darken on hover */
-    background-position: 0 -15px;
-    -webkit-transition: background-position 0.1s linear;
-       -moz-transition: background-position 0.1s linear;
-         -o-transition: background-position 0.1s linear;
-            transition: background-position 0.1s linear;
-}
-.btn:focus {
-    outline: thin dotted #333;
-    outline: 5px auto -webkit-focus-ring-color;
-    outline-offset: -2px;
-}
-.btn.active,
-.btn:active {
-    background-color: #e6e6e6;
-    background-color: #d9d9d9 \9;
-    background-image: none;
-    outline: 0;
-    -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-            box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+th {
+  text-align: left;
 }
-.btn.disabled,
-.btn[disabled] {
-    cursor: default;
-    background-color: #e6e6e6;
-    background-image: none;
-    opacity: 0.65;
-    filter: alpha(opacity=65);
-    -webkit-box-shadow: none;
-       -moz-box-shadow: none;
-            box-shadow: none;
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+  padding: 8px;
+  line-height: 1.42857143;
+  vertical-align: top;
+  border-top: 1px solid #ddd;
+}
+.table > thead > tr > th {
+  vertical-align: bottom;
+  border-bottom: 2px solid #ddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+  border-top: 0;
+}
+.table > tbody + tbody {
+  border-top: 2px solid #ddd;
+}
+.table .table {
+  background-color: #fff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+  padding: 5px;
 }
-.btn-large {
-    padding: 11px 19px;
-    font-size: 17.5px;
-    -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
-            border-radius: 6px;
-}
-.btn-large [class^="icon-"],
-.btn-large [class*=" icon-"] {
-    margin-top: 2px;
-}
-.btn-small {
-    padding: 2px 10px;
-    font-size: 11.9px;
-    -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
-            border-radius: 3px;
-}
-.btn-small [class^="icon-"],
-.btn-small [class*=" icon-"] {
-    margin-top: 0;
+.table-bordered {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+  border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-of-type(odd) {
+  background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover {
+  background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+  position: static;
+  display: table-column;
+  float: none;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+  position: static;
+  display: table-cell;
+  float: none;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+  background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+  background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+  background-color: #d9edf7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+  background-color: #c4e3f3;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+  background-color: #fcf8e3;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+  background-color: #faf2cc;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+  background-color: #f2dede;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+  background-color: #ebcccc;
+}
+.table-responsive {
+  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 > thead > tr > th,
+  .table-responsive > .table > tbody > tr > th,
+  .table-responsive > .table > tfoot > tr > th,
+  .table-responsive > .table > thead > tr > td,
+  .table-responsive > .table > tbody > tr > td,
+  .table-responsive > .table > tfoot > tr > td {
+    white-space: nowrap;
+  }
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
 }
-.btn-mini {
-    padding: 1px 6px;
-    font-size: 10.5px;
-    -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
-            border-radius: 3px;
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
 }
-.btn-block {
-    display: block;
-    width: 100%;
-    padding-right: 0;
-    padding-left: 0;
-    -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-            box-sizing: border-box;
+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;
 }
-.btn-block + .btn-block {
-    margin-top: 5px;
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold;
 }
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-    width: 100%;
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
 }
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
-    color: rgba(255, 255, 255, 0.75);
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal;
 }
-.btn {
-    border-color: #c5c5c5;
-    border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
+input[type="file"] {
+  display: block;
 }
-.btn-primary {
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #006dcc;
-    *background-color: #0044cc;
-    background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
-    background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
-    background-image: -o-linear-gradient(top, #0088cc, #0044cc);
-    background-image: linear-gradient(to bottom, #0088cc, #0044cc);
-    background-repeat: repeat-x;
-    border-color: #0044cc #0044cc #002a80;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
-    color: #ffffff;
-    background-color: #0044cc;
-    *background-color: #003bb3;
+input[type="range"] {
+  display: block;
+  width: 100%;
 }
-.btn-primary:active,
-.btn-primary.active {
-    background-color: #003399 \9;
+select[multiple],
+select[size] {
+  height: auto;
 }
-.btn-warning {
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #faa732;
-    *background-color: #f89406;
-    background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-    background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-    background-image: -o-linear-gradient(top, #fbb450, #f89406);
-    background-image: linear-gradient(to bottom, #fbb450, #f89406);
-    background-repeat: repeat-x;
-    border-color: #f89406 #f89406 #ad6704;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
-    color: #ffffff;
-    background-color: #f89406;
-    *background-color: #df8505;
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+}
+.form-control {
+  display: block;
+  width: 100%;
+  height: 34px;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .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-placeholder {
+  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;
 }
-.btn-warning:active,
-.btn-warning.active {
-    background-color: #c67605 \9;
+input[type="search"] {
+  -webkit-appearance: none;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"].form-control,
+  input[type="time"].form-control,
+  input[type="datetime-local"].form-control,
+  input[type="month"].form-control {
+    line-height: 34px;
+  }
+  input[type="date"].input-sm,
+  input[type="time"].input-sm,
+  input[type="datetime-local"].input-sm,
+  input[type="month"].input-sm,
+  .input-group-sm input[type="date"],
+  .input-group-sm input[type="time"],
+  .input-group-sm input[type="datetime-local"],
+  .input-group-sm input[type="month"] {
+    line-height: 30px;
+  }
+  input[type="date"].input-lg,
+  input[type="time"].input-lg,
+  input[type="datetime-local"].input-lg,
+  input[type="month"].input-lg,
+  .input-group-lg input[type="date"],
+  .input-group-lg input[type="time"],
+  .input-group-lg input[type="datetime-local"],
+  .input-group-lg input[type="month"] {
+    line-height: 46px;
+  }
+}
+.form-group {
+  margin-bottom: 15px;
 }
-.btn-danger {
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #da4f49;
-    *background-color: #bd362f;
-    background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
-    background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
-    background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
-    background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
-    background-repeat: repeat-x;
-    border-color: #bd362f #bd362f #802420;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
-    color: #ffffff;
-    background-color: #bd362f;
-    *background-color: #a9302a;
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+  min-height: 20px;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  cursor: pointer;
 }
-.btn-danger:active,
-.btn-danger.active {
-    background-color: #942a25 \9;
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-top: 4px \9;
+  margin-left: -20px;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+  position: relative;
+  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;
 }
-.btn-success {
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #5bb75b;
-    *background-color: #51a351;
-    background-image: -moz-linear-gradient(top, #62c462, #51a351);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
-    background-image: -webkit-linear-gradient(top, #62c462, #51a351);
-    background-image: -o-linear-gradient(top, #62c462, #51a351);
-    background-image: linear-gradient(to bottom, #62c462, #51a351);
-    background-repeat: repeat-x;
-    border-color: #51a351 #51a351 #387038;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
-    color: #ffffff;
-    background-color: #51a351;
-    *background-color: #499249;
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+  cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+  cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+  cursor: not-allowed;
+}
+.form-control-static {
+  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;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+  height: auto;
+}
+.form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.form-group-sm select.form-control {
+  height: 30px;
+  line-height: 30px;
+}
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+  height: auto;
+}
+.form-group-sm .form-control-static {
+  height: 30px;
+  min-height: 32px;
+  padding: 6px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.input-lg {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-lg {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+  height: auto;
+}
+.form-group-lg .form-control {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.form-group-lg select.form-control {
+  height: 46px;
+  line-height: 46px;
+}
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+  height: auto;
+}
+.form-group-lg .form-control-static {
+  height: 46px;
+  min-height: 38px;
+  padding: 11px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+.has-feedback {
+  position: relative;
+}
+.has-feedback .form-control {
+  padding-right: 42.5px;
+}
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 34px;
+  height: 34px;
+  line-height: 34px;
+  text-align: center;
+  pointer-events: none;
+}
+.input-lg + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+  width: 46px;
+  height: 46px;
+  line-height: 46px;
+}
+.input-sm + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+  color: #3c763d;
+}
+.has-success .form-control {
+  border-color: #3c763d;
+  -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 .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+  color: #8a6d3b;
+}
+.has-warning .form-control {
+  border-color: #8a6d3b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .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 .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+  color: #a94442;
+}
+.has-error .form-control {
+  border-color: #a94442;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .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;
 }
-.btn-success:active,
-.btn-success.active {
-    background-color: #408140 \9;
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #737373;
 }
-.btn-info {
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #49afcd;
-    *background-color: #2f96b4;
-    background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
-    background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
-    background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
-    background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
-    background-repeat: repeat-x;
-    border-color: #2f96b4 #2f96b4 #1f6377;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
-    color: #ffffff;
-    background-color: #2f96b4;
-    *background-color: #2a85a0;
+@media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .form-control-static {
+    display: inline-block;
+  }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .form-inline .input-group .input-group-addon,
+  .form-inline .input-group .input-group-btn,
+  .form-inline .input-group .form-control {
+    width: auto;
+  }
+  .form-inline .input-group > .form-control {
+    width: 100%;
+  }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio,
+  .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio label,
+  .form-inline .checkbox label {
+    padding-left: 0;
+  }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  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;
+}
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    padding-top: 7px;
+    margin-bottom: 0;
+    text-align: right;
+  }
 }
-.btn-info:active,
-.btn-info.active {
-    background-color: #24748c \9;
-}
-.btn-inverse {
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #363636;
-    *background-color: #222222;
-    background-image: -moz-linear-gradient(top, #444444, #222222);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
-    background-image: -webkit-linear-gradient(top, #444444, #222222);
-    background-image: -o-linear-gradient(top, #444444, #222222);
-    background-image: linear-gradient(to bottom, #444444, #222222);
-    background-repeat: repeat-x;
-    border-color: #222222 #222222 #000000;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
-    color: #ffffff;
-    background-color: #222222;
-    *background-color: #151515;
-}
-.btn-inverse:active,
-.btn-inverse.active {
-    background-color: #080808 \9;
-}
-button.btn,
-input[type="submit"].btn {
-    *padding-top: 3px;
-    *padding-bottom: 3px;
-}
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
-    padding: 0;
-    border: 0;
+.form-horizontal .has-feedback .form-control-feedback {
+  right: 15px;
 }
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
-    *padding-top: 7px;
-    *padding-bottom: 7px;
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 11px;
+    font-size: 18px;
+  }
 }
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
-    *padding-top: 3px;
-    *padding-bottom: 3px;
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+    font-size: 12px;
+  }
 }
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
-    *padding-top: 1px;
-    *padding-bottom: 1px;
+.btn {
+  display: inline-block;
+  padding: 6px 12px;
+  margin-bottom: 0;
+  font-size: 14px;
+  font-weight: normal;
+  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:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
 }
-.btn-link,
-.btn-link:active,
-.btn-link[disabled] {
-    background-color: transparent;
-    background-image: none;
-    -webkit-box-shadow: none;
-       -moz-box-shadow: none;
-            box-shadow: none;
+.btn:hover,
+.btn:focus,
+.btn.focus {
+  color: #333;
+  text-decoration: none;
 }
-.btn-link {
-    color: #0088cc;
-    cursor: pointer;
-    border-color: transparent;
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
-}
-.btn-link:hover {
-    color: #005580;
-    text-decoration: underline;
-    background-color: transparent;
+.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-link[disabled]:hover {
-    color: #333333;
-    text-decoration: none;
+.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:hover,
+.btn-default.active:hover,
+.open > .dropdown-toggle.btn-default:hover,
+.btn-default:active:focus,
+.btn-default.active:focus,
+.open > .dropdown-toggle.btn-default:focus,
+.btn-default:active.focus,
+.btn-default.active.focus,
+.open > .dropdown-toggle.btn-default.focus {
+  color: #333;
+  background-color: #d4d4d4;
+  border-color: #8c8c8c;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus {
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default .badge {
+  color: #fff;
+  background-color: #333;
 }
-.btn-group {
-    position: relative;
-    display: inline-block;
-    *display: inline;
-    *margin-left: .3em;
-    font-size: 0;
-    white-space: nowrap;
-    vertical-align: middle;
-    *zoom: 1;
+.btn-primary {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #2e6da4;
 }
-.btn-group:first-child {
-    *margin-left: 0;
+.btn-primary:focus,
+.btn-primary.focus {
+  color: #fff;
+  background-color: #286090;
+  border-color: #122b40;
 }
-.btn-group + .btn-group {
-    margin-left: 5px;
+.btn-primary:hover {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
 }
-.btn-toolbar {
-    margin-top: 10px;
-    margin-bottom: 10px;
-    font-size: 0;
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.open > .dropdown-toggle.btn-primary:hover,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.open > .dropdown-toggle.btn-primary:focus,
+.btn-primary:active.focus,
+.btn-primary.active.focus,
+.open > .dropdown-toggle.btn-primary.focus {
+  color: #fff;
+  background-color: #204d74;
+  border-color: #122b40;
 }
-.btn-toolbar .btn + .btn,
-.btn-toolbar .btn-group + .btn,
-.btn-toolbar .btn + .btn-group {
-    margin-left: 5px;
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus {
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.btn-primary .badge {
+  color: #337ab7;
+  background-color: #fff;
 }
-.btn-group > .btn {
-    position: relative;
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #4cae4c;
 }
-.btn-group > .btn + .btn {
-    margin-left: -1px;
+.btn-success:focus,
+.btn-success.focus {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #255625;
 }
-.btn-group > .btn,
-.btn-group > .dropdown-menu {
-    font-size: 14px;
+.btn-success:hover {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
 }
-.btn-group > .btn-mini {
-    font-size: 11px;
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active:hover,
+.btn-success.active:hover,
+.open > .dropdown-toggle.btn-success:hover,
+.btn-success:active:focus,
+.btn-success.active:focus,
+.open > .dropdown-toggle.btn-success:focus,
+.btn-success:active.focus,
+.btn-success.active.focus,
+.open > .dropdown-toggle.btn-success.focus {
+  color: #fff;
+  background-color: #398439;
+  border-color: #255625;
 }
-.btn-group > .btn-small {
-    font-size: 12px;
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus {
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success .badge {
+  color: #5cb85c;
+  background-color: #fff;
 }
-.btn-group > .btn-large {
-    font-size: 16px;
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #46b8da;
 }
-.btn-group > .btn:first-child {
-    margin-left: 0;
-    -webkit-border-bottom-left-radius: 4px;
-            border-bottom-left-radius: 4px;
-    -webkit-border-top-left-radius: 4px;
-            border-top-left-radius: 4px;
-    -moz-border-radius-bottomleft: 4px;
-    -moz-border-radius-topleft: 4px;
-}
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
-    -webkit-border-top-right-radius: 4px;
-            border-top-right-radius: 4px;
-    -webkit-border-bottom-right-radius: 4px;
-            border-bottom-right-radius: 4px;
-    -moz-border-radius-topright: 4px;
-    -moz-border-radius-bottomright: 4px;
-}
-.btn-group > .btn.large:first-child {
-    margin-left: 0;
-    -webkit-border-bottom-left-radius: 6px;
-            border-bottom-left-radius: 6px;
-    -webkit-border-top-left-radius: 6px;
-            border-top-left-radius: 6px;
-    -moz-border-radius-bottomleft: 6px;
-    -moz-border-radius-topleft: 6px;
-}
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
-    -webkit-border-top-right-radius: 6px;
-            border-top-right-radius: 6px;
-    -webkit-border-bottom-right-radius: 6px;
-            border-bottom-right-radius: 6px;
-    -moz-border-radius-topright: 6px;
-    -moz-border-radius-bottomright: 6px;
+.btn-info:focus,
+.btn-info.focus {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #1b6d85;
 }
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
-    z-index: 2;
+.btn-info:hover {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
 }
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-    outline: 0;
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active:hover,
+.btn-info.active:hover,
+.open > .dropdown-toggle.btn-info:hover,
+.btn-info:active:focus,
+.btn-info.active:focus,
+.open > .dropdown-toggle.btn-info:focus,
+.btn-info:active.focus,
+.btn-info.active.focus,
+.open > .dropdown-toggle.btn-info.focus {
+  color: #fff;
+  background-color: #269abc;
+  border-color: #1b6d85;
 }
-.btn-group > .btn + .dropdown-toggle {
-    *padding-top: 5px;
-    padding-right: 8px;
-    *padding-bottom: 5px;
-    padding-left: 8px;
-    -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-            box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.btn-group > .btn-mini + .dropdown-toggle {
-    *padding-top: 2px;
-    padding-right: 5px;
-    *padding-bottom: 2px;
-    padding-left: 5px;
-}
-.btn-group > .btn-small + .dropdown-toggle {
-    *padding-top: 5px;
-    *padding-bottom: 4px;
-}
-.btn-group > .btn-large + .dropdown-toggle {
-    *padding-top: 7px;
-    padding-right: 12px;
-    *padding-bottom: 7px;
-    padding-left: 12px;
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus {
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info .badge {
+  color: #5bc0de;
+  background-color: #fff;
 }
-.btn-group.open .dropdown-toggle {
-    background-image: none;
-    -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-            box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+.btn-warning {
+  color: #fff;
+  background-color: #f0ad4e;
+  border-color: #eea236;
 }
-.btn-group.open .btn.dropdown-toggle {
-    background-color: #e6e6e6;
+.btn-warning:focus,
+.btn-warning.focus {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #985f0d;
 }
-.btn-group.open .btn-primary.dropdown-toggle {
-    background-color: #0044cc;
+.btn-warning:hover {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
 }
-.btn-group.open .btn-warning.dropdown-toggle {
-    background-color: #f89406;
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active:hover,
+.btn-warning.active:hover,
+.open > .dropdown-toggle.btn-warning:hover,
+.btn-warning:active:focus,
+.btn-warning.active:focus,
+.open > .dropdown-toggle.btn-warning:focus,
+.btn-warning:active.focus,
+.btn-warning.active.focus,
+.open > .dropdown-toggle.btn-warning.focus {
+  color: #fff;
+  background-color: #d58512;
+  border-color: #985f0d;
 }
-.btn-group.open .btn-danger.dropdown-toggle {
-    background-color: #bd362f;
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus {
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning .badge {
+  color: #f0ad4e;
+  background-color: #fff;
 }
-.btn-group.open .btn-success.dropdown-toggle {
-    background-color: #51a351;
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d43f3a;
 }
-.btn-group.open .btn-info.dropdown-toggle {
-    background-color: #2f96b4;
+.btn-danger:focus,
+.btn-danger.focus {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #761c19;
 }
-.btn-group.open .btn-inverse.dropdown-toggle {
-    background-color: #222222;
+.btn-danger:hover {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
 }
-.btn .caret {
-    margin-top: 8px;
-    margin-left: 0;
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active:hover,
+.btn-danger.active:hover,
+.open > .dropdown-toggle.btn-danger:hover,
+.btn-danger:active:focus,
+.btn-danger.active:focus,
+.open > .dropdown-toggle.btn-danger:focus,
+.btn-danger:active.focus,
+.btn-danger.active.focus,
+.open > .dropdown-toggle.btn-danger.focus {
+  color: #fff;
+  background-color: #ac2925;
+  border-color: #761c19;
 }
-.btn-mini .caret,
-.btn-small .caret,
-.btn-large .caret {
-    margin-top: 6px;
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus {
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger .badge {
+  color: #d9534f;
+  background-color: #fff;
 }
-.btn-large .caret {
-    border-top-width: 5px;
-    border-right-width: 5px;
-    border-left-width: 5px;
+.btn-link {
+  font-weight: normal;
+  color: #337ab7;
+  border-radius: 0;
 }
-.dropup .btn-large .caret {
-    border-bottom-width: 5px;
+.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-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
-    border-top-color: #ffffff;
-    border-bottom-color: #ffffff;
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #23527c;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #777;
+  text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+  padding: 1px 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
 }
-.btn-group-vertical {
-    display: inline-block;
-    *display: inline;
-    /* IE7 inline-block hack */
-    *zoom: 1;
+.btn-block {
+  display: block;
+  width: 100%;
 }
-.btn-group-vertical .btn {
-    display: block;
-    float: none;
-    width: 100%;
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
+.btn-block + .btn-block {
+  margin-top: 5px;
 }
-.btn-group-vertical .btn + .btn {
-    margin-top: -1px;
-    margin-left: 0;
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
 }
-.btn-group-vertical .btn:first-child {
-    -webkit-border-radius: 4px 4px 0 0;
-       -moz-border-radius: 4px 4px 0 0;
-            border-radius: 4px 4px 0 0;
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity .15s linear;
+       -o-transition: opacity .15s linear;
+          transition: opacity .15s linear;
 }
-.btn-group-vertical .btn:last-child {
-    -webkit-border-radius: 0 0 4px 4px;
-       -moz-border-radius: 0 0 4px 4px;
-            border-radius: 0 0 4px 4px;
+.fade.in {
+  opacity: 1;
 }
-.btn-group-vertical .btn-large:first-child {
-    -webkit-border-radius: 6px 6px 0 0;
-       -moz-border-radius: 6px 6px 0 0;
-            border-radius: 6px 6px 0 0;
+.collapse {
+  display: none;
 }
-.btn-group-vertical .btn-large:last-child {
-    -webkit-border-radius: 0 0 6px 6px;
-       -moz-border-radius: 0 0 6px 6px;
-            border-radius: 0 0 6px 6px;
+.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;
 }
-.alert {
-    padding: 8px 35px 8px 14px;
-    margin-bottom: 20px;
-    color: #c09853;
-    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-    background-color: #fcf8e3;
-    border: 1px solid #fbeed5;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px dashed;
+  border-top: 4px solid \9;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
 }
-.alert h4 {
-    margin: 0;
+.dropup,
+.dropdown {
+  position: relative;
 }
-.alert .close {
-    position: relative;
-    top: -2px;
-    right: -21px;
-    line-height: 20px;
+.dropdown-toggle:focus {
+  outline: 0;
 }
-.alert-success {
-    color: #468847;
-    background-color: #dff0d8;
-    border-color: #d6e9c6;
+.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);
 }
-.alert-danger,
-.alert-error {
-    color: #b94a48;
-    background-color: #f2dede;
-    border-color: #eed3d7;
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
 }
-.alert-info {
-    color: #3a87ad;
-    background-color: #d9edf7;
-    border-color: #bce8f1;
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 1.42857143;
+  color: #333;
+  white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  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: #337ab7;
+  outline: 0;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #777;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
 }
-.alert-block {
-    padding-top: 14px;
-    padding-bottom: 14px;
+.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;
 }
-.alert-block > p,
-.alert-block > ul {
-    margin-bottom: 0;
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
 }
-.alert-block p + p {
-    margin-top: 5px;
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  content: "";
+  border-top: 0;
+  border-bottom: 4px dashed;
+  border-bottom: 4px solid \9;
 }
-.nav {
-    margin-bottom: 20px;
-    margin-left: 0;
-    list-style: none;
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
 }
-.nav > li > a {
-    display: block;
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    right: 0;
+    left: auto;
+  }
+  .navbar-right .dropdown-menu-left {
+    right: auto;
+    left: 0;
+  }
 }
-.nav > li > a:hover {
-    text-decoration: none;
-    background-color: #eeeeee;
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
 }
-.nav > .pull-right {
-    float: right;
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
 }
-.nav-header {
-    display: block;
-    padding: 3px 15px;
-    font-size: 11px;
-    font-weight: bold;
-    line-height: 20px;
-    color: #999999;
-    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-    text-transform: uppercase;
+.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;
 }
-.nav li + .nav-header {
-    margin-top: 9px;
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
 }
-.nav-list {
-    padding-right: 15px;
-    padding-left: 15px;
-    margin-bottom: 0;
+.btn-toolbar {
+  margin-left: -5px;
 }
-.nav-list > li > a,
-.nav-list .nav-header {
-    margin-right: -15px;
-    margin-left: -15px;
-    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.nav-list > li > a {
-    padding: 3px 15px;
-}
-.nav-list > .active > a,
-.nav-list > .active > a:hover {
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
-    background-color: #0088cc;
-}
-.nav-list [class^="icon-"],
-.nav-list [class*=" icon-"] {
-    margin-right: 2px;
-}
-.nav-list .divider {
-    *width: 100%;
-    height: 1px;
-    margin: 9px 1px;
-    *margin: -5px 0 5px;
-    overflow: hidden;
-    background-color: #e5e5e5;
-    border-bottom: 1px solid #ffffff;
-}
-.nav-tabs,
-.nav-pills {
-    *zoom: 1;
-}
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.btn-toolbar .btn,
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: left;
 }
-.nav-tabs:after,
-.nav-pills:after {
-    clear: both;
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-left: 5px;
 }
-.nav-tabs > li,
-.nav-pills > li {
-    float: left;
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
 }
-.nav-tabs > li > a,
-.nav-pills > li > a {
-    padding-right: 12px;
-    padding-left: 12px;
-    margin-right: 2px;
-    line-height: 14px;
+.btn-group > .btn:first-child {
+  margin-left: 0;
 }
-.nav-tabs {
-    border-bottom: 1px solid #ddd;
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
 }
-.nav-tabs > li {
-    margin-bottom: -1px;
+.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;
 }
-.nav-tabs > li > a {
-    padding-top: 8px;
-    padding-bottom: 8px;
-    line-height: 20px;
-    border: 1px solid transparent;
-    -webkit-border-radius: 4px 4px 0 0;
-       -moz-border-radius: 4px 4px 0 0;
-            border-radius: 4px 4px 0 0;
+.btn-group > .btn-group {
+  float: left;
 }
-.nav-tabs > li > a:hover {
-    border-color: #eeeeee #eeeeee #dddddd;
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
 }
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover {
-    color: #555555;
-    cursor: default;
-    background-color: #ffffff;
-    border: 1px solid #ddd;
-    border-bottom-color: transparent;
+.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;
 }
-.nav-pills > li > a {
-    padding-top: 8px;
-    padding-bottom: 8px;
-    margin-top: 2px;
-    margin-bottom: 2px;
-    -webkit-border-radius: 5px;
-       -moz-border-radius: 5px;
-            border-radius: 5px;
-}
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover {
-    color: #ffffff;
-    background-color: #0088cc;
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
 }
-.nav-stacked > li {
-    float: none;
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
 }
-.nav-stacked > li > a {
-    margin-right: 0;
+.btn-group > .btn + .dropdown-toggle {
+  padding-right: 8px;
+  padding-left: 8px;
 }
-.nav-tabs.nav-stacked {
-    border-bottom: 0;
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-right: 12px;
+  padding-left: 12px;
 }
-.nav-tabs.nav-stacked > li > a {
-    border: 1px solid #ddd;
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
-}
-.nav-tabs.nav-stacked > li:first-child > a {
-    -webkit-border-top-right-radius: 4px;
-            border-top-right-radius: 4px;
-    -webkit-border-top-left-radius: 4px;
-            border-top-left-radius: 4px;
-    -moz-border-radius-topright: 4px;
-    -moz-border-radius-topleft: 4px;
-}
-.nav-tabs.nav-stacked > li:last-child > a {
-    -webkit-border-bottom-right-radius: 4px;
-            border-bottom-right-radius: 4px;
-    -webkit-border-bottom-left-radius: 4px;
-            border-bottom-left-radius: 4px;
-    -moz-border-radius-bottomright: 4px;
-    -moz-border-radius-bottomleft: 4px;
-}
-.nav-tabs.nav-stacked > li > a:hover {
-    z-index: 2;
-    border-color: #ddd;
-}
-.nav-pills.nav-stacked > li > a {
-    margin-bottom: 3px;
-}
-.nav-pills.nav-stacked > li:last-child > a {
-    margin-bottom: 1px;
+.btn-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);
 }
-.nav-tabs .dropdown-menu {
-    -webkit-border-radius: 0 0 6px 6px;
-       -moz-border-radius: 0 0 6px 6px;
-            border-radius: 0 0 6px 6px;
-}
-.nav-pills .dropdown-menu {
-    -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
-            border-radius: 6px;
-}
-.nav .dropdown-toggle .caret {
-    margin-top: 6px;
-    border-top-color: #0088cc;
-    border-bottom-color: #0088cc;
-}
-.nav .dropdown-toggle:hover .caret {
-    border-top-color: #005580;
-    border-bottom-color: #005580;
-}
-/* move down carets for tabs */
-.nav-tabs .dropdown-toggle .caret {
-    margin-top: 8px;
-}
-.nav .active .dropdown-toggle .caret {
-    border-top-color: #fff;
-    border-bottom-color: #fff;
+.btn-group.open .dropdown-toggle.btn-link {
+  -webkit-box-shadow: none;
+          box-shadow: none;
 }
-.nav-tabs .active .dropdown-toggle .caret {
-    border-top-color: #555555;
-    border-bottom-color: #555555;
-}
-.nav > .dropdown.active > a:hover {
-    cursor: pointer;
-}
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover {
-    color: #ffffff;
-    background-color: #999999;
-    border-color: #999999;
-}
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret {
-    border-top-color: #ffffff;
-    border-bottom-color: #ffffff;
-    opacity: 1;
-    filter: alpha(opacity=100);
-}
-.tabs-stacked .open > a:hover {
-    border-color: #999999;
-}
-.tabbable {
-    *zoom: 1;
-}
-.tabbable:before,
-.tabbable:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.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-child) {
+  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="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+.input-group[class*="col-"] {
+  float: none;
+  padding-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;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.input-group-addon {
+  padding: 6px 12px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #555;
+  text-align: center;
+  background-color: #eee;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+.input-group-addon.input-sm {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+.input-group-addon.input-lg {
+  padding: 10px 16px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-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 > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-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:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+  z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  z-index: 2;
+  margin-left: -1px;
 }
-.tabbable:after {
-    clear: both;
+.nav {
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none;
 }
-.tab-content {
-    overflow: auto;
+.nav > li {
+  position: relative;
+  display: block;
 }
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
-    border-bottom: 0;
+.nav > li > a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.nav > li.disabled > a {
+  color: #777;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+  color: #777;
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+  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;
 }
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
-    display: none;
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
 }
-.tab-content > .active,
-.pill-content > .active {
-    display: block;
+.nav-tabs > li {
+  float: left;
+  margin-bottom: -1px;
 }
-.tabs-below > .nav-tabs {
-    border-top: 1px solid #ddd;
+.nav-tabs > li > a {
+  margin-right: 2px;
+  line-height: 1.42857143;
+  border: 1px solid transparent;
+  border-radius: 4px 4px 0 0;
 }
-.tabs-below > .nav-tabs > li {
-    margin-top: -1px;
+.nav-tabs > li > a:hover {
+  border-color: #eee #eee #ddd;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+  color: #555;
+  cursor: default;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+.nav-tabs.nav-justified {
+  width: 100%;
+  border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+  float: none;
+}
+.nav-tabs.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-tabs.nav-justified > li > a {
     margin-bottom: 0;
+  }
 }
-.tabs-below > .nav-tabs > li > a {
-    -webkit-border-radius: 0 0 4px 4px;
-       -moz-border-radius: 0 0 4px 4px;
-            border-radius: 0 0 4px 4px;
-}
-.tabs-below > .nav-tabs > li > a:hover {
-    border-top-color: #ddd;
-    border-bottom-color: transparent;
+.nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
 }
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover {
-    border-color: transparent #ddd #ddd #ddd;
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid #ddd;
 }
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
-    float: none;
-}
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
-    min-width: 74px;
-    margin-right: 0;
-    margin-bottom: 3px;
-}
-.tabs-left > .nav-tabs {
-    float: left;
-    margin-right: 19px;
-    border-right: 1px solid #ddd;
-}
-.tabs-left > .nav-tabs > li > a {
-    margin-right: -1px;
-    -webkit-border-radius: 4px 0 0 4px;
-       -moz-border-radius: 4px 0 0 4px;
-            border-radius: 4px 0 0 4px;
-}
-.tabs-left > .nav-tabs > li > a:hover {
-    border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover {
-    border-color: #ddd transparent #ddd #ddd;
-    *border-right-color: #ffffff;
-}
-.tabs-right > .nav-tabs {
-    float: right;
-    margin-left: 19px;
-    border-left: 1px solid #ddd;
-}
-.tabs-right > .nav-tabs > li > a {
-    margin-left: -1px;
-    -webkit-border-radius: 0 4px 4px 0;
-       -moz-border-radius: 0 4px 4px 0;
-            border-radius: 0 4px 4px 0;
-}
-.tabs-right > .nav-tabs > li > a:hover {
-    border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover {
-    border-color: #ddd #ddd #ddd transparent;
-    *border-left-color: #ffffff;
-}
-.nav > .disabled > a {
-    color: #999999;
-}
-.nav > .disabled > a:hover {
-    text-decoration: none;
-    cursor: default;
-    background-color: transparent;
-}
-.navbar {
-    *position: relative;
-    *z-index: 2;
-    margin-bottom: 20px;
-    overflow: visible;
-    color: #777777;
-}
-.navbar-inner {
-    min-height: 40px;
-    padding-right: 20px;
-    padding-left: 20px;
-    background-color: #fafafa;
-    background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
-    background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
-    background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
-    background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
-    background-repeat: repeat-x;
-    border: 1px solid #d4d4d4;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
-    *zoom: 1;
-    -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-       -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-            box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-.navbar-inner:before,
-.navbar-inner:after {
-    display: table;
-    line-height: 0;
-    content: "";
-}
-.navbar-inner:after {
-    clear: both;
+@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;
+  }
 }
-.navbar .container {
-    width: auto;
+.nav-pills > li {
+  float: left;
 }
-.nav-collapse.collapse {
-    height: auto;
-    overflow: visible;
+.nav-pills > li > a {
+  border-radius: 4px;
 }
-.navbar .brand {
-    display: block;
-    float: left;
-    padding: 10px 20px 10px;
-    margin-left: -20px;
-    font-size: 20px;
-    font-weight: 200;
-    color: #777777;
-    text-shadow: 0 1px 0 #ffffff;
+.nav-pills > li + li {
+  margin-left: 2px;
 }
-.navbar .brand:hover {
-    text-decoration: none;
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+  color: #fff;
+  background-color: #337ab7;
 }
-.navbar-text {
-    margin-bottom: 0;
-    line-height: 40px;
+.nav-stacked > li {
+  float: none;
 }
-.navbar-link {
-    color: #777777;
+.nav-stacked > li + li {
+  margin-top: 2px;
+  margin-left: 0;
 }
-.navbar-link:hover {
-    color: #333333;
+.nav-justified {
+  width: 100%;
 }
-.navbar .divider-vertical {
-    height: 40px;
-    margin: 0 9px;
-    border-right: 1px solid #ffffff;
-    border-left: 1px solid #f2f2f2;
+.nav-justified > li {
+  float: none;
 }
-.navbar .btn,
-.navbar .btn-group {
-    margin-top: 5px;
+.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
 }
-.navbar .btn-group .btn,
-.navbar .input-prepend .btn,
-.navbar .input-append .btn {
-    margin-top: 0;
+.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
 }
-.navbar-form {
+@media (min-width: 768px) {
+  .nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-justified > li > a {
     margin-bottom: 0;
-    *zoom: 1;
+  }
 }
-.navbar-form:before,
-.navbar-form:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.nav-tabs-justified {
+  border-bottom: 0;
 }
-.navbar-form:after {
-    clear: both;
+.nav-tabs-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
 }
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
-    margin-top: 5px;
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+  border: 1px solid #ddd;
 }
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
-    display: inline-block;
-    margin-bottom: 0;
+@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;
+  }
 }
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
-    margin-top: 3px;
+.tab-content > .tab-pane {
+  display: none;
 }
-.navbar-form .input-append,
-.navbar-form .input-prepend {
-    margin-top: 6px;
-    white-space: nowrap;
+.tab-content > .active {
+  display: block;
 }
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
-    margin-top: 0;
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
 }
-.navbar-search {
-    position: relative;
+.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;
-    margin-top: 5px;
-    margin-bottom: 0;
-}
-.navbar-search .search-query {
-    padding: 4px 14px;
-    margin-bottom: 0;
-    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-    font-size: 13px;
-    font-weight: normal;
-    line-height: 1;
-    -webkit-border-radius: 15px;
-       -moz-border-radius: 15px;
-            border-radius: 15px;
+  }
+}
+.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-top .navbar-collapse,
+  .navbar-static-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+@media (max-device-width: 480px) and (orientation: landscape) {
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .container > .navbar-header,
+  .container-fluid > .navbar-header,
+  .container > .navbar-collapse,
+  .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
 }
 .navbar-static-top {
-    position: static;
-    margin-bottom: 0;
+  z-index: 1000;
+  border-width: 0 0 1px;
 }
-.navbar-static-top .navbar-inner {
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
+@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;
-    margin-bottom: 0;
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
 }
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-    border-width: 0 0 1px;
+@media (min-width: 768px) {
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    border-radius: 0;
+  }
 }
-.navbar-fixed-bottom .navbar-inner {
-    border-width: 1px 0 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
-    padding-right: 0;
-    padding-left: 0;
-    -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-            border-radius: 0;
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
 }
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-    width: 940px;
+.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:hover,
+.navbar-brand:focus {
+  text-decoration: none;
+}
+.navbar-brand > img {
+  display: block;
+}
+@media (min-width: 768px) {
+  .navbar > .container .navbar-brand,
+  .navbar > .container-fluid .navbar-brand {
+    margin-left: -15px;
+  }
+}
+.navbar-toggle {
+  position: relative;
+  float: right;
+  padding: 9px 10px;
+  margin-top: 8px;
+  margin-right: 15px;
+  margin-bottom: 8px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.navbar-toggle: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-fixed-top {
-    top: 0;
+.navbar-nav {
+  margin: 7.5px -15px;
 }
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-    -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-       -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-            box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+.navbar-nav > li > a {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  line-height: 20px;
 }
-.navbar-fixed-bottom {
-    bottom: 0;
+@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 > 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;
+  }
 }
-.navbar-fixed-bottom .navbar-inner {
-    -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-       -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-            box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+@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-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, .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 .input-group-addon,
+  .navbar-form .input-group .input-group-btn,
+  .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio,
+  .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio label,
+  .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  .navbar-form .radio input[type="radio"],
+  .navbar-form .checkbox input[type="checkbox"] {
     position: relative;
-    left: 0;
-    display: block;
-    float: left;
-    margin: 0 10px 0 0;
+    margin-left: 0;
+  }
+  .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
 }
-.navbar .nav.pull-right {
-    float: right;
+@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 {
-    float: left;
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
 }
-.navbar .nav > li > a {
-    float: none;
-    padding: 10px 15px 10px;
-    color: #777777;
-    text-decoration: none;
-    text-shadow: 0 1px 0 #ffffff;
-}
-.navbar .nav .dropdown-toggle .caret {
-    margin-top: 8px;
-}
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
-    color: #333333;
-    text-decoration: none;
-    background-color: transparent;
+.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 .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
-    color: #555555;
-    text-decoration: none;
-    background-color: #e5e5e5;
-    -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-       -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-            box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-.navbar .btn-navbar {
-    display: none;
-    float: right;
-    padding: 7px 10px;
-    margin-right: 5px;
-    margin-left: 5px;
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #ededed;
-    *background-color: #e5e5e5;
-    background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
-    background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
-    background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
-    background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
-    background-repeat: repeat-x;
-    border-color: #e5e5e5 #e5e5e5 #bfbfbf;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-}
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
-    color: #ffffff;
-    background-color: #e5e5e5;
-    *background-color: #d9d9d9;
-}
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
-    background-color: #cccccc \9;
-}
-.navbar .btn-navbar .icon-bar {
-    display: block;
-    width: 18px;
-    height: 2px;
-    background-color: #f5f5f5;
-    -webkit-border-radius: 1px;
-       -moz-border-radius: 1px;
-            border-radius: 1px;
-    -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-       -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-            box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-.btn-navbar .icon-bar + .icon-bar {
-    margin-top: 3px;
-}
-.navbar .nav > li > .dropdown-menu:before {
-    position: absolute;
-    top: -7px;
-    left: 9px;
-    display: inline-block;
-    border-right: 7px solid transparent;
-    border-bottom: 7px solid #ccc;
-    border-left: 7px solid transparent;
-    border-bottom-color: rgba(0, 0, 0, 0.2);
-    content: '';
-}
-.navbar .nav > li > .dropdown-menu:after {
-    position: absolute;
-    top: -6px;
-    left: 10px;
-    display: inline-block;
-    border-right: 6px solid transparent;
-    border-bottom: 6px solid #ffffff;
-    border-left: 6px solid transparent;
-    content: '';
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
-    top: auto;
-    bottom: -7px;
-    border-top: 7px solid #ccc;
-    border-bottom: 0;
-    border-top-color: rgba(0, 0, 0, 0.2);
+.navbar-btn {
+  margin-top: 8px;
+  margin-bottom: 8px;
 }
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
-    top: auto;
-    bottom: -6px;
-    border-top: 6px solid #ffffff;
-    border-bottom: 0;
+.navbar-btn.btn-sm {
+  margin-top: 10px;
+  margin-bottom: 10px;
 }
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
-    color: #555555;
-    background-color: #e5e5e5;
+.navbar-btn.btn-xs {
+  margin-top: 14px;
+  margin-bottom: 14px;
 }
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
-    border-top-color: #777777;
-    border-bottom-color: #777777;
+.navbar-text {
+  margin-top: 15px;
+  margin-bottom: 15px;
 }
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
-    border-top-color: #555555;
-    border-bottom-color: #555555;
+@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:hover,
+.navbar-default .navbar-brand:focus {
+  color: #5e5e5e;
+  background-color: transparent;
+}
+.navbar-default .navbar-text {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+  color: #333;
+  background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+  color: #ccc;
+  background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+  border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+  background-color: #ddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+  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: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 .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
-    right: 0;
-    left: auto;
+.navbar-default .navbar-link {
+  color: #777;
 }
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
-    right: 12px;
-    left: auto;
+.navbar-default .navbar-link:hover {
+  color: #333;
 }
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
-    right: 13px;
-    left: auto;
+.navbar-default .btn-link {
+  color: #777;
 }
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
-    right: 100%;
-    left: auto;
-    margin-right: -1px;
-    margin-left: 0;
-    -webkit-border-radius: 6px 0 6px 6px;
-       -moz-border-radius: 6px 0 6px 6px;
-            border-radius: 6px 0 6px 6px;
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+  color: #333;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+  color: #ccc;
 }
 .navbar-inverse {
-    color: #999999;
-}
-.navbar-inverse .navbar-inner {
-    background-color: #1b1b1b;
-    background-image: -moz-linear-gradient(top, #222222, #111111);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
-    background-image: -webkit-linear-gradient(top, #222222, #111111);
-    background-image: -o-linear-gradient(top, #222222, #111111);
-    background-image: linear-gradient(to bottom, #222222, #111111);
-    background-repeat: repeat-x;
-    border-color: #252525;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
-}
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
-    color: #999999;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover {
-    color: #ffffff;
-}
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
-    color: #ffffff;
+  background-color: #222;
+  border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+  color: #444;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+  border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+  background-color: #333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+  background-color: #fff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+  border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+  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 .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 .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
-    color: #ffffff;
-    background-color: #111111;
+  }
+  .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: #999999;
+  color: #9d9d9d;
 }
 .navbar-inverse .navbar-link:hover {
-    color: #ffffff;
-}
-.navbar-inverse .divider-vertical {
-    border-right-color: #222222;
-    border-left-color: #111111;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
-    color: #ffffff;
-    background-color: #111111;
-}
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
-    border-top-color: #999999;
-    border-bottom-color: #999999;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
-    border-top-color: #ffffff;
-    border-bottom-color: #ffffff;
-}
-.navbar-inverse .navbar-search .search-query {
-    color: #ffffff;
-    background-color: #515151;
-    border-color: #111111;
-    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-       -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-            box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-    -webkit-transition: none;
-       -moz-transition: none;
-         -o-transition: none;
-            transition: none;
-}
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
-    color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
-    color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
-    color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
-    padding: 5px 15px;
-    color: #333333;
-    text-shadow: 0 1px 0 #ffffff;
-    background-color: #ffffff;
-    border: 0;
-    outline: 0;
-    -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-       -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-            box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-.navbar-inverse .btn-navbar {
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #0e0e0e;
-    *background-color: #040404;
-    background-image: -moz-linear-gradient(top, #151515, #040404);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
-    background-image: -webkit-linear-gradient(top, #151515, #040404);
-    background-image: -o-linear-gradient(top, #151515, #040404);
-    background-image: linear-gradient(to bottom, #151515, #040404);
-    background-repeat: repeat-x;
-    border-color: #040404 #040404 #000000;
-    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
-    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
-    color: #ffffff;
-    background-color: #040404;
-    *background-color: #000000;
-}
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
-    background-color: #000000 \9;
-}
-.breadcrumb {
-    padding: 8px 15px;
-    margin: 0 0 20px;
-    list-style: none;
-    background-color: #f5f5f5;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-}
-.breadcrumb li {
-    display: inline-block;
-    *display: inline;
-    text-shadow: 0 1px 0 #ffffff;
-    *zoom: 1;
+  color: #fff;
 }
-.breadcrumb .divider {
-    padding: 0 5px;
-    color: #ccc;
+.navbar-inverse .btn-link {
+  color: #9d9d9d;
 }
-.breadcrumb .active {
-    color: #999999;
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+  color: #fff;
 }
-.pagination {
-    margin: 20px 0;
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+  color: #444;
 }
-.pagination ul {
-    display: inline-block;
-    *display: inline;
-    margin-bottom: 0;
-    margin-left: 0;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-    *zoom: 1;
-    -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-       -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-            box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.pagination ul > li {
-    display: inline;
-}
-.pagination ul > li > a,
-.pagination ul > li > span {
-    float: left;
-    padding: 4px 12px;
-    line-height: 20px;
-    text-decoration: none;
-    background-color: #ffffff;
-    border: 1px solid #dddddd;
-    border-left-width: 0;
-}
-.pagination ul > li > a:hover,
-.pagination ul > .active > a,
-.pagination ul > .active > span {
-    background-color: #f5f5f5;
-}
-.pagination ul > .active > a,
-.pagination ul > .active > span {
-    color: #999999;
-    cursor: default;
-}
-.pagination ul > .disabled > span,
-.pagination ul > .disabled > a,
-.pagination ul > .disabled > a:hover {
-    color: #999999;
-    cursor: default;
-    background-color: transparent;
+.breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  border-radius: 4px;
 }
-.pagination ul > li:first-child > a,
-.pagination ul > li:first-child > span {
-    border-left-width: 1px;
-    -webkit-border-bottom-left-radius: 4px;
-            border-bottom-left-radius: 4px;
-    -webkit-border-top-left-radius: 4px;
-            border-top-left-radius: 4px;
-    -moz-border-radius-bottomleft: 4px;
-    -moz-border-radius-topleft: 4px;
-}
-.pagination ul > li:last-child > a,
-.pagination ul > li:last-child > span {
-    -webkit-border-top-right-radius: 4px;
-            border-top-right-radius: 4px;
-    -webkit-border-bottom-right-radius: 4px;
-            border-bottom-right-radius: 4px;
-    -moz-border-radius-topright: 4px;
-    -moz-border-radius-bottomright: 4px;
-}
-.pagination-centered {
-    text-align: center;
-}
-.pagination-right {
-    text-align: right;
+.breadcrumb > li {
+  display: inline-block;
 }
-.pagination-large ul > li > a,
-.pagination-large ul > li > span {
-    padding: 11px 19px;
-    font-size: 17.5px;
-}
-.pagination-large ul > li:first-child > a,
-.pagination-large ul > li:first-child > span {
-    -webkit-border-bottom-left-radius: 6px;
-            border-bottom-left-radius: 6px;
-    -webkit-border-top-left-radius: 6px;
-            border-top-left-radius: 6px;
-    -moz-border-radius-bottomleft: 6px;
-    -moz-border-radius-topleft: 6px;
-}
-.pagination-large ul > li:last-child > a,
-.pagination-large ul > li:last-child > span {
-    -webkit-border-top-right-radius: 6px;
-            border-top-right-radius: 6px;
-    -webkit-border-bottom-right-radius: 6px;
-            border-bottom-right-radius: 6px;
-    -moz-border-radius-topright: 6px;
-    -moz-border-radius-bottomright: 6px;
-}
-.pagination-mini ul > li:first-child > a,
-.pagination-small ul > li:first-child > a,
-.pagination-mini ul > li:first-child > span,
-.pagination-small ul > li:first-child > span {
-    -webkit-border-bottom-left-radius: 3px;
-            border-bottom-left-radius: 3px;
-    -webkit-border-top-left-radius: 3px;
-            border-top-left-radius: 3px;
-    -moz-border-radius-bottomleft: 3px;
-    -moz-border-radius-topleft: 3px;
-}
-.pagination-mini ul > li:last-child > a,
-.pagination-small ul > li:last-child > a,
-.pagination-mini ul > li:last-child > span,
-.pagination-small ul > li:last-child > span {
-    -webkit-border-top-right-radius: 3px;
-            border-top-right-radius: 3px;
-    -webkit-border-bottom-right-radius: 3px;
-            border-bottom-right-radius: 3px;
-    -moz-border-radius-topright: 3px;
-    -moz-border-radius-bottomright: 3px;
-}
-.pagination-small ul > li > a,
-.pagination-small ul > li > span {
-    padding: 2px 10px;
-    font-size: 11.9px;
-}
-.pagination-mini ul > li > a,
-.pagination-mini ul > li > span {
-    padding: 1px 6px;
-    font-size: 10.5px;
+.breadcrumb > li + li:before {
+  padding: 0 5px;
+  color: #ccc;
+  content: "/\00a0";
 }
-.pager {
-    margin: 20px 0;
-    text-align: center;
-    list-style: none;
-    *zoom: 1;
+.breadcrumb > .active {
+  color: #777;
 }
-.pager:before,
-.pager:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.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:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+  z-index: 2;
+  color: #23527c;
+  background-color: #eee;
+  border-color: #ddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+  z-index: 3;
+  color: #fff;
+  cursor: default;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+  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: 3px;
+  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:after {
-    clear: both;
+.pager {
+  padding-left: 0;
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
 }
 .pager li {
-    display: inline;
+  display: inline;
 }
 .pager li > a,
 .pager li > span {
-    display: inline-block;
-    padding: 5px 14px;
-    background-color: #fff;
-    border: 1px solid #ddd;
-    -webkit-border-radius: 15px;
-       -moz-border-radius: 15px;
-            border-radius: 15px;
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 15px;
 }
-.pager li > a:hover {
-    text-decoration: none;
-    background-color: #f5f5f5;
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
 }
 .pager .next > a,
 .pager .next > span {
-    float: right;
+  float: right;
 }
 .pager .previous > a,
 .pager .previous > span {
-    float: left;
+  float: left;
 }
 .pager .disabled > a,
 .pager .disabled > a:hover,
+.pager .disabled > a:focus,
 .pager .disabled > span {
-    color: #999999;
-    cursor: default;
-    background-color: #fff;
-}
-.modal-backdrop {
-    position: fixed;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    z-index: 1040;
-    background-color: #000000;
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
 }
-.modal-backdrop.fade {
-    opacity: 0;
+.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;
 }
-.modal-backdrop,
-.modal-backdrop.fade.in {
-    opacity: 0.8;
-    filter: alpha(opacity=80);
+a.label:hover,
+a.label:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
 }
-.modal {
-    position: fixed;
-    top: 50%;
-    left: 50%;
-    z-index: 1050;
-    width: 560px;
-    margin: -250px 0 0 -280px;
-    background-color: #ffffff;
-    border: 1px solid #999;
-    border: 1px solid rgba(0, 0, 0, 0.3);
-    *border: 1px solid #999;
-    -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
-            border-radius: 6px;
-    outline: none;
-    -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-       -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-            box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-    -webkit-background-clip: padding-box;
-       -moz-background-clip: padding-box;
-            background-clip: padding-box;
-}
-.modal.fade {
-    top: -25%;
-    -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
-       -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
-         -o-transition: opacity 0.3s linear, top 0.3s ease-out;
-            transition: opacity 0.3s linear, top 0.3s ease-out;
-}
-.modal.fade.in {
-    top: 50%;
+.label:empty {
+  display: none;
 }
-.modal-header {
-    padding: 9px 15px;
-    border-bottom: 1px solid #eee;
+.btn .label {
+  position: relative;
+  top: -1px;
 }
-.modal-header .close {
-    margin-top: 2px;
+.label-default {
+  background-color: #777;
 }
-.modal-header h3 {
-    margin: 0;
-    line-height: 30px;
+.label-default[href]:hover,
+.label-default[href]:focus {
+  background-color: #5e5e5e;
 }
-.modal-body {
-    max-height: 400px;
-    padding: 15px;
-    overflow-y: auto;
+.label-primary {
+  background-color: #337ab7;
 }
-.modal-form {
-    margin-bottom: 0;
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+  background-color: #286090;
 }
-.modal-footer {
-    padding: 14px 15px 15px;
-    margin-bottom: 0;
-    text-align: right;
-    background-color: #f5f5f5;
-    border-top: 1px solid #ddd;
-    -webkit-border-radius: 0 0 6px 6px;
-       -moz-border-radius: 0 0 6px 6px;
-            border-radius: 0 0 6px 6px;
-    *zoom: 1;
-    -webkit-box-shadow: inset 0 1px 0 #ffffff;
-       -moz-box-shadow: inset 0 1px 0 #ffffff;
-            box-shadow: inset 0 1px 0 #ffffff;
+.label-success {
+  background-color: #5cb85c;
 }
-.modal-footer:before,
-.modal-footer:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.label-success[href]:hover,
+.label-success[href]:focus {
+  background-color: #449d44;
 }
-.modal-footer:after {
-    clear: both;
+.label-info {
+  background-color: #5bc0de;
 }
-.modal-footer .btn + .btn {
-    margin-bottom: 0;
-    margin-left: 5px;
+.label-info[href]:hover,
+.label-info[href]:focus {
+  background-color: #31b0d5;
 }
-.modal-footer .btn-group .btn + .btn {
-    margin-left: -1px;
+.label-warning {
+  background-color: #f0ad4e;
 }
-.modal-footer .btn-block + .btn-block {
-    margin-left: 0;
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+  background-color: #ec971f;
 }
-.tooltip {
-    position: absolute;
-    z-index: 1030;
-    display: block;
-    padding: 5px;
-    font-size: 11px;
-    opacity: 0;
-    filter: alpha(opacity=0);
-    visibility: visible;
+.label-danger {
+  background-color: #d9534f;
 }
-.tooltip.in {
-    opacity: 0.8;
-    filter: alpha(opacity=80);
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+  background-color: #c9302c;
 }
-.tooltip.top {
-    margin-top: -3px;
+.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: middle;
+  background-color: #777;
+  border-radius: 10px;
+}
+.badge:empty {
+  display: none;
 }
-.tooltip.right {
-    margin-left: 3px;
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-xs .badge,
+.btn-group-xs > .btn .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+  color: #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;
+  }
 }
-.tooltip.bottom {
-    margin-top: 3px;
+.thumbnail {
+  display: block;
+  padding: 4px;
+  margin-bottom: 20px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: border .2s ease-in-out;
+       -o-transition: border .2s ease-in-out;
+          transition: border .2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+  margin-right: auto;
+  margin-left: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: #337ab7;
 }
-.tooltip.left {
-    margin-left: -3px;
+.thumbnail .caption {
+  padding: 9px;
+  color: #333;
 }
-.tooltip-inner {
-    max-width: 200px;
-    padding: 3px 8px;
-    color: #ffffff;
-    text-align: center;
-    text-decoration: none;
-    background-color: #000000;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
+.alert {
+  padding: 15px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+  border-radius: 4px;
 }
-.tooltip-arrow {
-    position: absolute;
-    width: 0;
-    height: 0;
-    border-color: transparent;
-    border-style: solid;
+.alert h4 {
+  margin-top: 0;
+  color: inherit;
 }
-.tooltip.top .tooltip-arrow {
-    bottom: 0;
-    left: 50%;
-    margin-left: -5px;
-    border-top-color: #000000;
-    border-width: 5px 5px 0;
+.alert .alert-link {
+  font-weight: bold;
 }
-.tooltip.right .tooltip-arrow {
-    top: 50%;
-    left: 0;
-    margin-top: -5px;
-    border-right-color: #000000;
-    border-width: 5px 5px 5px 0;
+.alert > p,
+.alert > ul {
+  margin-bottom: 0;
 }
-.tooltip.left .tooltip-arrow {
-    top: 50%;
-    right: 0;
-    margin-top: -5px;
-    border-left-color: #000000;
-    border-width: 5px 0 5px 5px;
+.alert > p + p {
+  margin-top: 5px;
 }
-.tooltip.bottom .tooltip-arrow {
-    top: 0;
-    left: 50%;
-    margin-left: -5px;
-    border-bottom-color: #000000;
-    border-width: 0 5px 5px;
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 35px;
 }
-.popover {
-    position: absolute;
-    top: 0;
-    left: 0;
-    z-index: 1010;
-    display: none;
-    width: 236px;
-    padding: 1px;
-    background-color: #ffffff;
-    border: 1px solid #ccc;
-    border: 1px solid rgba(0, 0, 0, 0.2);
-    -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
-            border-radius: 6px;
-    -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-       -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-            box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-    -webkit-background-clip: padding-box;
-       -moz-background-clip: padding;
-            background-clip: padding-box;
+.alert-dismissable .close,
+.alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
 }
-.popover.top {
-    margin-top: -10px;
+.alert-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
 }
-.popover.right {
-    margin-left: 10px;
+.alert-success hr {
+  border-top-color: #c9e2b3;
 }
-.popover.bottom {
-    margin-top: 10px;
+.alert-success .alert-link {
+  color: #2b542c;
 }
-.popover.left {
-    margin-left: -10px;
+.alert-info {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
 }
-.popover-title {
-    padding: 8px 14px;
-    margin: 0;
-    font-size: 14px;
-    font-weight: normal;
-    line-height: 18px;
-    background-color: #f7f7f7;
-    border-bottom: 1px solid #ebebeb;
-    -webkit-border-radius: 5px 5px 0 0;
-       -moz-border-radius: 5px 5px 0 0;
-            border-radius: 5px 5px 0 0;
+.alert-info hr {
+  border-top-color: #a6e1ec;
 }
-.popover-content {
-    padding: 9px 14px;
+.alert-info .alert-link {
+  color: #245269;
 }
-.popover-content p,
-.popover-content ul,
-.popover-content ol {
-    margin-bottom: 0;
+.alert-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
 }
-.popover .arrow,
-.popover .arrow:after {
-    position: absolute;
-    display: inline-block;
-    width: 0;
-    height: 0;
-    border-color: transparent;
-    border-style: solid;
+.alert-warning hr {
+  border-top-color: #f7e1b5;
 }
-.popover .arrow:after {
-    z-index: -1;
-    content: "";
+.alert-warning .alert-link {
+  color: #66512c;
 }
-.popover.top .arrow {
-    bottom: -10px;
-    left: 50%;
-    margin-left: -10px;
-    border-top-color: #ffffff;
-    border-width: 10px 10px 0;
-}
-.popover.top .arrow:after {
-    bottom: -1px;
-    left: -11px;
-    border-top-color: rgba(0, 0, 0, 0.25);
-    border-width: 11px 11px 0;
-}
-.popover.right .arrow {
-    top: 50%;
-    left: -10px;
-    margin-top: -10px;
-    border-right-color: #ffffff;
-    border-width: 10px 10px 10px 0;
+.alert-danger {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
 }
-.popover.right .arrow:after {
-    bottom: -11px;
-    left: -1px;
-    border-right-color: rgba(0, 0, 0, 0.25);
-    border-width: 11px 11px 11px 0;
+.alert-danger hr {
+  border-top-color: #e4b9c0;
 }
-.popover.bottom .arrow {
-    top: -10px;
-    left: 50%;
-    margin-left: -10px;
-    border-bottom-color: #ffffff;
-    border-width: 0 10px 10px;
-}
-.popover.bottom .arrow:after {
-    top: -1px;
-    left: -11px;
-    border-bottom-color: rgba(0, 0, 0, 0.25);
-    border-width: 0 11px 11px;
-}
-.popover.left .arrow {
-    top: 50%;
-    right: -10px;
-    margin-top: -10px;
-    border-left-color: #ffffff;
-    border-width: 10px 0 10px 10px;
-}
-.popover.left .arrow:after {
-    right: -1px;
-    bottom: -11px;
-    border-left-color: rgba(0, 0, 0, 0.25);
-    border-width: 11px 0 11px 11px;
-}
-.thumbnails {
-    margin-left: -20px;
-    list-style: none;
-    *zoom: 1;
-}
-.thumbnails:before,
-.thumbnails:after {
-    display: table;
-    line-height: 0;
-    content: "";
+.alert-danger .alert-link {
+  color: #843534;
 }
-.thumbnails:after {
-    clear: both;
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
 }
-.row-fluid .thumbnails {
-    margin-left: 0;
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
 }
-.thumbnails > li {
-    float: left;
-    margin-bottom: 20px;
-    margin-left: 20px;
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
 }
-.thumbnail {
-    display: block;
-    padding: 4px;
-    line-height: 20px;
-    border: 1px solid #ddd;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-       -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-            box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-    -webkit-transition: all 0.2s ease-in-out;
-       -moz-transition: all 0.2s ease-in-out;
-         -o-transition: all 0.2s ease-in-out;
-            transition: all 0.2s ease-in-out;
-}
-a.thumbnail:hover {
-    border-color: #0088cc;
-    -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-       -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-            box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-.thumbnail > img {
-    display: block;
-    max-width: 100%;
-    margin-right: auto;
-    margin-left: auto;
+.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: center;
+  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-striped .progress-bar,
+.progress-bar-striped {
+  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.active .progress-bar,
+.progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar-success {
+  background-color: #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-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-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-danger {
+  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;
 }
-.thumbnail .caption {
-    padding: 9px;
-    color: #555555;
+.media:first-child {
+  margin-top: 0;
 }
 .media,
 .media-body {
-    overflow: hidden;
-    *overflow: visible;
-    zoom: 1;
-}
-.media,
-.media .media {
-    margin-top: 15px;
+  overflow: hidden;
+  zoom: 1;
 }
-.media:first-child {
-    margin-top: 0;
+.media-body {
+  width: 10000px;
 }
 .media-object {
-    display: block;
+  display: block;
 }
-.media-heading {
-    margin: 0 0 5px;
+.media-object.img-thumbnail {
+  max-width: none;
+}
+.media-right,
+.media > .pull-right {
+  padding-left: 10px;
+}
+.media-left,
+.media > .pull-left {
+  padding-right: 10px;
+}
+.media-left,
+.media-right,
+.media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+.media-middle {
+  vertical-align: middle;
 }
-.media .pull-left {
-    margin-right: 10px;
+.media-bottom {
+  vertical-align: bottom;
 }
-.media .pull-right {
-    margin-left: 10px;
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
 }
 .media-list {
-    margin-left: 0;
-    list-style: none;
+  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-left-radius: 4px;
+  border-top-right-radius: 4px;
+}
+.list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+a.list-group-item,
+button.list-group-item {
+  color: #555;
+}
+a.list-group-item .list-group-item-heading,
+button.list-group-item .list-group-item-heading {
+  color: #333;
+}
+a.list-group-item:hover,
+button.list-group-item:hover,
+a.list-group-item:focus,
+button.list-group-item:focus {
+  color: #555;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+button.list-group-item {
+  width: 100%;
+  text-align: left;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #eee;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+  color: #777;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  z-index: 2;
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+  color: #c7ddef;
+}
+.list-group-item-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+}
+a.list-group-item-success,
+button.list-group-item-success {
+  color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading,
+button.list-group-item-success .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-success:hover,
+button.list-group-item-success:hover,
+a.list-group-item-success:focus,
+button.list-group-item-success:focus {
+  color: #3c763d;
+  background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+button.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+button.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus,
+button.list-group-item-success.active:focus {
+  color: #fff;
+  background-color: #3c763d;
+  border-color: #3c763d;
+}
+.list-group-item-info {
+  color: #31708f;
+  background-color: #d9edf7;
+}
+a.list-group-item-info,
+button.list-group-item-info {
+  color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading,
+button.list-group-item-info .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-info:hover,
+button.list-group-item-info:hover,
+a.list-group-item-info:focus,
+button.list-group-item-info:focus {
+  color: #31708f;
+  background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+button.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+button.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus,
+button.list-group-item-info.active:focus {
+  color: #fff;
+  background-color: #31708f;
+  border-color: #31708f;
+}
+.list-group-item-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+}
+a.list-group-item-warning,
+button.list-group-item-warning {
+  color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading,
+button.list-group-item-warning .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-warning:hover,
+button.list-group-item-warning:hover,
+a.list-group-item-warning:focus,
+button.list-group-item-warning:focus {
+  color: #8a6d3b;
+  background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+button.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+button.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus,
+button.list-group-item-warning.active:focus {
+  color: #fff;
+  background-color: #8a6d3b;
+  border-color: #8a6d3b;
+}
+.list-group-item-danger {
+  color: #a94442;
+  background-color: #f2dede;
+}
+a.list-group-item-danger,
+button.list-group-item-danger {
+  color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading,
+button.list-group-item-danger .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-danger:hover,
+button.list-group-item-danger:hover,
+a.list-group-item-danger:focus,
+button.list-group-item-danger:focus {
+  color: #a94442;
+  background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+button.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+button.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus,
+button.list-group-item-danger.active:focus {
+  color: #fff;
+  background-color: #a94442;
+  border-color: #a94442;
+}
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
+.panel {
+  margin-bottom: 20px;
+  background-color: #fff;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+.panel-body {
+  padding: 15px;
+}
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 16px;
+  color: inherit;
+}
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+  color: inherit;
+}
+.panel-footer {
+  padding: 10px 15px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+  margin-bottom: 0;
+}
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+  border-width: 1px 0;
+  border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+  border-top: 0;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+  border-top: 1px solid #ddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+  border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+  border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+.panel > .table-responsive {
+  margin-bottom: 0;
+  border: 0;
+}
+.panel-group {
+  margin-bottom: 20px;
+}
+.panel-group .panel {
+  margin-bottom: 0;
+  border-radius: 4px;
+}
+.panel-group .panel + .panel {
+  margin-top: 5px;
+}
+.panel-group .panel-heading {
+  border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+  border-top: 1px solid #ddd;
+}
+.panel-group .panel-footer {
+  border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+  border-bottom: 1px solid #ddd;
+}
+.panel-default {
+  border-color: #ddd;
+}
+.panel-default > .panel-heading {
+  color: #333;
+  background-color: #f5f5f5;
+  border-color: #ddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ddd;
+}
+.panel-default > .panel-heading .badge {
+  color: #f5f5f5;
+  background-color: #333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ddd;
+}
+.panel-primary {
+  border-color: #337ab7;
+}
+.panel-primary > .panel-heading {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #337ab7;
+}
+.panel-primary > .panel-heading .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #337ab7;
+}
+.panel-success {
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+  color: #dff0d8;
+  background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #d6e9c6;
+}
+.panel-info {
+  border-color: #bce8f1;
 }
-.label,
-.badge {
-    display: inline-block;
-    padding: 2px 4px;
-    font-size: 11.844px;
-    font-weight: bold;
-    line-height: 14px;
-    color: #ffffff;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    white-space: nowrap;
-    vertical-align: baseline;
-    background-color: #999999;
+.panel-info > .panel-heading {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
 }
-.label {
-    -webkit-border-radius: 3px;
-       -moz-border-radius: 3px;
-            border-radius: 3px;
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #bce8f1;
 }
-.badge {
-    padding-right: 9px;
-    padding-left: 9px;
-    -webkit-border-radius: 9px;
-       -moz-border-radius: 9px;
-            border-radius: 9px;
+.panel-info > .panel-heading .badge {
+  color: #d9edf7;
+  background-color: #31708f;
 }
-a.label:hover,
-a.badge:hover {
-    color: #ffffff;
-    text-decoration: none;
-    cursor: pointer;
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #bce8f1;
 }
-.label-important,
-.badge-important {
-    background-color: #b94a48;
+.panel-warning {
+  border-color: #faebcc;
 }
-.label-important[href],
-.badge-important[href] {
-    background-color: #953b39;
+.panel-warning > .panel-heading {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
 }
-.label-warning,
-.badge-warning {
-    background-color: #f89406;
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #faebcc;
 }
-.label-warning[href],
-.badge-warning[href] {
-    background-color: #c67605;
+.panel-warning > .panel-heading .badge {
+  color: #fcf8e3;
+  background-color: #8a6d3b;
 }
-.label-success,
-.badge-success {
-    background-color: #468847;
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #faebcc;
 }
-.label-success[href],
-.badge-success[href] {
-    background-color: #356635;
+.panel-danger {
+  border-color: #ebccd1;
 }
-.label-info,
-.badge-info {
-    background-color: #3a87ad;
+.panel-danger > .panel-heading {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
 }
-.label-info[href],
-.badge-info[href] {
-    background-color: #2d6987;
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ebccd1;
 }
-.label-inverse,
-.badge-inverse {
-    background-color: #333333;
+.panel-danger > .panel-heading .badge {
+  color: #f2dede;
+  background-color: #a94442;
 }
-.label-inverse[href],
-.badge-inverse[href] {
-    background-color: #1a1a1a;
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ebccd1;
 }
-.btn .label,
-.btn .badge {
-    position: relative;
-    top: -1px;
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
 }
-.btn-mini .label,
-.btn-mini .badge {
-    top: 0;
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border: 0;
 }
-@-webkit-keyframes progress-bar-stripes {
-    from {
-      background-position: 40px 0;
-    }
-    to {
-      background-position: 0 0;
-    }
-}
-@-moz-keyframes progress-bar-stripes {
-    from {
-      background-position: 40px 0;
-    }
-    to {
-      background-position: 0 0;
-    }
-}
-@-ms-keyframes progress-bar-stripes {
-    from {
-      background-position: 40px 0;
-    }
-    to {
-      background-position: 0 0;
-    }
+.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
 }
-@-o-keyframes progress-bar-stripes {
-    from {
-      background-position: 0 0;
-    }
-    to {
-      background-position: 40px 0;
-    }
+.embed-responsive-4by3 {
+  padding-bottom: 75%;
 }
-@keyframes progress-bar-stripes {
-    from {
-      background-position: 40px 0;
-    }
-    to {
-      background-position: 0 0;
-    }
+.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, .05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
 }
-.progress {
-    height: 20px;
-    margin-bottom: 20px;
-    overflow: hidden;
-    background-color: #f7f7f7;
-    background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
-    background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
-    background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
-    background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
-    background-repeat: repeat-x;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-       -moz-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;
-    color: #ffffff;
-    text-align: center;
-    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-    background-color: #0e90d2;
-    background-image: -moz-linear-gradient(top, #149bdf, #0480be);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
-    background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
-    background-image: -o-linear-gradient(top, #149bdf, #0480be);
-    background-image: linear-gradient(to bottom, #149bdf, #0480be);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
-    -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-       -moz-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-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-            box-sizing: border-box;
-    -webkit-transition: width 0.6s ease;
-       -moz-transition: width 0.6s ease;
-         -o-transition: width 0.6s ease;
-            transition: width 0.6s ease;
-}
-.progress .bar + .bar {
-    -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-       -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-            box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-}
-.progress-striped .bar {
-    background-color: #149bdf;
-    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-    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: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    -webkit-background-size: 40px 40px;
-       -moz-background-size: 40px 40px;
-         -o-background-size: 40px 40px;
-            background-size: 40px 40px;
-}
-.progress.active .bar {
-    -webkit-animation: progress-bar-stripes 2s linear infinite;
-       -moz-animation: progress-bar-stripes 2s linear infinite;
-        -ms-animation: progress-bar-stripes 2s linear infinite;
-         -o-animation: progress-bar-stripes 2s linear infinite;
-            animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-danger .bar,
-.progress .bar-danger {
-    background-color: #dd514c;
-    background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
-    background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
-    background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
-    background-color: #ee5f5b;
-    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-    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: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-success .bar,
-.progress .bar-success {
-    background-color: #5eb95e;
-    background-image: -moz-linear-gradient(top, #62c462, #57a957);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
-    background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-    background-image: -o-linear-gradient(top, #62c462, #57a957);
-    background-image: linear-gradient(to bottom, #62c462, #57a957);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
-    background-color: #62c462;
-    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-    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: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-info .bar,
-.progress .bar-info {
-    background-color: #4bb1cf;
-    background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
-    background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
-    background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
-    background-color: #5bc0de;
-    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-    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: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-warning .bar,
-.progress .bar-warning {
-    background-color: #faa732;
-    background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-    background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-    background-image: -o-linear-gradient(top, #fbb450, #f89406);
-    background-image: linear-gradient(to bottom, #fbb450, #f89406);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
-    background-color: #fbb450;
-    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-    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: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.accordion {
-    margin-bottom: 20px;
-}
-.accordion-group {
-    margin-bottom: 2px;
-    border: 1px solid #e5e5e5;
-    -webkit-border-radius: 4px;
-       -moz-border-radius: 4px;
-            border-radius: 4px;
-}
-.accordion-heading {
-    border-bottom: 0;
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, .15);
 }
-.accordion-heading .accordion-toggle {
-    display: block;
-    padding: 8px 15px;
+.well-lg {
+  padding: 24px;
+  border-radius: 6px;
 }
-.accordion-toggle {
-    cursor: pointer;
+.well-sm {
+  padding: 9px;
+  border-radius: 3px;
 }
-.accordion-inner {
-    padding: 9px 15px;
-    border-top: 1px solid #e5e5e5;
+.close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  filter: alpha(opacity=20);
+  opacity: .2;
+}
+.close:hover,
+.close:focus {
+  color: #000;
+  text-decoration: none;
+  cursor: pointer;
+  filter: alpha(opacity=50);
+  opacity: .5;
 }
-.carousel {
-    position: relative;
-    margin-bottom: 20px;
-    line-height: 1;
+button.close {
+  -webkit-appearance: none;
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
 }
-.carousel-inner {
-    position: relative;
-    width: 100%;
-    overflow: hidden;
+.modal-open {
+  overflow: hidden;
 }
-.carousel .item {
-    position: relative;
-    display: none;
-    -webkit-transition: 0.6s ease-in-out left;
-       -moz-transition: 0.6s ease-in-out left;
-         -o-transition: 0.6s ease-in-out left;
-            transition: 0.6s ease-in-out left;
+.modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  overflow: hidden;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.modal.fade .modal-dialog {
+  -webkit-transition: -webkit-transform .3s ease-out;
+       -o-transition:      -o-transform .3s ease-out;
+          transition:         transform .3s ease-out;
+  -webkit-transform: translate(0, -25%);
+      -ms-transform: translate(0, -25%);
+       -o-transform: translate(0, -25%);
+          transform: translate(0, -25%);
+}
+.modal.in .modal-dialog {
+  -webkit-transform: translate(0, 0);
+      -ms-transform: translate(0, 0);
+       -o-transform: translate(0, 0);
+          transform: translate(0, 0);
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+.modal-content {
+  position: relative;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  outline: 0;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
 }
-.carousel .item > img {
-    display: block;
-    line-height: 1;
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000;
 }
-.carousel .active,
-.carousel .next,
-.carousel .prev {
-    display: block;
+.modal-backdrop.fade {
+  filter: alpha(opacity=0);
+  opacity: 0;
 }
-.carousel .active {
-    left: 0;
+.modal-backdrop.in {
+  filter: alpha(opacity=50);
+  opacity: .5;
 }
-.carousel .next,
-.carousel .prev {
-    position: absolute;
-    top: 0;
-    width: 100%;
+.modal-header {
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
 }
-.carousel .next {
-    left: 100%;
+.modal-header .close {
+  margin-top: -2px;
 }
-.carousel .prev {
-    left: -100%;
+.modal-title {
+  margin: 0;
+  line-height: 1.42857143;
 }
-.carousel .next.left,
-.carousel .prev.right {
-    left: 0;
+.modal-body {
+  position: relative;
+  padding: 15px;
 }
-.carousel .active.left {
-    left: -100%;
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5;
 }
-.carousel .active.right {
-    left: 100%;
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
 }
-.carousel-control {
-    position: absolute;
-    top: 40%;
-    left: 15px;
-    width: 40px;
-    height: 40px;
-    margin-top: -20px;
-    font-size: 60px;
-    font-weight: 100;
-    line-height: 30px;
-    color: #ffffff;
-    text-align: center;
-    background: #222222;
-    border: 3px solid #ffffff;
-    -webkit-border-radius: 23px;
-       -moz-border-radius: 23px;
-            border-radius: 23px;
-    opacity: 0.5;
-    filter: alpha(opacity=50);
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
 }
-.carousel-control.right {
-    right: 15px;
-    left: auto;
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+  }
+  .modal-sm {
+    width: 300px;
+  }
 }
-.carousel-control:hover {
-    color: #ffffff;
-    text-decoration: none;
-    opacity: 0.9;
-    filter: alpha(opacity=90);
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px;
+  }
 }
-.carousel-caption {
-    position: absolute;
-    right: 0;
-    bottom: 0;
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 12px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  filter: alpha(opacity=0);
+  opacity: 0;
+
+  line-break: auto;
+}
+.tooltip.in {
+  filter: alpha(opacity=90);
+  opacity: .9;
+}
+.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;
+  background-color: #000;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-left .tooltip-arrow {
+  right: 5px;
+  bottom: 0;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+
+  line-break: auto;
+}
+.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;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: 5px 5px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover > .arrow {
+  border-width: 11px;
+}
+.popover > .arrow:after {
+  content: "";
+  border-width: 10px;
+}
+.popover.top > .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, .25);
+  border-bottom-width: 0;
+}
+.popover.top > .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-color: #fff;
+  border-bottom-width: 0;
+}
+.popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, .25);
+  border-left-width: 0;
+}
+.popover.right > .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  content: " ";
+  border-right-color: #fff;
+  border-left-width: 0;
+}
+.popover.bottom > .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, .25);
+}
+.popover.bottom > .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-width: 0;
+  border-bottom-color: #fff;
+}
+.popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, .25);
+}
+.popover.left > .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  content: " ";
+  border-right-width: 0;
+  border-left-color: #fff;
+}
+.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;
+       -o-transition: .6s ease-in-out left;
+          transition: .6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  line-height: 1;
+}
+@media all and (transform-3d), (-webkit-transform-3d) {
+  .carousel-inner > .item {
+    -webkit-transition: -webkit-transform .6s ease-in-out;
+         -o-transition:      -o-transform .6s ease-in-out;
+            transition:         transform .6s ease-in-out;
+
+    -webkit-backface-visibility: hidden;
+            backface-visibility: hidden;
+    -webkit-perspective: 1000px;
+            perspective: 1000px;
+  }
+  .carousel-inner > .item.next,
+  .carousel-inner > .item.active.right {
     left: 0;
-    padding: 15px;
-    background: #333333;
-    background: rgba(0, 0, 0, 0.75);
+    -webkit-transform: translate3d(100%, 0, 0);
+            transform: translate3d(100%, 0, 0);
+  }
+  .carousel-inner > .item.prev,
+  .carousel-inner > .item.active.left {
+    left: 0;
+    -webkit-transform: translate3d(-100%, 0, 0);
+            transform: translate3d(-100%, 0, 0);
+  }
+  .carousel-inner > .item.next.left,
+  .carousel-inner > .item.prev.right,
+  .carousel-inner > .item.active {
+    left: 0;
+    -webkit-transform: translate3d(0, 0, 0);
+            transform: translate3d(0, 0, 0);
+  }
 }
-.carousel-caption h4,
-.carousel-caption p {
-    line-height: 20px;
-    color: #ffffff;
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
 }
-.carousel-caption h4 {
-    margin: 0 0 5px;
+.carousel-inner > .active {
+  left: 0;
 }
-.carousel-caption p {
-    margin-bottom: 0;
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
 }
-.hero-unit {
-    padding: 60px;
-    margin-bottom: 30px;
-    font-size: 18px;
-    font-weight: 200;
-    line-height: 30px;
-    color: inherit;
-    background-color: #eeeeee;
-    -webkit-border-radius: 6px;
-       -moz-border-radius: 6px;
-            border-radius: 6px;
+.carousel-inner > .next {
+  left: 100%;
 }
-.hero-unit h1 {
-    margin-bottom: 0;
-    font-size: 60px;
-    line-height: 1;
-    letter-spacing: -1px;
-    color: inherit;
+.carousel-inner > .prev {
+  left: -100%;
 }
-.hero-unit li {
-    line-height: 30px;
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+.carousel-inner > .active.left {
+  left: -100%;
+}
+.carousel-inner > .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 15%;
+  font-size: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+  background-color: rgba(0, 0, 0, 0);
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.carousel-control.left {
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control.right {
+  right: 0;
+  left: auto;
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #fff;
+  text-decoration: none;
+  filter: alpha(opacity=90);
+  outline: 0;
+  opacity: .9;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+  position: absolute;
+  top: 50%;
+  z-index: 5;
+  display: inline-block;
+  margin-top: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+  width: 20px;
+  height: 20px;
+  font-family: serif;
+  line-height: 1;
+}
+.carousel-control .icon-prev:before {
+  content: '\2039';
+}
+.carousel-control .icon-next:before {
+  content: '\203a';
+}
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  padding-left: 0;
+  margin-left: -30%;
+  text-align: center;
+  list-style: none;
+}
+.carousel-indicators li {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  margin: 1px;
+  text-indent: -999px;
+  cursor: pointer;
+  background-color: #000 \9;
+  background-color: rgba(0, 0, 0, 0);
+  border: 1px solid #fff;
+  border-radius: 10px;
+}
+.carousel-indicators .active {
+  width: 12px;
+  height: 12px;
+  margin: 0;
+  background-color: #fff;
+}
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+}
+.carousel-caption .btn {
+  text-shadow: none;
+}
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-prev,
+  .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -10px;
+    font-size: 30px;
+  }
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: -10px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-right: -10px;
+  }
+  .carousel-caption {
+    right: 20%;
+    left: 20%;
+    padding-bottom: 30px;
+  }
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-header:before,
+.modal-header:after,
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: " ";
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-header:after,
+.modal-footer:after {
+  clear: both;
+}
+.center-block {
+  display: block;
+  margin-right: auto;
+  margin-left: auto;
 }
 .pull-right {
-    float: right;
+  float: right !important;
 }
 .pull-left {
-    float: left;
+  float: left !important;
 }
 .hide {
-    display: none;
+  display: none !important;
 }
 .show {
-    display: block;
+  display: block !important;
 }
 .invisible {
-    visibility: hidden;
+  visibility: hidden;
 }
-.affix {
-    position: fixed;
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
 }
-
+.hidden {
+  display: none !important;
+}
+.affix {
+  position: fixed;
+}
+@-ms-viewport {
+  width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+  display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important;
+  }
+  table.visible-xs {
+    display: table !important;
+  }
+  tr.visible-xs {
+    display: table-row !important;
+  }
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important;
+  }
+  table.visible-sm {
+    display: table !important;
+  }
+  tr.visible-sm {
+    display: table-row !important;
+  }
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important;
+  }
+  table.visible-md {
+    display: table !important;
+  }
+  tr.visible-md {
+    display: table-row !important;
+  }
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important;
+  }
+  table.visible-lg {
+    display: table !important;
+  }
+  tr.visible-lg {
+    display: table-row !important;
+  }
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important;
+  }
+}
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+@media print {
+  .visible-print {
+    display: block !important;
+  }
+  table.visible-print {
+    display: table !important;
+  }
+  tr.visible-print {
+    display: table-row !important;
+  }
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important;
+  }
+}
+.visible-print-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-block {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+@media print {
+  .hidden-print {
+    display: none !important;
+  }
+}
+/*# sourceMappingURL=bootstrap.css.map */
diff --git a/webroot/static/datatables_bootstrap.css b/webroot/static/datatables_bootstrap.css
index f9aba11b..60bef77e 100644
--- a/webroot/static/datatables_bootstrap.css
+++ b/webroot/static/datatables_bootstrap.css
@@ -1,179 +1,185 @@
-
-div.dataTables_length label {
-    float: left;
-    text-align: left;
-}
-
-div.dataTables_length select {
-    width: 75px;
-}
-
-div.dataTables_filter label {
-    float: right;
-}
-
-div.dataTables_info {
-    padding-top: 8px;
-}
-
-div.dataTables_paginate {
-    float: right;
-    margin: 0;
-}
-
-table.table {
-    clear: both;
-    margin-bottom: 6px !important;
-    max-width: none !important;
-}
-
-table.table thead .sorting,
-table.table thead .sorting_asc,
-table.table thead .sorting_desc,
-table.table thead .sorting_asc_disabled,
-table.table thead .sorting_desc_disabled {
-    cursor: pointer;
-    *cursor: hand;
-}
-
-table.table thead .sorting { background: url('images/sort_both.png') no-repeat center right; }
-table.table thead .sorting_asc { background: url('images/sort_asc.png') no-repeat center right; }
-table.table thead .sorting_desc { background: url('images/sort_desc.png') no-repeat center right; }
-
-table.table thead .sorting_asc_disabled { background: url('images/sort_asc_disabled.png') no-repeat center right; }
-table.table thead .sorting_desc_disabled { background: url('images/sort_desc_disabled.png') no-repeat center right; }
-
-table.dataTable th:active {
-    outline: none;
-}
-
-/* Scrolling */
-div.dataTables_scrollHead table {
-    margin-bottom: 0 !important;
-    border-bottom-left-radius: 0;
-    border-bottom-right-radius: 0;
-}
-
-div.dataTables_scrollHead table thead tr:last-child th:first-child,
-div.dataTables_scrollHead table thead tr:last-child td:first-child {
-    border-bottom-left-radius: 0 !important;
-    border-bottom-right-radius: 0 !important;
+table.dataTable {
+  clear: both;
+  margin-top: 6px !important;
+  margin-bottom: 6px !important;
+  max-width: none !important;
+  border-collapse: separate !important;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th,
+table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper div.dataTables_length label {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: 75px;
+  display: inline-block;
+}
+div.dataTables_wrapper div.dataTables_filter {
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  font-weight: normal;
+  white-space: nowrap;
+  text-align: left;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+  display: inline-block;
+  width: auto;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 8px;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  margin: 0;
+  white-space: nowrap;
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+  margin: 2px 0;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1em 0;
+}
+
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 30px;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  position: relative;
+}
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  position: absolute;
+  bottom: 8px;
+  right: 8px;
+  display: block;
+  font-family: 'Glyphicons Halflings';
+  opacity: 0.5;
+}
+table.dataTable thead .sorting:after {
+  opacity: 0.2;
+  content: "\e150";
+  /* sort */
+}
+table.dataTable thead .sorting_asc:after {
+  content: "\e155";
+  /* sort-by-attributes */
+}
+table.dataTable thead .sorting_desc:after {
+  content: "\e156";
+  /* sort-by-attributes-alt */
+}
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  color: #eee;
+}
+
+div.dataTables_scrollHead table.dataTable {
+  margin-bottom: 0 !important;
 }
 
 div.dataTables_scrollBody table {
-    border-top: none;
-    margin-bottom: 0 !important;
-}
-
-div.dataTables_scrollBody tbody tr:first-child th,
-div.dataTables_scrollBody tbody tr:first-child td {
-    border-top: none;
-}
-
-div.dataTables_scrollFoot table {
-    border-top: none;
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
 }
-
-
-
-
-/*
- * TableTools styles
- */
-.table tbody tr.active td,
-.table tbody tr.active th {
-    background-color: #08C;
-    color: white;
-}
-
-.table tbody tr.active:hover td,
-.table tbody tr.active:hover th {
-    background-color: #0075b0 !important;
-}
-
-.table-striped tbody tr.active:nth-child(odd) td,
-.table-striped tbody tr.active:nth-child(odd) th {
-    background-color: #017ebc;
-}
-
-table.DTTT_selectable tbody tr {
-    cursor: pointer;
-    *cursor: hand;
-}
-
-div.DTTT .btn {
-    color: #333 !important;
-    font-size: 12px;
-}
-
-div.DTTT .btn:hover {
-    text-decoration: none !important;
+div.dataTables_scrollBody table thead .sorting:after,
+div.dataTables_scrollBody table thead .sorting_asc:after,
+div.dataTables_scrollBody table thead .sorting_desc:after {
+  display: none;
 }
-
-
-ul.DTTT_dropdown.dropdown-menu a {
-    color: #333 !important; /* needed only when demo_page.css is included */
+div.dataTables_scrollBody table tbody tr:first-child th,
+div.dataTables_scrollBody table tbody tr:first-child td {
+  border-top: none;
 }
 
-ul.DTTT_dropdown.dropdown-menu li:hover a {
-    background-color: #0088cc;
-    color: white !important;
+div.dataTables_scrollFoot table {
+  margin-top: 0 !important;
+  border-top: none;
 }
 
-/* TableTools information display */
-div.DTTT_print_info.modal {
-    height: 150px;
-    margin-top: -75px;
+@media screen and (max-width: 767px) {
+  div.dataTables_wrapper div.dataTables_length,
+  div.dataTables_wrapper div.dataTables_filter,
+  div.dataTables_wrapper div.dataTables_info,
+  div.dataTables_wrapper div.dataTables_paginate {
     text-align: center;
+  }
 }
-
-div.DTTT_print_info h6 {
-    font-weight: normal;
-    font-size: 28px;
-    line-height: 28px;
-    margin: 1em;
+table.dataTable.table-condensed > thead > tr > th {
+  padding-right: 20px;
 }
-
-div.DTTT_print_info p {
-    font-size: 14px;
-    line-height: 20px;
+table.dataTable.table-condensed .sorting:after,
+table.dataTable.table-condensed .sorting_asc:after,
+table.dataTable.table-condensed .sorting_desc:after {
+  top: 6px;
+  right: 6px;
 }
 
-
-
-/*
- * FixedColumns styles
- */
-div.DTFC_LeftHeadWrapper table,
-div.DTFC_LeftFootWrapper table,
-table.DTFC_Cloned tr.even {
-    background-color: white;
+table.table-bordered.dataTable th,
+table.table-bordered.dataTable td {
+  border-left-width: 0;
 }
-
-div.DTFC_LeftHeadWrapper table {
-    margin-bottom: 0 !important;
-    border-top-right-radius: 0 !important;
-    border-bottom-left-radius: 0 !important;
-    border-bottom-right-radius: 0 !important;
+table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
+table.table-bordered.dataTable td:last-child,
+table.table-bordered.dataTable td:last-child {
+  border-right-width: 0;
 }
-
-div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
-div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
-    border-bottom-left-radius: 0 !important;
-    border-bottom-right-radius: 0 !important;
+table.table-bordered.dataTable tbody th,
+table.table-bordered.dataTable tbody td {
+  border-bottom-width: 0;
 }
 
-div.DTFC_LeftBodyWrapper table {
-    border-top: none;
-    margin-bottom: 0 !important;
+div.dataTables_scrollHead table.table-bordered {
+  border-bottom-width: 0;
 }
 
-div.DTFC_LeftBodyWrapper tbody tr:first-child th,
-div.DTFC_LeftBodyWrapper tbody tr:first-child td {
-    border-top: none;
+div.table-responsive > div.dataTables_wrapper > div.row {
+  margin: 0;
 }
-
-div.DTFC_LeftFootWrapper table {
-    border-top: none;
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
+  padding-left: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
+  padding-right: 0;
 }
-
diff --git a/webroot/static/datatables_bootstrap.js b/webroot/static/datatables_bootstrap.js
index 50eaa234..417aec3d 100755
--- a/webroot/static/datatables_bootstrap.js
+++ b/webroot/static/datatables_bootstrap.js
@@ -1,159 +1,182 @@
+/*! DataTables Bootstrap 3 integration
+ * ©2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
 /* Set the defaults for DataTables initialisation */
-$.extend( true, $.fn.dataTable.defaults, {
-    "sDom": "<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>",
-    "sPaginationType": "bootstrap",
-    "oLanguage": {
-        "sLengthMenu": "_MENU_ records per page"
-    }
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row'<'col-sm-6'l><'col-sm-6'f>>" +
+		"<'row'<'col-sm-12'tr>>" +
+		"<'row'<'col-sm-5'i><'col-sm-7'p>>",
+	renderer: 'bootstrap'
 } );
 
 
 /* Default class modification */
-$.extend( $.fn.dataTableExt.oStdClasses, {
-    "sWrapper": "dataTables_wrapper form-inline"
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper form-inline dt-bootstrap",
+	sFilterInput:  "form-control input-sm",
+	sLengthSelect: "form-control input-sm",
+	sProcessing:   "dataTables_processing panel panel-default"
 } );
 
 
-/* API method to get paging information */
-$.fn.dataTableExt.oApi.fnPagingInfo = function ( oSettings )
-{
-    return {
-        "iStart":         oSettings._iDisplayStart,
-        "iEnd":           oSettings.fnDisplayEnd(),
-        "iLength":        oSettings._iDisplayLength,
-        "iTotal":         oSettings.fnRecordsTotal(),
-        "iFilteredTotal": oSettings.fnRecordsDisplay(),
-        "iPage":          oSettings._iDisplayLength === -1 ?
-            0 : Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ),
-        "iTotalPages":    oSettings._iDisplayLength === -1 ?
-            0 : Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength )
-    };
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'active' : '';
+						break;
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( $('<a>', {
+								'href': '#',
+								'aria-controls': settings.sTableId,
+								'aria-label': aria[ button ],
+								'data-dt-idx': counter,
+								'tabindex': settings.iTabIndex
+							} )
+							.html( btnDisplay )
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<ul class="pagination"/>').children('ul'),
+		buttons
+	);
+
+	if ( activeEl ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
 };
 
 
-/* Bootstrap style pagination control */
-$.extend( $.fn.dataTableExt.oPagination, {
-    "bootstrap": {
-        "fnInit": function( oSettings, nPaging, fnDraw ) {
-            var oLang = oSettings.oLanguage.oPaginate;
-            var fnClickHandler = function ( e ) {
-                e.preventDefault();
-                if ( oSettings.oApi._fnPageChange(oSettings, e.data.action) ) {
-                    fnDraw( oSettings );
-                }
-            };
-
-            $(nPaging).addClass('pagination').append(
-                '<ul>'+
-                    '<li class="prev disabled"><a href="#">&larr; '+oLang.sPrevious+'</a></li>'+
-                    '<li class="next disabled"><a href="#">'+oLang.sNext+' &rarr; </a></li>'+
-                '</ul>'
-            );
-            var els = $('a', nPaging);
-            $(els[0]).bind( 'click.DT', { action: "previous" }, fnClickHandler );
-            $(els[1]).bind( 'click.DT', { action: "next" }, fnClickHandler );
-        },
-
-        "fnUpdate": function ( oSettings, fnDraw ) {
-            var iListLength = 5;
-            var oPaging = oSettings.oInstance.fnPagingInfo();
-            var an = oSettings.aanFeatures.p;
-            var i, ien, j, sClass, iStart, iEnd, iHalf=Math.floor(iListLength/2);
-
-            if ( oPaging.iTotalPages < iListLength) {
-                iStart = 1;
-                iEnd = oPaging.iTotalPages;
-            }
-            else if ( oPaging.iPage <= iHalf ) {
-                iStart = 1;
-                iEnd = iListLength;
-            } else if ( oPaging.iPage >= (oPaging.iTotalPages-iHalf) ) {
-                iStart = oPaging.iTotalPages - iListLength + 1;
-                iEnd = oPaging.iTotalPages;
-            } else {
-                iStart = oPaging.iPage - iHalf + 1;
-                iEnd = iStart + iListLength - 1;
-            }
-
-            for ( i=0, ien=an.length ; i<ien ; i++ ) {
-                // Remove the middle elements
-                $('li:gt(0)', an[i]).filter(':not(:last)').remove();
-
-                // Add the new list items and their event handlers
-                for ( j=iStart ; j<=iEnd ; j++ ) {
-                    sClass = (j==oPaging.iPage+1) ? 'class="active"' : '';
-                    $('<li '+sClass+'><a href="#">'+j+'</a></li>')
-                        .insertBefore( $('li:last', an[i])[0] )
-                        .bind('click', function (e) {
-                            e.preventDefault();
-                            oSettings._iDisplayStart = (parseInt($('a', this).text(),10)-1) * oPaging.iLength;
-                            fnDraw( oSettings );
-                        } );
-                }
-
-                // Add / remove disabled classes from the static elements
-                if ( oPaging.iPage === 0 ) {
-                    $('li:first', an[i]).addClass('disabled');
-                } else {
-                    $('li:first', an[i]).removeClass('disabled');
-                }
-
-                if ( oPaging.iPage === oPaging.iTotalPages-1 || oPaging.iTotalPages === 0 ) {
-                    $('li:last', an[i]).addClass('disabled');
-                } else {
-                    $('li:last', an[i]).removeClass('disabled');
-                }
-            }
-        }
-    }
-} );
-
-
-/*
- * TableTools Bootstrap compatibility
- * Required TableTools 2.1+
- */
-if ( $.fn.DataTable.TableTools ) {
-    // Set the classes that TableTools uses to something suitable for Bootstrap
-    $.extend( true, $.fn.DataTable.TableTools.classes, {
-        "container": "DTTT btn-group",
-        "buttons": {
-            "normal": "btn",
-            "disabled": "disabled"
-        },
-        "collection": {
-            "container": "DTTT_dropdown dropdown-menu",
-            "buttons": {
-                "normal": "",
-                "disabled": "disabled"
-            }
-        },
-        "print": {
-            "info": "DTTT_print_info modal"
-        },
-        "select": {
-            "row": "active"
-        }
-    } );
-
-    // Have the collection use a bootstrap compatible dropdown
-    $.extend( true, $.fn.DataTable.TableTools.DEFAULTS.oTags, {
-        "collection": {
-            "container": "ul",
-            "button": "li",
-            "liner": "a"
-        }
-    } );
-}
-
-
-/* Table initialisation */
-$(document).ready(function() {
-    $('#example').dataTable( {
-        "sDom": "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>",
-        "sPaginationType": "bootstrap",
-        "oLanguage": {
-            "sLengthMenu": "_MENU_ records per page"
-        }
-    } );
-} );
+return DataTable;
+}));
\ No newline at end of file
diff --git a/webroot/static/jquery.dataTables.js b/webroot/static/jquery.dataTables.js
index 59a7459d..5b032aee 100644
--- a/webroot/static/jquery.dataTables.js
+++ b/webroot/static/jquery.dataTables.js
@@ -1,7459 +1,9396 @@
+/*! DataTables 1.10.12
+ * ©2008-2015 SpryMedia Ltd - datatables.net/license
+ */
+
 /**
  * @summary     DataTables
- * @description Paginate, search and sort HTML tables
- * @version     1.9.4
+ * @description Paginate, search and order HTML tables
+ * @version     1.10.12
  * @file        jquery.dataTables.js
- * @author      Allan Jardine (www.sprymedia.co.uk)
+ * @author      SpryMedia Ltd (www.sprymedia.co.uk)
  * @contact     www.sprymedia.co.uk/contact
+ * @copyright   Copyright 2008-2015 SpryMedia Ltd.
  *
- * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved.
+ * This source file is free software, available under the following license:
+ *   MIT license - http://datatables.net/license
  *
- * This source file is free software, under either the GPL v2 license or a
- * BSD style license, available at:
- *   http://datatables.net/license_gpl2
- *   http://datatables.net/license_bsd
- * 
- * This source file is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
- * 
+ *
  * For details please refer to: http://www.datatables.net
  */
 
 /*jslint evil: true, undef: true, browser: true */
-/*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/
-
-(/** @lends <global> */function( window, document, undefined ) {
+/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/
 
 (function( factory ) {
 	"use strict";
 
-	// Define as an AMD module if possible
-	if ( typeof define === 'function' && define.amd )
-	{
-		define( ['jquery'], factory );
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery'], function ( $ ) {
+			return factory( $, window, document );
+		} );
 	}
-	/* Define using browser globals otherwise
-	 * Prevent multiple instantiations if the script is loaded twice
-	 */
-	else if ( jQuery && !jQuery.fn.dataTable )
-	{
-		factory( jQuery );
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				// CommonJS environments without a window global must pass a
+				// root. This will give an error otherwise
+				root = window;
+			}
+
+			if ( ! $ ) {
+				$ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
+					require('jquery') :
+					require('jquery')( root );
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
 	}
 }
-(/** @lends <global> */function( $ ) {
+(function( $, window, document, undefined ) {
 	"use strict";
-	/** 
-	 * DataTables is a plug-in for the jQuery Javascript library. It is a 
-	 * highly flexible tool, based upon the foundations of progressive 
-	 * enhancement, which will add advanced interaction controls to any 
-	 * HTML table. For a full list of features please refer to
-	 * <a href="http://datatables.net">DataTables.net</a>.
+
+	/**
+	 * DataTables is a plug-in for the jQuery Javascript library. It is a highly
+	 * flexible tool, based upon the foundations of progressive enhancement,
+	 * which will add advanced interaction controls to any HTML table. For a
+	 * full list of features please refer to
+	 * [DataTables.net](href="http://datatables.net).
 	 *
-	 * Note that the <i>DataTable</i> object is not a global variable but is
-	 * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which 
-	 * it may be  accessed.
+	 * Note that the `DataTable` object is not a global variable but is aliased
+	 * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
+	 * be  accessed.
 	 *
 	 *  @class
-	 *  @param {object} [oInit={}] Configuration object for DataTables. Options
+	 *  @param {object} [init={}] Configuration object for DataTables. Options
 	 *    are defined by {@link DataTable.defaults}
-	 *  @requires jQuery 1.3+
-	 * 
+	 *  @requires jQuery 1.7+
+	 *
 	 *  @example
 	 *    // Basic initialisation
 	 *    $(document).ready( function {
 	 *      $('#example').dataTable();
 	 *    } );
-	 *  
+	 *
 	 *  @example
 	 *    // Initialisation with configuration options - in this case, disable
 	 *    // pagination and sorting.
 	 *    $(document).ready( function {
 	 *      $('#example').dataTable( {
-	 *        "bPaginate": false,
-	 *        "bSort": false 
+	 *        "paginate": false,
+	 *        "sort": false
 	 *      } );
 	 *    } );
 	 */
-	var DataTable = function( oInit )
+	var DataTable = function ( options )
 	{
+		/**
+		 * Perform a jQuery selector action on the table's TR elements (from the tbody) and
+		 * return the resulting jQuery object.
+		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
+		 *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
+		 *    criterion ("applied") or all TR elements (i.e. no filter).
+		 *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
+		 *    Can be either 'current', whereby the current sorting of the table is used, or
+		 *    'original' whereby the original order the data was read into the table is used.
+		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
+		 *    'current' and filter is 'applied', regardless of what they might be given as.
+		 *  @returns {object} jQuery object, filtered by the given selector.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Highlight every second row
+		 *      oTable.$('tr:odd').css('backgroundColor', 'blue');
+		 *    } );
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Filter to rows with 'Webkit' in them, add a background colour and then
+		 *      // remove the filter, thus highlighting the 'Webkit' rows only.
+		 *      oTable.fnFilter('Webkit');
+		 *      oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue');
+		 *      oTable.fnFilter('');
+		 *    } );
+		 */
+		this.$ = function ( sSelector, oOpts )
+		{
+			return this.api(true).$( sSelector, oOpts );
+		};
 		
 		
 		/**
-		 * Add a column to the list used for the table with default values
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {node} nTh The th element for this column
-		 *  @memberof DataTable#oApi
+		 * Almost identical to $ in operation, but in this case returns the data for the matched
+		 * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
+		 * rather than any descendants, so the data can be obtained for the row/cell. If matching
+		 * rows are found, the data returned is the original data array/object that was used to
+		 * create the row (or a generated array if from a DOM source).
+		 *
+		 * This method is often useful in-combination with $ where both functions are given the
+		 * same parameters and the array indexes will match identically.
+		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
+		 *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
+		 *    criterion ("applied") or all elements (i.e. no filter).
+		 *  @param {string} [oOpts.order=current] Order of the data in the processed array.
+		 *    Can be either 'current', whereby the current sorting of the table is used, or
+		 *    'original' whereby the original order the data was read into the table is used.
+		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
+		 *    'current' and filter is 'applied', regardless of what they might be given as.
+		 *  @returns {array} Data for the matched elements. If any elements, as a result of the
+		 *    selector, were not TR, TD or TH elements in the DataTable, they will have a null
+		 *    entry in the array.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Get the data from the first row in the table
+		 *      var data = oTable._('tr:first');
+		 *
+		 *      // Do something useful with the data
+		 *      alert( "First cell is: "+data[0] );
+		 *    } );
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Filter to 'Webkit' and get all data for
+		 *      oTable.fnFilter('Webkit');
+		 *      var data = oTable._('tr', {"search": "applied"});
+		 *
+		 *      // Do something with the data
+		 *      alert( data.length+" rows matched the search" );
+		 *    } );
 		 */
-		function _fnAddColumn( oSettings, nTh )
+		this._ = function ( sSelector, oOpts )
 		{
-			var oDefaults = DataTable.defaults.columns;
-			var iCol = oSettings.aoColumns.length;
-			var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
-				"sSortingClass": oSettings.oClasses.sSortable,
-				"sSortingClassJUI": oSettings.oClasses.sSortJUI,
-				"nTh": nTh ? nTh : document.createElement('th'),
-				"sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
-				"aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
-				"mData": oDefaults.mData ? oDefaults.oDefaults : iCol
-			} );
-			oSettings.aoColumns.push( oCol );
-			
-			/* Add a column specific filter */
-			if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )
-			{
-				oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch );
-			}
-			else
-			{
-				var oPre = oSettings.aoPreSearchCols[ iCol ];
-				
-				/* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */
-				if ( oPre.bRegex === undefined )
-				{
-					oPre.bRegex = true;
-				}
-				
-				if ( oPre.bSmart === undefined )
-				{
-					oPre.bSmart = true;
-				}
-				
-				if ( oPre.bCaseInsensitive === undefined )
-				{
-					oPre.bCaseInsensitive = true;
-				}
-			}
-			
-			/* Use the column options function to initialise classes etc */
-			_fnColumnOptions( oSettings, iCol, null );
-		}
+			return this.api(true).rows( sSelector, oOpts ).data();
+		};
 		
 		
 		/**
-		 * Apply options for a column
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iCol column index to consider
-		 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
-		 *  @memberof DataTable#oApi
+		 * Create a DataTables Api instance, with the currently selected tables for
+		 * the Api's context.
+		 * @param {boolean} [traditional=false] Set the API instance's context to be
+		 *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was
+		 *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),
+		 *   or if all tables captured in the jQuery object should be used.
+		 * @return {DataTables.Api}
 		 */
-		function _fnColumnOptions( oSettings, iCol, oOptions )
+		this.api = function ( traditional )
 		{
-			var oCol = oSettings.aoColumns[ iCol ];
-			
-			/* User specified column options */
-			if ( oOptions !== undefined && oOptions !== null )
-			{
-				/* Backwards compatibility for mDataProp */
-				if ( oOptions.mDataProp && !oOptions.mData )
-				{
-					oOptions.mData = oOptions.mDataProp;
-				}
-		
-				if ( oOptions.sType !== undefined )
-				{
-					oCol.sType = oOptions.sType;
-					oCol._bAutoType = false;
-				}
-				
-				$.extend( oCol, oOptions );
-				_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+			return traditional ?
+				new _Api(
+					_fnSettingsFromNode( this[ _ext.iApiIndex ] )
+				) :
+				new _Api( this );
+		};
 		
-				/* iDataSort to be applied (backwards compatibility), but aDataSort will take
-				 * priority if defined
-				 */
-				if ( oOptions.iDataSort !== undefined )
-				{
-					oCol.aDataSort = [ oOptions.iDataSort ];
-				}
-				_fnMap( oCol, oOptions, "aDataSort" );
-			}
 		
-			/* Cache the data get and set functions for speed */
-			var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
-			var mData = _fnGetObjectDataFn( oCol.mData );
+		/**
+		 * Add a single new row or multiple rows of data to the table. Please note
+		 * that this is suitable for client-side processing only - if you are using
+		 * server-side processing (i.e. "bServerSide": true), then to add data, you
+		 * must add it to the data source, i.e. the server-side, through an Ajax call.
+		 *  @param {array|object} data The data to be added to the table. This can be:
+		 *    <ul>
+		 *      <li>1D array of data - add a single row with the data provided</li>
+		 *      <li>2D array of arrays - add multiple rows in a single call</li>
+		 *      <li>object - data object when using <i>mData</i></li>
+		 *      <li>array of objects - multiple data objects when using <i>mData</i></li>
+		 *    </ul>
+		 *  @param {bool} [redraw=true] redraw the table or not
+		 *  @returns {array} An array of integers, representing the list of indexes in
+		 *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
+		 *    the table.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    // Global var for counter
+		 *    var giCount = 2;
+		 *
+		 *    $(document).ready(function() {
+		 *      $('#example').dataTable();
+		 *    } );
+		 *
+		 *    function fnClickAddRow() {
+		 *      $('#example').dataTable().fnAddData( [
+		 *        giCount+".1",
+		 *        giCount+".2",
+		 *        giCount+".3",
+		 *        giCount+".4" ]
+		 *      );
+		 *
+		 *      giCount++;
+		 *    }
+		 */
+		this.fnAddData = function( data, redraw )
+		{
+			var api = this.api( true );
 		
-			oCol.fnGetData = function (oData, sSpecific) {
-				var innerData = mData( oData, sSpecific );
+			/* Check if we want to add multiple rows or not */
+			var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
+				api.rows.add( data ) :
+				api.row.add( data );
 		
-				if ( oCol.mRender && (sSpecific && sSpecific !== '') )
-				{
-					return mRender( innerData, sSpecific, oData );
-				}
-				return innerData;
-			};
-			oCol.fnSetData = _fnSetObjectDataFn( oCol.mData );
-			
-			/* Feature sorting overrides column specific when off */
-			if ( !oSettings.oFeatures.bSort )
-			{
-				oCol.bSortable = false;
-			}
-			
-			/* Check that the class assignment is correct for sorting */
-			if ( !oCol.bSortable ||
-				 ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
-			{
-				oCol.sSortingClass = oSettings.oClasses.sSortableNone;
-				oCol.sSortingClassJUI = "";
-			}
-			else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )
-			{
-				oCol.sSortingClass = oSettings.oClasses.sSortable;
-				oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
-			}
-			else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
-			{
-				oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
-				oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
-			}
-			else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
-			{
-				oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
-				oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
+			if ( redraw === undefined || redraw ) {
+				api.draw();
 			}
-		}
+		
+			return rows.flatten().toArray();
+		};
 		
 		
 		/**
-		 * Adjust the table column widths for new data. Note: you would probably want to 
-		 * do a redraw after calling this function!
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
+		 * This function will make DataTables recalculate the column sizes, based on the data
+		 * contained in the table and the sizes applied to the columns (in the DOM, CSS or
+		 * through the sWidth parameter). This can be useful when the width of the table's
+		 * parent element changes (for example a window resize).
+		 *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable( {
+		 *        "sScrollY": "200px",
+		 *        "bPaginate": false
+		 *      } );
+		 *
+		 *      $(window).bind('resize', function () {
+		 *        oTable.fnAdjustColumnSizing();
+		 *      } );
+		 *    } );
 		 */
-		function _fnAdjustColumnSizing ( oSettings )
+		this.fnAdjustColumnSizing = function ( bRedraw )
 		{
-			/* Not interested in doing column width calculation if auto-width is disabled */
-			if ( oSettings.oFeatures.bAutoWidth === false )
-			{
-				return false;
+			var api = this.api( true ).columns.adjust();
+			var settings = api.settings()[0];
+			var scroll = settings.oScroll;
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw( false );
 			}
-			
-			_fnCalculateColumnWidths( oSettings );
-			for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
+			else if ( scroll.sX !== "" || scroll.sY !== "" ) {
+				/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
+				_fnScrollDraw( settings );
 			}
-		}
+		};
 		
 		
 		/**
-		 * Covert the index of a visible column to the index in the data array (take account
-		 * of hidden columns)
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iMatch Visible column index to lookup
-		 *  @returns {int} i the data index
-		 *  @memberof DataTable#oApi
+		 * Quickly and simply clear a table
+		 *  @param {bool} [bRedraw=true] redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
+		 *      oTable.fnClearTable();
+		 *    } );
 		 */
-		function _fnVisibleToColumnIndex( oSettings, iMatch )
+		this.fnClearTable = function( bRedraw )
 		{
-			var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+			var api = this.api( true ).clear();
 		
-			return typeof aiVis[iMatch] === 'number' ?
-				aiVis[iMatch] :
-				null;
-		}
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw();
+			}
+		};
 		
 		
 		/**
-		 * Covert the index of an index in the data array and convert it to the visible
-		 *   column index (take account of hidden columns)
-		 *  @param {int} iMatch Column index to lookup
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {int} i the data index
-		 *  @memberof DataTable#oApi
+		 * The exact opposite of 'opening' a row, this function will close any rows which
+		 * are currently 'open'.
+		 *  @param {node} nTr the table row to 'close'
+		 *  @returns {int} 0 on success, or 1 if failed (can't find the row)
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
 		 */
-		function _fnColumnIndexToVisible( oSettings, iMatch )
+		this.fnClose = function( nTr )
 		{
-			var aiVis = _fnGetColumns( oSettings, 'bVisible' );
-			var iPos = $.inArray( iMatch, aiVis );
-		
-			return iPos !== -1 ? iPos : null;
-		}
+			this.api( true ).row( nTr ).child.hide();
+		};
 		
 		
 		/**
-		 * Get the number of visible columns
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {int} i the number of visible columns
-		 *  @memberof DataTable#oApi
+		 * Remove a row for the table
+		 *  @param {mixed} target The index of the row from aoData to be deleted, or
+		 *    the TR element you want to delete
+		 *  @param {function|null} [callBack] Callback function
+		 *  @param {bool} [redraw=true] Redraw the table or not
+		 *  @returns {array} The row that was deleted
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Immediately remove the first row
+		 *      oTable.fnDeleteRow( 0 );
+		 *    } );
 		 */
-		function _fnVisbleColumns( oSettings )
+		this.fnDeleteRow = function( target, callback, redraw )
 		{
-			return _fnGetColumns( oSettings, 'bVisible' ).length;
-		}
+			var api = this.api( true );
+			var rows = api.rows( target );
+			var settings = rows.settings()[0];
+			var data = settings.aoData[ rows[0][0] ];
 		
+			rows.remove();
 		
-		/**
-		 * Get an array of column indexes that match a given property
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {string} sParam Parameter in aoColumns to look for - typically 
-		 *    bVisible or bSearchable
-		 *  @returns {array} Array of indexes with matched properties
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnGetColumns( oSettings, sParam )
-		{
-			var a = [];
+			if ( callback ) {
+				callback.call( this, settings, data );
+			}
 		
-			$.map( oSettings.aoColumns, function(val, i) {
-				if ( val[sParam] ) {
-					a.push( i );
-				}
-			} );
+			if ( redraw === undefined || redraw ) {
+				api.draw();
+			}
 		
-			return a;
-		}
+			return data;
+		};
 		
 		
 		/**
-		 * Get the sort type based on an input string
-		 *  @param {string} sData data we wish to know the type of
-		 *  @returns {string} type (defaults to 'string' if no type can be detected)
-		 *  @memberof DataTable#oApi
+		 * Restore the table to it's original state in the DOM by removing all of DataTables
+		 * enhancements, alterations to the DOM structure of the table and event listeners.
+		 *  @param {boolean} [remove=false] Completely remove the table from the DOM
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnDestroy();
+		 *    } );
 		 */
-		function _fnDetectType( sData )
+		this.fnDestroy = function ( remove )
 		{
-			var aTypes = DataTable.ext.aTypes;
-			var iLen = aTypes.length;
-			
-			for ( var i=0 ; i<iLen ; i++ )
-			{
-				var sType = aTypes[i]( sData );
-				if ( sType !== null )
-				{
-					return sType;
-				}
-			}
-			
-			return 'string';
-		}
+			this.api( true ).destroy( remove );
+		};
 		
 		
 		/**
-		 * Figure out how to reorder a display list
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns array {int} aiReturn index list for reordering
-		 *  @memberof DataTable#oApi
+		 * Redraw the table
+		 *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
+		 *      oTable.fnDraw();
+		 *    } );
 		 */
-		function _fnReOrderIndex ( oSettings, sColumns )
+		this.fnDraw = function( complete )
 		{
-			var aColumns = sColumns.split(',');
-			var aiReturn = [];
-			
-			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				for ( var j=0 ; j<iLen ; j++ )
-				{
-					if ( oSettings.aoColumns[i].sName == aColumns[j] )
-					{
-						aiReturn.push( j );
-						break;
-					}
-				}
-			}
-			
-			return aiReturn;
-		}
+			// Note that this isn't an exact match to the old call to _fnDraw - it takes
+			// into account the new data, but can hold position.
+			this.api( true ).draw( complete );
+		};
 		
 		
 		/**
-		 * Get the column ordering that DataTables expects
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {string} comma separated list of names
-		 *  @memberof DataTable#oApi
+		 * Filter the input based on data
+		 *  @param {string} sInput String to filter the table on
+		 *  @param {int|null} [iColumn] Column to limit filtering to
+		 *  @param {bool} [bRegex=false] Treat as regular expression or not
+		 *  @param {bool} [bSmart=true] Perform smart filtering or not
+		 *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
+		 *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sometime later - filter...
+		 *      oTable.fnFilter( 'test string' );
+		 *    } );
 		 */
-		function _fnColumnOrdering ( oSettings )
+		this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
 		{
-			var sNames = '';
-			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				sNames += oSettings.aoColumns[i].sName+',';
+			var api = this.api( true );
+		
+			if ( iColumn === null || iColumn === undefined ) {
+				api.search( sInput, bRegex, bSmart, bCaseInsensitive );
 			}
-			if ( sNames.length == iLen )
-			{
-				return "";
+			else {
+				api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
 			}
-			return sNames.slice(0, -1);
-		}
+		
+			api.draw();
+		};
 		
 		
 		/**
-		 * Take the column definitions and static columns arrays and calculate how
-		 * they relate to column indexes. The callback function will then apply the
-		 * definition found for a column to a suitable configuration object.
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
-		 *  @param {array} aoCols The aoColumns array that defines columns individually
-		 *  @param {function} fn Callback function - takes two parameters, the calculated
-		 *    column index and the definition for that column.
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
+		 * Get the data for the whole table, an individual row or an individual cell based on the
+		 * provided parameters.
+		 *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
+		 *    a TR node then the data source for the whole row will be returned. If given as a
+		 *    TD/TH cell node then iCol will be automatically calculated and the data for the
+		 *    cell returned. If given as an integer, then this is treated as the aoData internal
+		 *    data index for the row (see fnGetPosition) and the data for that row used.
+		 *  @param {int} [col] Optional column index that you want the data of.
+		 *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
+		 *    returned. If mRow is defined, just data for that row, and is iCol is
+		 *    defined, only data for the designated cell is returned.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    // Row data
+		 *    $(document).ready(function() {
+		 *      oTable = $('#example').dataTable();
+		 *
+		 *      oTable.$('tr').click( function () {
+		 *        var data = oTable.fnGetData( this );
+		 *        // ... do something with the array / object of data for the row
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Individual cell data
+		 *    $(document).ready(function() {
+		 *      oTable = $('#example').dataTable();
+		 *
+		 *      oTable.$('td').click( function () {
+		 *        var sData = oTable.fnGetData( this );
+		 *        alert( 'The cell clicked on had the value of '+sData );
+		 *      } );
+		 *    } );
+		 */
+		this.fnGetData = function( src, col )
 		{
-			var i, iLen, j, jLen, k, kLen;
+			var api = this.api( true );
 		
-			// Column definitions with aTargets
-			if ( aoColDefs )
-			{
-				/* Loop over the definitions array - loop in reverse so first instance has priority */
-				for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
-				{
-					/* Each definition can target multiple columns, as it is an array */
-					var aTargets = aoColDefs[i].aTargets;
-					if ( !$.isArray( aTargets ) )
-					{
-						_fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
-					}
-		
-					for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
-					{
-						if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
-						{
-							/* Add columns that we don't yet know about */
-							while( oSettings.aoColumns.length <= aTargets[j] )
-							{
-								_fnAddColumn( oSettings );
-							}
+			if ( src !== undefined ) {
+				var type = src.nodeName ? src.nodeName.toLowerCase() : '';
 		
-							/* Integer, basic index */
-							fn( aTargets[j], aoColDefs[i] );
-						}
-						else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
-						{
-							/* Negative integer, right to left column counting */
-							fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] );
-						}
-						else if ( typeof aTargets[j] === 'string' )
-						{
-							/* Class name matching on TH element */
-							for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
-							{
-								if ( aTargets[j] == "_all" ||
-								     $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )
-								{
-									fn( k, aoColDefs[i] );
-								}
-							}
-						}
-					}
-				}
+				return col !== undefined || type == 'td' || type == 'th' ?
+					api.cell( src, col ).data() :
+					api.row( src ).data() || null;
 			}
 		
-			// Statically defined columns array
-			if ( aoCols )
-			{
-				for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
-				{
-					fn( i, aoCols[i] );
-				}
-			}
-		}
+			return api.data().toArray();
+		};
+		
 		
 		/**
-		 * Add a data array to the table, creating DOM node etc. This is the parallel to 
-		 * _fnGatherData, but for adding rows from a Javascript source, rather than a
-		 * DOM source.
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {array} aData data array to be added
-		 *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
-		 *  @memberof DataTable#oApi
+		 * Get an array of the TR nodes that are used in the table's body. Note that you will
+		 * typically want to use the '$' API method in preference to this as it is more
+		 * flexible.
+		 *  @param {int} [iRow] Optional row index for the TR element you want
+		 *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
+		 *    in the table's body, or iRow is defined, just the TR element requested.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Get the nodes from the table
+		 *      var nNodes = oTable.fnGetNodes( );
+		 *    } );
 		 */
-		function _fnAddData ( oSettings, aDataSupplied )
+		this.fnGetNodes = function( iRow )
 		{
-			var oCol;
-			
-			/* Take an independent copy of the data source so we can bash it about as we wish */
-			var aDataIn = ($.isArray(aDataSupplied)) ?
-				aDataSupplied.slice() :
-				$.extend( true, {}, aDataSupplied );
-			
-			/* Create the object for storing information about this new row */
-			var iRow = oSettings.aoData.length;
-			var oData = $.extend( true, {}, DataTable.models.oRow );
-			oData._aData = aDataIn;
-			oSettings.aoData.push( oData );
+			var api = this.api( true );
 		
-			/* Create the cells */
-			var nTd, sThisType;
-			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				oCol = oSettings.aoColumns[i];
+			return iRow !== undefined ?
+				api.row( iRow ).node() :
+				api.rows().nodes().flatten().toArray();
+		};
 		
-				/* Use rendered data for filtering / sorting */
-				if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mData !== null )
-				{
-					_fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
-				}
-				else
-				{
-					_fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
-				}
-				
-				/* See if we should auto-detect the column type */
-				if ( oCol._bAutoType && oCol.sType != 'string' )
-				{
-					/* Attempt to auto detect the type - same as _fnGatherData() */
-					var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' );
-					if ( sVarType !== null && sVarType !== '' )
-					{
-						sThisType = _fnDetectType( sVarType );
-						if ( oCol.sType === null )
-						{
-							oCol.sType = sThisType;
-						}
-						else if ( oCol.sType != sThisType && oCol.sType != "html" )
-						{
-							/* String is always the 'fallback' option */
-							oCol.sType = 'string';
-						}
-					}
-				}
-			}
-			
-			/* Add to the display array */
-			oSettings.aiDisplayMaster.push( iRow );
 		
-			/* Create the DOM information */
-			if ( !oSettings.oFeatures.bDeferRender )
-			{
-				_fnCreateTr( oSettings, iRow );
+		/**
+		 * Get the array indexes of a particular cell from it's DOM element
+		 * and column index including hidden columns
+		 *  @param {node} node this can either be a TR, TD or TH in the table's body
+		 *  @returns {int} If nNode is given as a TR, then a single index is returned, or
+		 *    if given as a cell, an array of [row index, column index (visible),
+		 *    column index (all)] is given.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      $('#example tbody td').click( function () {
+		 *        // Get the position of the current data from the node
+		 *        var aPos = oTable.fnGetPosition( this );
+		 *
+		 *        // Get the data array for this row
+		 *        var aData = oTable.fnGetData( aPos[0] );
+		 *
+		 *        // Update the data array and return the value
+		 *        aData[ aPos[1] ] = 'clicked';
+		 *        this.innerHTML = 'clicked';
+		 *      } );
+		 *
+		 *      // Init DataTables
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnGetPosition = function( node )
+		{
+			var api = this.api( true );
+			var nodeName = node.nodeName.toUpperCase();
+		
+			if ( nodeName == 'TR' ) {
+				return api.row( node ).index();
 			}
+			else if ( nodeName == 'TD' || nodeName == 'TH' ) {
+				var cell = api.cell( node ).index();
 		
-			return iRow;
-		}
+				return [
+					cell.row,
+					cell.columnVisible,
+					cell.column
+				];
+			}
+			return null;
+		};
 		
 		
 		/**
-		 * Read in the data from the target table from the DOM
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
+		 * Check to see if a row is 'open' or not.
+		 *  @param {node} nTr the table row to check
+		 *  @returns {boolean} true if the row is currently open, false otherwise
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
 		 */
-		function _fnGatherData( oSettings )
+		this.fnIsOpen = function( nTr )
 		{
-			var iLoop, i, iLen, j, jLen, jInner,
-			 	nTds, nTrs, nTd, nTr, aLocalData, iThisIndex,
-				iRow, iRows, iColumn, iColumns, sNodeName,
-				oCol, oData;
-			
-			/*
-			 * Process by row first
-			 * Add the data object for the whole table - storing the tr node. Note - no point in getting
-			 * DOM based data if we are going to go and replace it with Ajax source data.
-			 */
-			if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )
-			{
-				nTr = oSettings.nTBody.firstChild;
-				while ( nTr )
-				{
-					if ( nTr.nodeName.toUpperCase() == "TR" )
-					{
-						iThisIndex = oSettings.aoData.length;
-						nTr._DT_RowIndex = iThisIndex;
-						oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {
-							"nTr": nTr
-						} ) );
-		
-						oSettings.aiDisplayMaster.push( iThisIndex );
-						nTd = nTr.firstChild;
-						jInner = 0;
-						while ( nTd )
-						{
-							sNodeName = nTd.nodeName.toUpperCase();
-							if ( sNodeName == "TD" || sNodeName == "TH" )
-							{
-								_fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTd.innerHTML) );
-								jInner++;
-							}
-							nTd = nTd.nextSibling;
-						}
-					}
-					nTr = nTr.nextSibling;
-				}
-			}
-			
-			/* Gather in the TD elements of the Table - note that this is basically the same as
-			 * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet
-			 * setup!
-			 */
-			nTrs = _fnGetTrNodes( oSettings );
-			nTds = [];
-			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
-			{
-				nTd = nTrs[i].firstChild;
-				while ( nTd )
-				{
-					sNodeName = nTd.nodeName.toUpperCase();
-					if ( sNodeName == "TD" || sNodeName == "TH" )
-					{
-						nTds.push( nTd );
-					}
-					nTd = nTd.nextSibling;
-				}
-			}
-			
-			/* Now process by column */
-			for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
-			{
-				oCol = oSettings.aoColumns[iColumn];
-		
-				/* Get the title of the column - unless there is a user set one */
-				if ( oCol.sTitle === null )
-				{
-					oCol.sTitle = oCol.nTh.innerHTML;
-				}
-				
-				var
-					bAutoType = oCol._bAutoType,
-					bRender = typeof oCol.fnRender === 'function',
-					bClass = oCol.sClass !== null,
-					bVisible = oCol.bVisible,
-					nCell, sThisType, sRendered, sValType;
-				
-				/* A single loop to rule them all (and be more efficient) */
-				if ( bAutoType || bRender || bClass || !bVisible )
-				{
-					for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )
-					{
-						oData = oSettings.aoData[iRow];
-						nCell = nTds[ (iRow*iColumns) + iColumn ];
-						
-						/* Type detection */
-						if ( bAutoType && oCol.sType != 'string' )
-						{
-							sValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' );
-							if ( sValType !== '' )
-							{
-								sThisType = _fnDetectType( sValType );
-								if ( oCol.sType === null )
-								{
-									oCol.sType = sThisType;
-								}
-								else if ( oCol.sType != sThisType && 
-								          oCol.sType != "html" )
-								{
-									/* String is always the 'fallback' option */
-									oCol.sType = 'string';
-								}
-							}
-						}
-		
-						if ( oCol.mRender )
-						{
-							// mRender has been defined, so we need to get the value and set it
-							nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
-						}
-						else if ( oCol.mData !== iColumn )
-						{
-							// If mData is not the same as the column number, then we need to
-							// get the dev set value. If it is the column, no point in wasting
-							// time setting the value that is already there!
-							nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
-						}
-						
-						/* Rendering */
-						if ( bRender )
-						{
-							sRendered = _fnRender( oSettings, iRow, iColumn );
-							nCell.innerHTML = sRendered;
-							if ( oCol.bUseRendered )
-							{
-								/* Use the rendered data for filtering / sorting */
-								_fnSetCellData( oSettings, iRow, iColumn, sRendered );
-							}
-						}
-						
-						/* Classes */
-						if ( bClass )
-						{
-							nCell.className += ' '+oCol.sClass;
-						}
-						
-						/* Column visibility */
-						if ( !bVisible )
-						{
-							oData._anHidden[iColumn] = nCell;
-							nCell.parentNode.removeChild( nCell );
-						}
-						else
-						{
-							oData._anHidden[iColumn] = null;
-						}
-		
-						if ( oCol.fnCreatedCell )
-						{
-							oCol.fnCreatedCell.call( oSettings.oInstance,
-								nCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn
-							);
-						}
-					}
-				}
-			}
-		
-			/* Row created callbacks */
-			if ( oSettings.aoRowCreatedCallback.length !== 0 )
-			{
-				for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
-				{
-					oData = oSettings.aoData[i];
-					_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] );
-				}
-			}
-		}
+			return this.api( true ).row( nTr ).child.isShown();
+		};
 		
 		
 		/**
-		 * Take a TR element and convert it to an index in aoData
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {node} n the TR element to find
-		 *  @returns {int} index if the node is found, null if not
-		 *  @memberof DataTable#oApi
+		 * This function will place a new row directly after a row which is currently
+		 * on display on the page, with the HTML contents that is passed into the
+		 * function. This can be used, for example, to ask for confirmation that a
+		 * particular record should be deleted.
+		 *  @param {node} nTr The table row to 'open'
+		 *  @param {string|node|jQuery} mHtml The HTML to put into the row
+		 *  @param {string} sClass Class to give the new TD cell
+		 *  @returns {node} The row opened. Note that if the table row passed in as the
+		 *    first parameter, is not found in the table, this method will silently
+		 *    return.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
 		 */
-		function _fnNodeToDataIndex( oSettings, n )
+		this.fnOpen = function( nTr, mHtml, sClass )
 		{
-			return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
-		}
+			return this.api( true )
+				.row( nTr )
+				.child( mHtml, sClass )
+				.show()
+				.child()[0];
+		};
 		
 		
 		/**
-		 * Take a TD element and convert it into a column data index (not the visible index)
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iRow The row number the TD/TH can be found in
-		 *  @param {node} n The TD/TH element to find
-		 *  @returns {int} index if the node is found, -1 if not
-		 *  @memberof DataTable#oApi
+		 * Change the pagination - provides the internal logic for pagination in a simple API
+		 * function. With this function you can have a DataTables table go to the next,
+		 * previous, first or last pages.
+		 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+		 *    or page number to jump to (integer), note that page 0 is the first page.
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnPageChange( 'next' );
+		 *    } );
 		 */
-		function _fnNodeToColumnIndex( oSettings, iRow, n )
+		this.fnPageChange = function ( mAction, bRedraw )
 		{
-			var anCells = _fnGetTdNodes( oSettings, iRow );
+			var api = this.api( true ).page( mAction );
 		
-			for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				if ( anCells[i] === n )
-				{
-					return i;
-				}
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw(false);
 			}
-			return -1;
-		}
+		};
 		
 		
 		/**
-		 * Get an array of data for a given row from the internal data cache
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iRow aoData row id
-		 *  @param {string} sSpecific data get type ('type' 'filter' 'sort')
-		 *  @param {array} aiColumns Array of column indexes to get data from
-		 *  @returns {array} Data array
-		 *  @memberof DataTable#oApi
+		 * Show a particular column
+		 *  @param {int} iCol The column whose display should be changed
+		 *  @param {bool} bShow Show (true) or hide (false) the column
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Hide the second column after initialisation
+		 *      oTable.fnSetColumnVis( 1, false );
+		 *    } );
 		 */
-		function _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )
+		this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
 		{
-			var out = [];
-			for ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )
-			{
-				out.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );
+			var api = this.api( true ).column( iCol ).visible( bShow );
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.columns.adjust().draw();
 			}
-			return out;
-		}
+		};
 		
 		
 		/**
-		 * Get the data for a given cell from the internal cache, taking into account data mapping
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iRow aoData row id
-		 *  @param {int} iCol Column index
-		 *  @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort')
-		 *  @returns {*} Cell data
-		 *  @memberof DataTable#oApi
+		 * Get the settings for a particular table for external manipulation
+		 *  @returns {object} DataTables settings object. See
+		 *    {@link DataTable.models.oSettings}
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      var oSettings = oTable.fnSettings();
+		 *
+		 *      // Show an example parameter from the settings
+		 *      alert( oSettings._iDisplayStart );
+		 *    } );
 		 */
-		function _fnGetCellData( oSettings, iRow, iCol, sSpecific )
+		this.fnSettings = function()
 		{
-			var sData;
-			var oCol = oSettings.aoColumns[iCol];
-			var oData = oSettings.aoData[iRow]._aData;
-		
-			if ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined )
-			{
-				if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )
-				{
-					_fnLog( oSettings, 0, "Requested unknown parameter "+
-						(typeof oCol.mData=='function' ? '{mData function}' : "'"+oCol.mData+"'")+
-						" from the data source for row "+iRow );
-					oSettings.iDrawError = oSettings.iDraw;
-				}
-				return oCol.sDefaultContent;
-			}
-		
-			/* When the data source is null, we can use default column data */
-			if ( sData === null && oCol.sDefaultContent !== null )
-			{
-				sData = oCol.sDefaultContent;
-			}
-			else if ( typeof sData === 'function' )
-			{
-				/* If the data source is a function, then we run it and use the return */
-				return sData();
-			}
-		
-			if ( sSpecific == 'display' && sData === null )
-			{
-				return '';
-			}
-			return sData;
-		}
+			return _fnSettingsFromNode( this[_ext.iApiIndex] );
+		};
 		
 		
 		/**
-		 * Set the value for a specific cell, into the internal data cache
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iRow aoData row id
-		 *  @param {int} iCol Column index
-		 *  @param {*} val Value to set
-		 *  @memberof DataTable#oApi
+		 * Sort the table by a particular column
+		 *  @param {int} iCol the data index to sort on. Note that this will not match the
+		 *    'display index' if you have hidden data entries
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sort immediately with columns 0 and 1
+		 *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
+		 *    } );
 		 */
-		function _fnSetCellData( oSettings, iRow, iCol, val )
+		this.fnSort = function( aaSort )
 		{
-			var oCol = oSettings.aoColumns[iCol];
-			var oData = oSettings.aoData[iRow]._aData;
+			this.api( true ).order( aaSort ).draw();
+		};
 		
-			oCol.fnSetData( oData, val );
-		}
 		
+		/**
+		 * Attach a sort listener to an element for a given column
+		 *  @param {node} nNode the element to attach the sort listener to
+		 *  @param {int} iColumn the column that a click on this node will sort on
+		 *  @param {function} [fnCallback] callback function when sort is run
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sort on column 1, when 'sorter' is clicked on
+		 *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
+		 *    } );
+		 */
+		this.fnSortListener = function( nNode, iColumn, fnCallback )
+		{
+			this.api( true ).order.listener( nNode, iColumn, fnCallback );
+		};
 		
-		// Private variable that is used to match array syntax in the data property object
-		var __reArray = /\[.*?\]$/;
 		
 		/**
-		 * Return a function that can be used to get data from a source object, taking
-		 * into account the ability to use nested objects as a source
-		 *  @param {string|int|function} mSource The data source for the object
-		 *  @returns {function} Data get function
-		 *  @memberof DataTable#oApi
+		 * Update a table cell or row - this method will accept either a single value to
+		 * update the cell with, an array of values with one element for each column or
+		 * an object in the same format as the original data source. The function is
+		 * self-referencing in order to make the multi column updates easier.
+		 *  @param {object|array|string} mData Data to update the cell/row with
+		 *  @param {node|int} mRow TR element you want to update or the aoData index
+		 *  @param {int} [iColumn] The column to update, give as null or undefined to
+		 *    update a whole row.
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @param {bool} [bAction=true] Perform pre-draw actions or not
+		 *  @returns {int} 0 on success, 1 on error
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
+		 *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
+		 *    } );
 		 */
-		function _fnGetObjectDataFn( mSource )
+		this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
 		{
-			if ( mSource === null )
-			{
-				/* Give an empty string for rendering / sorting etc */
-				return function (data, type) {
-					return null;
-				};
+			var api = this.api( true );
+		
+			if ( iColumn === undefined || iColumn === null ) {
+				api.row( mRow ).data( mData );
 			}
-			else if ( typeof mSource === 'function' )
-			{
-				return function (data, type, extra) {
-					return mSource( data, type, extra );
-				};
+			else {
+				api.cell( mRow, iColumn ).data( mData );
 			}
-			else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
-			{
-				/* If there is a . in the source string then the data source is in a 
-				 * nested object so we loop over the data for each level to get the next
-				 * level down. On each loop we test for undefined, and if found immediately
-				 * return. This allows entire objects to be missing and sDefaultContent to
-				 * be used if defined, rather than throwing an error
-				 */
-				var fetchData = function (data, type, src) {
-					var a = src.split('.');
-					var arrayNotation, out, innerSrc;
-		
-					if ( src !== "" )
-					{
-						for ( var i=0, iLen=a.length ; i<iLen ; i++ )
-						{
-							// Check if we are dealing with an array notation request
-							arrayNotation = a[i].match(__reArray);
-		
-							if ( arrayNotation ) {
-								a[i] = a[i].replace(__reArray, '');
-		
-								// Condition allows simply [] to be passed in
-								if ( a[i] !== "" ) {
-									data = data[ a[i] ];
-								}
-								out = [];
-								
-								// Get the remainder of the nested object to get
-								a.splice( 0, i+1 );
-								innerSrc = a.join('.');
-		
-								// Traverse each entry in the array getting the properties requested
-								for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
-									out.push( fetchData( data[j], type, innerSrc ) );
-								}
-		
-								// If a string is given in between the array notation indicators, that
-								// is used to join the strings together, otherwise an array is returned
-								var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
-								data = (join==="") ? out : out.join(join);
-		
-								// The inner call to fetchData has already traversed through the remainder
-								// of the source requested, so we exit from the loop
-								break;
-							}
-		
-							if ( data === null || data[ a[i] ] === undefined )
-							{
-								return undefined;
-							}
-							data = data[ a[i] ];
-						}
-					}
-		
-					return data;
-				};
 		
-				return function (data, type) {
-					return fetchData( data, type, mSource );
-				};
+			if ( bAction === undefined || bAction ) {
+				api.columns.adjust();
 			}
-			else
-			{
-				/* Array or flat object mapping */
-				return function (data, type) {
-					return data[mSource];	
-				};
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw();
 			}
-		}
+			return 0;
+		};
 		
 		
 		/**
-		 * Return a function that can be used to set data from a source object, taking
-		 * into account the ability to use nested objects as a source
-		 *  @param {string|int|function} mSource The data source for the object
-		 *  @returns {function} Data set function
-		 *  @memberof DataTable#oApi
+		 * Provide a common method for plug-ins to check the version of DataTables being used, in order
+		 * to ensure compatibility.
+		 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+		 *    formats "X" and "X.Y" are also acceptable.
+		 *  @returns {boolean} true if this version of DataTables is greater or equal to the required
+		 *    version, or false if this version of DataTales is not suitable
+		 *  @method
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
+		 *    } );
 		 */
-		function _fnSetObjectDataFn( mSource )
-		{
-			if ( mSource === null )
-			{
-				/* Nothing to do when the data source is null */
-				return function (data, val) {};
+		this.fnVersionCheck = _ext.fnVersionCheck;
+		
+
+		var _that = this;
+		var emptyInit = options === undefined;
+		var len = this.length;
+
+		if ( emptyInit ) {
+			options = {};
+		}
+
+		this.oApi = this.internal = _ext.internal;
+
+		// Extend with old style plug-in API methods
+		for ( var fn in DataTable.ext.internal ) {
+			if ( fn ) {
+				this[fn] = _fnExternApiFunc(fn);
 			}
-			else if ( typeof mSource === 'function' )
+		}
+
+		this.each(function() {
+			// For each initialisation we want to give it a clean initialisation
+			// object that can be bashed around
+			var o = {};
+			var oInit = len > 1 ? // optimisation for single table case
+				_fnExtend( o, options, true ) :
+				options;
+
+			/*global oInit,_that,emptyInit*/
+			var i=0, iLen, j, jLen, k, kLen;
+			var sId = this.getAttribute( 'id' );
+			var bInitHandedOff = false;
+			var defaults = DataTable.defaults;
+			var $this = $(this);
+			
+			
+			/* Sanity check */
+			if ( this.nodeName.toLowerCase() != 'table' )
 			{
-				return function (data, val) {
-					mSource( data, 'set', val );
-				};
+				_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
+				return;
 			}
-			else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
+			
+			/* Backwards compatibility for the defaults */
+			_fnCompatOpts( defaults );
+			_fnCompatCols( defaults.column );
+			
+			/* Convert the camel-case defaults to Hungarian */
+			_fnCamelToHungarian( defaults, defaults, true );
+			_fnCamelToHungarian( defaults.column, defaults.column, true );
+			
+			/* Setting up the initialisation object */
+			_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
+			
+			
+			
+			/* Check to see if we are re-initialising a table */
+			var allSettings = DataTable.settings;
+			for ( i=0, iLen=allSettings.length ; i<iLen ; i++ )
 			{
-				/* Like the get, we need to get data from a nested object */
-				var setData = function (data, val, src) {
-					var a = src.split('.'), b;
-					var arrayNotation, o, innerSrc;
-		
-					for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
-					{
-						// Check if we are dealing with an array notation request
-						arrayNotation = a[i].match(__reArray);
-		
-						if ( arrayNotation )
-						{
-							a[i] = a[i].replace(__reArray, '');
-							data[ a[i] ] = [];
-							
-							// Get the remainder of the nested object to set so we can recurse
-							b = a.slice();
-							b.splice( 0, i+1 );
-							innerSrc = b.join('.');
-		
-							// Traverse each entry in the array setting the properties requested
-							for ( var j=0, jLen=val.length ; j<jLen ; j++ )
-							{
-								o = {};
-								setData( o, val[j], innerSrc );
-								data[ a[i] ].push( o );
-							}
-		
-							// The inner call to setData has already traversed through the remainder
-							// of the source and has set the data, thus we can exit here
-							return;
-						}
-		
-						// If the nested object doesn't currently exist - since we are
-						// trying to set the value - create it
-						if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
-						{
-							data[ a[i] ] = {};
-						}
-						data = data[ a[i] ];
-					}
-		
-					// If array notation is used, we just want to strip it and use the property name
-					// and assign the value. If it isn't used, then we get the result we want anyway
-					data[ a[a.length-1].replace(__reArray, '') ] = val;
-				};
-		
-				return function (data, val) {
-					return setData( data, val, mSource );
-				};
-			}
-			else
-			{
-				/* Array or flat object mapping */
-				return function (data, val) {
-					data[mSource] = val;	
-				};
-			}
-		}
-		
-		
-		/**
-		 * Return an array with the full table data
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns array {array} aData Master data array
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnGetDataMaster ( oSettings )
-		{
-			var aData = [];
-			var iLen = oSettings.aoData.length;
-			for ( var i=0 ; i<iLen; i++ )
-			{
-				aData.push( oSettings.aoData[i]._aData );
-			}
-			return aData;
-		}
-		
-		
-		/**
-		 * Nuke the table
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnClearTable( oSettings )
-		{
-			oSettings.aoData.splice( 0, oSettings.aoData.length );
-			oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );
-			oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );
-			_fnCalculateEnd( oSettings );
-		}
-		
-		
-		 /**
-		 * Take an array of integers (index array) and remove a target integer (value - not 
-		 * the key!)
-		 *  @param {array} a Index array to target
-		 *  @param {int} iTarget value to find
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnDeleteIndex( a, iTarget )
-		{
-			var iTargetIndex = -1;
+				var s = allSettings[i];
 			
-			for ( var i=0, iLen=a.length ; i<iLen ; i++ )
-			{
-				if ( a[i] == iTarget )
-				{
-					iTargetIndex = i;
-				}
-				else if ( a[i] > iTarget )
+				/* Base check on table node */
+				if ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) )
 				{
-					a[i]--;
-				}
-			}
+					var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
+					var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
 			
-			if ( iTargetIndex != -1 )
-			{
-				a.splice( iTargetIndex, 1 );
-			}
-		}
-		
-		
-		 /**
-		 * Call the developer defined fnRender function for a given cell (row/column) with
-		 * the required parameters and return the result.
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iRow aoData index for the row
-		 *  @param {int} iCol aoColumns index for the column
-		 *  @returns {*} Return of the developer's fnRender function
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnRender( oSettings, iRow, iCol )
-		{
-			var oCol = oSettings.aoColumns[iCol];
-		
-			return oCol.fnRender( {
-				"iDataRow":    iRow,
-				"iDataColumn": iCol,
-				"oSettings":   oSettings,
-				"aData":       oSettings.aoData[iRow]._aData,
-				"mDataProp":   oCol.mData
-			}, _fnGetCellData(oSettings, iRow, iCol, 'display') );
-		}
-		/**
-		 * Create a new TR element (and it's TD children) for a row
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iRow Row to consider
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnCreateTr ( oSettings, iRow )
-		{
-			var oData = oSettings.aoData[iRow];
-			var nTd;
-		
-			if ( oData.nTr === null )
-			{
-				oData.nTr = document.createElement('tr');
-		
-				/* Use a private property on the node to allow reserve mapping from the node
-				 * to the aoData array for fast look up
-				 */
-				oData.nTr._DT_RowIndex = iRow;
-		
-				/* Special parameters can be given by the data source to be used on the row */
-				if ( oData._aData.DT_RowId )
-				{
-					oData.nTr.id = oData._aData.DT_RowId;
-				}
-		
-				if ( oData._aData.DT_RowClass )
-				{
-					oData.nTr.className = oData._aData.DT_RowClass;
-				}
-		
-				/* Process each column */
-				for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-				{
-					var oCol = oSettings.aoColumns[i];
-					nTd = document.createElement( oCol.sCellType );
-		
-					/* Render if needed - if bUseRendered is true then we already have the rendered
-					 * value in the data source - so can just use that
-					 */
-					nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mData === null)) ?
-						_fnRender( oSettings, iRow, i ) :
-						_fnGetCellData( oSettings, iRow, i, 'display' );
-				
-					/* Add user defined class */
-					if ( oCol.sClass !== null )
+					if ( emptyInit || bRetrieve )
 					{
-						nTd.className = oCol.sClass;
+						return s.oInstance;
 					}
-					
-					if ( oCol.bVisible )
+					else if ( bDestroy )
 					{
-						oData.nTr.appendChild( nTd );
-						oData._anHidden[i] = null;
+						s.oInstance.fnDestroy();
+						break;
 					}
 					else
 					{
-						oData._anHidden[i] = nTd;
-					}
-		
-					if ( oCol.fnCreatedCell )
-					{
-						oCol.fnCreatedCell.call( oSettings.oInstance,
-							nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i
-						);
+						_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );
+						return;
 					}
 				}
-		
-				_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] );
-			}
-		}
-		
-		
-		/**
-		 * Create the HTML header for the table
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnBuildHead( oSettings )
-		{
-			var i, nTh, iLen, j, jLen;
-			var iThs = $('th, td', oSettings.nTHead).length;
-			var iCorrector = 0;
-			var jqChildren;
 			
-			/* If there is a header in place - then use it - otherwise it's going to get nuked... */
-			if ( iThs !== 0 )
-			{
-				/* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */
-				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+				/* If the element we are initialising has the same ID as a table which was previously
+				 * initialised, but the table nodes don't match (from before) then we destroy the old
+				 * instance by simply deleting it. This is under the assumption that the table has been
+				 * destroyed by other methods. Anyone using non-id selectors will need to do this manually
+				 */
+				if ( s.sTableId == this.id )
 				{
-					nTh = oSettings.aoColumns[i].nTh;
-					nTh.setAttribute('role', 'columnheader');
-					if ( oSettings.aoColumns[i].bSortable )
-					{
-						nTh.setAttribute('tabindex', oSettings.iTabIndex);
-						nTh.setAttribute('aria-controls', oSettings.sTableId);
-					}
-		
-					if ( oSettings.aoColumns[i].sClass !== null )
-					{
-						$(nTh).addClass( oSettings.aoColumns[i].sClass );
-					}
-					
-					/* Set the title of the column if it is user defined (not what was auto detected) */
-					if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )
-					{
-						nTh.innerHTML = oSettings.aoColumns[i].sTitle;
-					}
+					allSettings.splice( i, 1 );
+					break;
 				}
 			}
-			else
+			
+			/* Ensure the table has an ID - required for accessibility */
+			if ( sId === null || sId === "" )
 			{
-				/* We don't have a header in the DOM - so we are going to have to create one */
-				var nTr = document.createElement( "tr" );
-				
-				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-				{
-					nTh = oSettings.aoColumns[i].nTh;
-					nTh.innerHTML = oSettings.aoColumns[i].sTitle;
-					nTh.setAttribute('tabindex', '0');
-					
-					if ( oSettings.aoColumns[i].sClass !== null )
-					{
-						$(nTh).addClass( oSettings.aoColumns[i].sClass );
-					}
-					
-					nTr.appendChild( nTh );
-				}
-				$(oSettings.nTHead).html( '' )[0].appendChild( nTr );
-				_fnDetectHeader( oSettings.aoHeader, oSettings.nTHead );
+				sId = "DataTables_Table_"+(DataTable.ext._unique++);
+				this.id = sId;
 			}
 			
-			/* ARIA role for the rows */	
-			$(oSettings.nTHead).children('tr').attr('role', 'row');
+			/* Create the settings object for this table and set some of the default parameters */
+			var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
+				"sDestroyWidth": $this[0].style.width,
+				"sInstance":     sId,
+				"sTableId":      sId
+			} );
+			oSettings.nTable = this;
+			oSettings.oApi   = _that.internal;
+			oSettings.oInit  = oInit;
 			
-			/* Add the extra markup needed by jQuery UI's themes */
-			if ( oSettings.bJUI )
-			{
-				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-				{
-					nTh = oSettings.aoColumns[i].nTh;
-					
-					var nDiv = document.createElement('div');
-					nDiv.className = oSettings.oClasses.sSortJUIWrapper;
-					$(nTh).contents().appendTo(nDiv);
-					
-					var nSpan = document.createElement('span');
-					nSpan.className = oSettings.oClasses.sSortIcon;
-					nDiv.appendChild( nSpan );
-					nTh.appendChild( nDiv );
-				}
-			}
+			allSettings.push( oSettings );
 			
-			if ( oSettings.oFeatures.bSort )
-			{
-				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
-				{
-					if ( oSettings.aoColumns[i].bSortable !== false )
-					{
-						_fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
-					}
-					else
-					{
-						$(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
-					}
-				}
-			}
+			// Need to add the instance after the instance after the settings object has been added
+			// to the settings array, so we can self reference the table instance if more than one
+			oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();
 			
-			/* Deal with the footer - add classes if required */
-			if ( oSettings.oClasses.sFooterTH !== "" )
-			{
-				$(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH );
-			}
+			// Backwards compatibility, before we apply all the defaults
+			_fnCompatOpts( oInit );
 			
-			/* Cache the footer elements */
-			if ( oSettings.nTFoot !== null )
+			if ( oInit.oLanguage )
 			{
-				var anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter );
-				for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-				{
-					if ( anCells[i] )
-					{
-						oSettings.aoColumns[i].nTf = anCells[i];
-						if ( oSettings.aoColumns[i].sClass )
-						{
-							$(anCells[i]).addClass( oSettings.aoColumns[i].sClass );
-						}
-					}
-				}
+				_fnLanguageCompat( oInit.oLanguage );
 			}
-		}
-		
-		
-		/**
-		 * Draw the header (or footer) element based on the column visibility states. The
-		 * methodology here is to use the layout array from _fnDetectHeader, modified for
-		 * the instantaneous column visibility, to construct the new layout. The grid is
-		 * traversed over cell at a time in a rows x columns grid fashion, although each 
-		 * cell insert can cover multiple elements in the grid - which is tracks using the
-		 * aApplied array. Cell inserts in the grid will only occur where there isn't
-		 * already a cell in that position.
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param array {objects} aoSource Layout array from _fnDetectHeader
-		 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, 
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
-		{
-			var i, iLen, j, jLen, k, kLen, n, nLocalTr;
-			var aoLocal = [];
-			var aApplied = [];
-			var iColumns = oSettings.aoColumns.length;
-			var iRowspan, iColspan;
-		
-			if (  bIncludeHidden === undefined )
+			
+			// If the length menu is given, but the init display length is not, use the length menu
+			if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
 			{
-				bIncludeHidden = false;
+				oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?
+					oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];
 			}
-		
-			/* Make a copy of the master layout array, but without the visible columns in it */
-			for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
+			
+			// Apply the defaults and init options to make a single init object will all
+			// options defined from defaults and instance options.
+			oInit = _fnExtend( $.extend( true, {}, defaults ), oInit );
+			
+			
+			// Map the initialisation options onto the settings object
+			_fnMap( oSettings.oFeatures, oInit, [
+				"bPaginate",
+				"bLengthChange",
+				"bFilter",
+				"bSort",
+				"bSortMulti",
+				"bInfo",
+				"bProcessing",
+				"bAutoWidth",
+				"bSortClasses",
+				"bServerSide",
+				"bDeferRender"
+			] );
+			_fnMap( oSettings, oInit, [
+				"asStripeClasses",
+				"ajax",
+				"fnServerData",
+				"fnFormatNumber",
+				"sServerMethod",
+				"aaSorting",
+				"aaSortingFixed",
+				"aLengthMenu",
+				"sPaginationType",
+				"sAjaxSource",
+				"sAjaxDataProp",
+				"iStateDuration",
+				"sDom",
+				"bSortCellsTop",
+				"iTabIndex",
+				"fnStateLoadCallback",
+				"fnStateSaveCallback",
+				"renderer",
+				"searchDelay",
+				"rowId",
+				[ "iCookieDuration", "iStateDuration" ], // backwards compat
+				[ "oSearch", "oPreviousSearch" ],
+				[ "aoSearchCols", "aoPreSearchCols" ],
+				[ "iDisplayLength", "_iDisplayLength" ],
+				[ "bJQueryUI", "bJUI" ]
+			] );
+			_fnMap( oSettings.oScroll, oInit, [
+				[ "sScrollX", "sX" ],
+				[ "sScrollXInner", "sXInner" ],
+				[ "sScrollY", "sY" ],
+				[ "bScrollCollapse", "bCollapse" ]
+			] );
+			_fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
+			
+			/* Callback functions which are array driven */
+			_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
+			_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
+			_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
+			_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
+			_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
+			_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
+			_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
+			_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
+			_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
+			_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
+			_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
+			
+			oSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );
+			
+			/* Browser support detection */
+			_fnBrowserDetect( oSettings );
+			
+			var oClasses = oSettings.oClasses;
+			
+			// @todo Remove in 1.11
+			if ( oInit.bJQueryUI )
 			{
-				aoLocal[i] = aoSource[i].slice();
-				aoLocal[i].nTr = aoSource[i].nTr;
-		
-				/* Remove any columns which are currently hidden */
-				for ( j=iColumns-1 ; j>=0 ; j-- )
+				/* Use the JUI classes object for display. You could clone the oStdClasses object if
+				 * you want to have multiple tables with multiple independent classes
+				 */
+				$.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses );
+			
+				if ( oInit.sDom === defaults.sDom && defaults.sDom === "lfrtip" )
 				{
-					if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
-					{
-						aoLocal[i].splice( j, 1 );
-					}
+					/* Set the DOM to use a layout suitable for jQuery UI's theming */
+					oSettings.sDom = '<"H"lfr>t<"F"ip>';
 				}
-		
-				/* Prep the applied array - it needs an element for each row */
-				aApplied.push( [] );
-			}
-		
-			for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
-			{
-				nLocalTr = aoLocal[i].nTr;
-				
-				/* All cells are going to be replaced, so empty out the row */
-				if ( nLocalTr )
-				{
-					while( (n = nLocalTr.firstChild) )
-					{
-						nLocalTr.removeChild( n );
-					}
+			
+				if ( ! oSettings.renderer ) {
+					oSettings.renderer = 'jqueryui';
 				}
-		
-				for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
-				{
-					iRowspan = 1;
-					iColspan = 1;
-		
-					/* Check to see if there is already a cell (row/colspan) covering our target
-					 * insert point. If there is, then there is nothing to do.
-					 */
-					if ( aApplied[i][j] === undefined )
-					{
-						nLocalTr.appendChild( aoLocal[i][j].cell );
-						aApplied[i][j] = 1;
-		
-						/* Expand the cell to cover as many rows as needed */
-						while ( aoLocal[i+iRowspan] !== undefined &&
-						        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
-						{
-							aApplied[i+iRowspan][j] = 1;
-							iRowspan++;
-						}
-		
-						/* Expand the cell to cover as many columns as needed */
-						while ( aoLocal[i][j+iColspan] !== undefined &&
-						        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
-						{
-							/* Must update the applied array over the rows for the columns */
-							for ( k=0 ; k<iRowspan ; k++ )
-							{
-								aApplied[i+k][j+iColspan] = 1;
-							}
-							iColspan++;
-						}
-		
-						/* Do the actual expansion in the DOM */
-						aoLocal[i][j].cell.rowSpan = iRowspan;
-						aoLocal[i][j].cell.colSpan = iColspan;
-					}
+				else if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) {
+					oSettings.renderer.header = 'jqueryui';
 				}
 			}
-		}
-		
-		
-		/**
-		 * Insert the required TR nodes into the table for display
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnDraw( oSettings )
-		{
-			/* Provide a pre-callback function which can be used to cancel the draw is false is returned */
-			var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
-			if ( $.inArray( false, aPreDraw ) !== -1 )
+			else
 			{
-				_fnProcessingDisplay( oSettings, false );
-				return;
+				$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );
 			}
+			$this.addClass( oClasses.sTable );
 			
-			var i, iLen, n;
-			var anRows = [];
-			var iRowCount = 0;
-			var iStripes = oSettings.asStripeClasses.length;
-			var iOpenRows = oSettings.aoOpenRows.length;
-			
-			oSettings.bDrawing = true;
 			
-			/* Check and see if we have an initial draw position from state saving */
-			if ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 )
+			if ( oSettings.iInitDisplayStart === undefined )
 			{
-				if ( oSettings.oFeatures.bServerSide )
-				{
-					oSettings._iDisplayStart = oSettings.iInitDisplayStart;
-				}
-				else
-				{
-					oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?
-						0 : oSettings.iInitDisplayStart;
-				}
-				oSettings.iInitDisplayStart = -1;
-				_fnCalculateEnd( oSettings );
+				/* Display start point, taking into account the save saving */
+				oSettings.iInitDisplayStart = oInit.iDisplayStart;
+				oSettings._iDisplayStart = oInit.iDisplayStart;
 			}
 			
-			/* Server-side processing draw intercept */
-			if ( oSettings.bDeferLoading )
+			if ( oInit.iDeferLoading !== null )
 			{
-				oSettings.bDeferLoading = false;
-				oSettings.iDraw++;
+				oSettings.bDeferLoading = true;
+				var tmp = $.isArray( oInit.iDeferLoading );
+				oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
+				oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
 			}
-			else if ( !oSettings.oFeatures.bServerSide )
+			
+			/* Language definitions */
+			var oLanguage = oSettings.oLanguage;
+			$.extend( true, oLanguage, oInit.oLanguage );
+			
+			if ( oLanguage.sUrl !== "" )
 			{
-				oSettings.iDraw++;
+				/* Get the language definitions from a file - because this Ajax call makes the language
+				 * get async to the remainder of this function we use bInitHandedOff to indicate that
+				 * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
+				 */
+				$.ajax( {
+					dataType: 'json',
+					url: oLanguage.sUrl,
+					success: function ( json ) {
+						_fnLanguageCompat( json );
+						_fnCamelToHungarian( defaults.oLanguage, json );
+						$.extend( true, oLanguage, json );
+						_fnInitialise( oSettings );
+					},
+					error: function () {
+						// Error occurred loading language file, continue on as best we can
+						_fnInitialise( oSettings );
+					}
+				} );
+				bInitHandedOff = true;
 			}
-			else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+			
+			/*
+			 * Stripes
+			 */
+			if ( oInit.asStripeClasses === null )
 			{
-				return;
+				oSettings.asStripeClasses =[
+					oClasses.sStripeOdd,
+					oClasses.sStripeEven
+				];
 			}
 			
-			if ( oSettings.aiDisplay.length !== 0 )
-			{
-				var iStart = oSettings._iDisplayStart;
-				var iEnd = oSettings._iDisplayEnd;
-				
-				if ( oSettings.oFeatures.bServerSide )
-				{
-					iStart = 0;
-					iEnd = oSettings.aoData.length;
-				}
-				
-				for ( var j=iStart ; j<iEnd ; j++ )
-				{
-					var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];
-					if ( aoData.nTr === null )
-					{
-						_fnCreateTr( oSettings, oSettings.aiDisplay[j] );
-					}
-		
-					var nRow = aoData.nTr;
-					
-					/* Remove the old striping classes and then add the new one */
-					if ( iStripes !== 0 )
-					{
-						var sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ];
-						if ( aoData._sRowStripe != sStripe )
-						{
-							$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
-							aoData._sRowStripe = sStripe;
-						}
-					}
-					
-					/* Row callback functions - might want to manipulate the row */
-					_fnCallbackFire( oSettings, 'aoRowCallback', null, 
-						[nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );
-					
-					anRows.push( nRow );
-					iRowCount++;
-					
-					/* If there is an open row - and it is attached to this parent - attach it on redraw */
-					if ( iOpenRows !== 0 )
-					{
-						for ( var k=0 ; k<iOpenRows ; k++ )
-						{
-							if ( nRow == oSettings.aoOpenRows[k].nParent )
-							{
-								anRows.push( oSettings.aoOpenRows[k].nTr );
-								break;
-							}
-						}
-					}
-				}
-			}
-			else
-			{
-				/* Table is empty - create a row with an empty message in it */
-				anRows[ 0 ] = document.createElement( 'tr' );
-				
-				if ( oSettings.asStripeClasses[0] )
-				{
-					anRows[ 0 ].className = oSettings.asStripeClasses[0];
-				}
-		
-				var oLang = oSettings.oLanguage;
-				var sZero = oLang.sZeroRecords;
-				if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
-				{
-					sZero = oLang.sLoadingRecords;
-				}
-				else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
-				{
-					sZero = oLang.sEmptyTable;
-				}
-		
-				var nTd = document.createElement( 'td' );
-				nTd.setAttribute( 'valign', "top" );
-				nTd.colSpan = _fnVisbleColumns( oSettings );
-				nTd.className = oSettings.oClasses.sRowEmpty;
-				nTd.innerHTML = _fnInfoMacros( oSettings, sZero );
-				
-				anRows[ iRowCount ].appendChild( nTd );
+			/* Remove row stripe classes if they are already on the table row */
+			var stripeClasses = oSettings.asStripeClasses;
+			var rowOne = $this.children('tbody').find('tr').eq(0);
+			if ( $.inArray( true, $.map( stripeClasses, function(el, i) {
+				return rowOne.hasClass(el);
+			} ) ) !== -1 ) {
+				$('tbody tr', this).removeClass( stripeClasses.join(' ') );
+				oSettings.asDestroyStripes = stripeClasses.slice();
 			}
 			
-			/* Header and footer callbacks */
-			_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], 
-				_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
-			
-			_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], 
-				_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
-			
-			/* 
-			 * Need to remove any old row from the display - note we can't just empty the tbody using
-			 * $().html('') since this will unbind the jQuery event handlers (even although the node 
-			 * still exists!) - equally we can't use innerHTML, since IE throws an exception.
+			/*
+			 * Columns
+			 * See if we should load columns automatically or use defined ones
 			 */
-			var
-				nAddFrag = document.createDocumentFragment(),
-				nRemoveFrag = document.createDocumentFragment(),
-				nBodyPar, nTrs;
-			
-			if ( oSettings.nTBody )
+			var anThs = [];
+			var aoColumnsInit;
+			var nThead = this.getElementsByTagName('thead');
+			if ( nThead.length !== 0 )
 			{
-				nBodyPar = oSettings.nTBody.parentNode;
-				nRemoveFrag.appendChild( oSettings.nTBody );
-				
-				/* When doing infinite scrolling, only remove child rows when sorting, filtering or start
-				 * up. When not infinite scroll, always do it.
-				 */
-				if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||
-				 	oSettings.bSorted || oSettings.bFiltered )
-				{
-					while( (n = oSettings.nTBody.firstChild) )
-					{
-						oSettings.nTBody.removeChild( n );
-					}
-				}
-				
-				/* Put the draw table into the dom */
-				for ( i=0, iLen=anRows.length ; i<iLen ; i++ )
-				{
-					nAddFrag.appendChild( anRows[i] );
-				}
-				
-				oSettings.nTBody.appendChild( nAddFrag );
-				if ( nBodyPar !== null )
-				{
-					nBodyPar.appendChild( oSettings.nTBody );
-				}
+				_fnDetectHeader( oSettings.aoHeader, nThead[0] );
+				anThs = _fnGetUniqueThs( oSettings );
 			}
 			
-			/* Call all required callback functions for the end of a draw */
-			_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
-			
-			/* Draw is complete, sorting and filtering must be as well */
-			oSettings.bSorted = false;
-			oSettings.bFiltered = false;
-			oSettings.bDrawing = false;
-			
-			if ( oSettings.oFeatures.bServerSide )
+			/* If not given a column array, generate one with nulls */
+			if ( oInit.aoColumns === null )
 			{
-				_fnProcessingDisplay( oSettings, false );
-				if ( !oSettings._bInitComplete )
+				aoColumnsInit = [];
+				for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
 				{
-					_fnInitComplete( oSettings );
+					aoColumnsInit.push( null );
 				}
 			}
-		}
-		
-		
-		/**
-		 * Redraw the table - taking account of the various features which are enabled
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnReDraw( oSettings )
-		{
-			if ( oSettings.oFeatures.bSort )
-			{
-				/* Sorting will refilter and draw for us */
-				_fnSort( oSettings, oSettings.oPreviousSearch );
-			}
-			else if ( oSettings.oFeatures.bFilter )
+			else
 			{
-				/* Filtering will redraw for us */
-				_fnFilterComplete( oSettings, oSettings.oPreviousSearch );
+				aoColumnsInit = oInit.aoColumns;
 			}
-			else
+			
+			/* Add the columns */
+			for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
 			{
-				_fnCalculateEnd( oSettings );
-				_fnDraw( oSettings );
+				_fnAddColumn( oSettings, anThs ? anThs[i] : null );
 			}
-		}
-		
-		
-		/**
-		 * Add the options to the page HTML for the table
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnAddOptionsHtml ( oSettings )
-		{
-			/*
-			 * Create a temporary, empty, div which we can later on replace with what we have generated
-			 * we do it this way to rendering the 'options' html offline - speed :-)
-			 */
-			var nHolding = $('<div></div>')[0];
-			oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );
 			
-			/* 
-			 * All DataTables are wrapped in a div
+			/* Apply the column definitions */
+			_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
+				_fnColumnOptions( oSettings, iCol, oDef );
+			} );
+			
+			/* HTML5 attribute detection - build an mData object automatically if the
+			 * attributes are found
 			 */
-			oSettings.nTableWrapper = $('<div id="'+oSettings.sTableId+'_wrapper" class="'+oSettings.oClasses.sWrapper+'" role="grid"></div>')[0];
-			oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
-		
-			/* Track where we want to insert the option */
-			var nInsertNode = oSettings.nTableWrapper;
+			if ( rowOne.length ) {
+				var a = function ( cell, name ) {
+					return cell.getAttribute( 'data-'+name ) !== null ? name : null;
+				};
 			
-			/* Loop over the user set positioning and place the elements as needed */
-			var aDom = oSettings.sDom.split('');
-			var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;
-			for ( var i=0 ; i<aDom.length ; i++ )
-			{
-				iPushFeature = 0;
-				cOption = aDom[i];
-				
-				if ( cOption == '<' )
-				{
-					/* New container div */
-					nNewNode = $('<div></div>')[0];
-					
-					/* Check to see if we should append an id and/or a class name to the container */
-					cNext = aDom[i+1];
-					if ( cNext == "'" || cNext == '"' )
-					{
-						sAttr = "";
-						j = 2;
-						while ( aDom[i+j] != cNext )
-						{
-							sAttr += aDom[i+j];
-							j++;
-						}
-						
-						/* Replace jQuery UI constants */
-						if ( sAttr == "H" )
-						{
-							sAttr = oSettings.oClasses.sJUIHeader;
-						}
-						else if ( sAttr == "F" )
-						{
-							sAttr = oSettings.oClasses.sJUIFooter;
-						}
-						
-						/* The attribute can be in the format of "#id.class", "#id" or "class" This logic
-						 * breaks the string into parts and applies them as needed
-						 */
-						if ( sAttr.indexOf('.') != -1 )
-						{
-							var aSplit = sAttr.split('.');
-							nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
-							nNewNode.className = aSplit[1];
-						}
-						else if ( sAttr.charAt(0) == "#" )
-						{
-							nNewNode.id = sAttr.substr(1, sAttr.length-1);
-						}
-						else
-						{
-							nNewNode.className = sAttr;
-						}
-						
-						i += j; /* Move along the position array */
-					}
-					
-					nInsertNode.appendChild( nNewNode );
-					nInsertNode = nNewNode;
-				}
-				else if ( cOption == '>' )
-				{
-					/* End container div */
-					nInsertNode = nInsertNode.parentNode;
-				}
-				else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )
-				{
-					/* Length */
-					nTmp = _fnFeatureHtmlLength( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
-				{
-					/* Filter */
-					nTmp = _fnFeatureHtmlFilter( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
-				{
-					/* pRocessing */
-					nTmp = _fnFeatureHtmlProcessing( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption == 't' )
-				{
-					/* Table */
-					nTmp = _fnFeatureHtmlTable( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption ==  'i' && oSettings.oFeatures.bInfo )
-				{
-					/* Info */
-					nTmp = _fnFeatureHtmlInfo( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
-				{
-					/* Pagination */
-					nTmp = _fnFeatureHtmlPaginate( oSettings );
-					iPushFeature = 1;
-				}
-				else if ( DataTable.ext.aoFeatures.length !== 0 )
-				{
-					/* Plug-in features */
-					var aoFeatures = DataTable.ext.aoFeatures;
-					for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
-					{
-						if ( cOption == aoFeatures[k].cFeature )
-						{
-							nTmp = aoFeatures[k].fnInit( oSettings );
-							if ( nTmp )
-							{
-								iPushFeature = 1;
-							}
-							break;
+				$( rowOne[0] ).children('th, td').each( function (i, cell) {
+					var col = oSettings.aoColumns[i];
+			
+					if ( col.mData === i ) {
+						var sort = a( cell, 'sort' ) || a( cell, 'order' );
+						var filter = a( cell, 'filter' ) || a( cell, 'search' );
+			
+						if ( sort !== null || filter !== null ) {
+							col.mData = {
+								_:      i+'.display',
+								sort:   sort !== null   ? i+'.@data-'+sort   : undefined,
+								type:   sort !== null   ? i+'.@data-'+sort   : undefined,
+								filter: filter !== null ? i+'.@data-'+filter : undefined
+							};
+			
+							_fnColumnOptions( oSettings, i );
 						}
 					}
-				}
-				
-				/* Add to the 2D features array */
-				if ( iPushFeature == 1 && nTmp !== null )
-				{
-					if ( typeof oSettings.aanFeatures[cOption] !== 'object' )
-					{
-						oSettings.aanFeatures[cOption] = [];
-					}
-					oSettings.aanFeatures[cOption].push( nTmp );
-					nInsertNode.appendChild( nTmp );
-				}
+				} );
 			}
 			
-			/* Built our DOM structure - replace the holding div with what we want */
-			nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );
-		}
-		
-		
-		/**
-		 * Use the DOM source to create up an array of header cells. The idea here is to
-		 * create a layout grid (array) of rows x columns, which contains a reference
-		 * to the cell that that point in the grid (regardless of col/rowspan), such that
-		 * any column / row could be removed and the new grid constructed
-		 *  @param array {object} aLayout Array to store the calculated layout in
-		 *  @param {node} nThead The header/footer element for the table
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnDetectHeader ( aLayout, nThead )
-		{
-			var nTrs = $(nThead).children('tr');
-			var nTr, nCell;
-			var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
-			var bUnique;
-			var fnShiftCol = function ( a, i, j ) {
-				var k = a[i];
-		                while ( k[j] ) {
-					j++;
-				}
-				return j;
-			};
-		
-			aLayout.splice( 0, aLayout.length );
+			var features = oSettings.oFeatures;
 			
-			/* We know how many rows there are in the layout - so prep it */
-			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+			/* Must be done after everything which can be overridden by the state saving! */
+			if ( oInit.bStateSave )
 			{
-				aLayout.push( [] );
+				features.bStateSave = true;
+				_fnLoadState( oSettings, oInit );
+				_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
 			}
 			
-			/* Calculate a layout array */
-			for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
-			{
-				nTr = nTrs[i];
-				iColumn = 0;
-				
-				/* For every cell in the row... */
-				nCell = nTr.firstChild;
-				while ( nCell ) {
-					if ( nCell.nodeName.toUpperCase() == "TD" ||
-					     nCell.nodeName.toUpperCase() == "TH" )
-					{
-						/* Get the col and rowspan attributes from the DOM and sanitise them */
-						iColspan = nCell.getAttribute('colspan') * 1;
-						iRowspan = nCell.getAttribute('rowspan') * 1;
-						iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
-						iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
-		
-						/* There might be colspan cells already in this row, so shift our target 
-						 * accordingly
-						 */
-						iColShifted = fnShiftCol( aLayout, i, iColumn );
-						
-						/* Cache calculation for unique columns */
-						bUnique = iColspan === 1 ? true : false;
-						
-						/* If there is col / rowspan, copy the information into the layout grid */
-						for ( l=0 ; l<iColspan ; l++ )
-						{
-							for ( k=0 ; k<iRowspan ; k++ )
-							{
-								aLayout[i+k][iColShifted+l] = {
-									"cell": nCell,
-									"unique": bUnique
-								};
-								aLayout[i+k].nTr = nTr;
-							}
-						}
-					}
-					nCell = nCell.nextSibling;
-				}
-			}
-		}
-		
-		
-		/**
-		 * Get an array of unique th elements, one for each column
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {node} nHeader automatically detect the layout from this node - optional
-		 *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
-		 *  @returns array {node} aReturn list of unique th's
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
-		{
-			var aReturn = [];
-			if ( !aLayout )
+			
+			/*
+			 * Sorting
+			 * @todo For modularisation (1.11) this needs to do into a sort start up handler
+			 */
+			
+			// If aaSorting is not defined, then we use the first indicator in asSorting
+			// in case that has been altered, so the default sort reflects that option
+			if ( oInit.aaSorting === undefined )
 			{
-				aLayout = oSettings.aoHeader;
-				if ( nHeader )
+				var sorting = oSettings.aaSorting;
+				for ( i=0, iLen=sorting.length ; i<iLen ; i++ )
 				{
-					aLayout = [];
-					_fnDetectHeader( aLayout, nHeader );
+					sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];
 				}
 			}
-		
-			for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
+			
+			/* Do a first pass on the sorting classes (allows any size changes to be taken into
+			 * account, and also will apply sorting disabled classes if disabled
+			 */
+			_fnSortingClasses( oSettings );
+			
+			if ( features.bSort )
 			{
-				for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
-				{
-					if ( aLayout[i][j].unique && 
-						 (!aReturn[j] || !oSettings.bSortCellsTop) )
-					{
-						aReturn[j] = aLayout[i][j].cell;
+				_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
+					if ( oSettings.bSorted ) {
+						var aSort = _fnSortFlatten( oSettings );
+						var sortedColumns = {};
+			
+						$.each( aSort, function (i, val) {
+							sortedColumns[ val.src ] = val.dir;
+						} );
+			
+						_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );
+						_fnSortAria( oSettings );
 					}
-				}
+				} );
 			}
 			
-			return aReturn;
-		}
-		
-		
-		
-		/**
-		 * Update the table using an Ajax call
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {boolean} Block the table drawing or not
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnAjaxUpdate( oSettings )
-		{
-			if ( oSettings.bAjaxDataGet )
+			_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
+				if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {
+					_fnSortingClasses( oSettings );
+				}
+			}, 'sc' );
+			
+			
+			/*
+			 * Final init
+			 * Cache the header, body and footer as required, creating them if needed
+			 */
+			
+			// Work around for Webkit bug 83867 - store the caption-side before removing from doc
+			var captions = $this.children('caption').each( function () {
+				this._captionSide = $this.css('caption-side');
+			} );
+			
+			var thead = $this.children('thead');
+			if ( thead.length === 0 )
 			{
-				oSettings.iDraw++;
-				_fnProcessingDisplay( oSettings, true );
-				var iColumns = oSettings.aoColumns.length;
-				var aoData = _fnAjaxParameters( oSettings );
-				_fnServerParams( oSettings, aoData );
-				
-				oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
-					function(json) {
-						_fnAjaxUpdateDraw( oSettings, json );
-					}, oSettings );
-				return false;
+				thead = $('<thead/>').appendTo(this);
 			}
-			else
+			oSettings.nTHead = thead[0];
+			
+			var tbody = $this.children('tbody');
+			if ( tbody.length === 0 )
 			{
-				return true;
+				tbody = $('<tbody/>').appendTo(this);
 			}
-		}
-		
-		
-		/**
-		 * Build up the parameters in an object needed for a server-side processing request
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {bool} block the table drawing or not
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnAjaxParameters( oSettings )
-		{
-			var iColumns = oSettings.aoColumns.length;
-			var aoData = [], mDataProp, aaSort, aDataSort;
-			var i, j;
+			oSettings.nTBody = tbody[0];
 			
-			aoData.push( { "name": "sEcho",          "value": oSettings.iDraw } );
-			aoData.push( { "name": "iColumns",       "value": iColumns } );
-			aoData.push( { "name": "sColumns",       "value": _fnColumnOrdering(oSettings) } );
-			aoData.push( { "name": "iDisplayStart",  "value": oSettings._iDisplayStart } );
-			aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
-				oSettings._iDisplayLength : -1 } );
-				
-			for ( i=0 ; i<iColumns ; i++ )
+			var tfoot = $this.children('tfoot');
+			if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
 			{
-			  mDataProp = oSettings.aoColumns[i].mData;
-				aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
+				// If we are a scrolling table, and no footer has been given, then we need to create
+				// a tfoot element for the caption element to be appended to
+				tfoot = $('<tfoot/>').appendTo(this);
 			}
 			
-			/* Filtering */
-			if ( oSettings.oFeatures.bFilter !== false )
-			{
-				aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
-				aoData.push( { "name": "bRegex",  "value": oSettings.oPreviousSearch.bRegex } );
-				for ( i=0 ; i<iColumns ; i++ )
-				{
-					aoData.push( { "name": "sSearch_"+i,     "value": oSettings.aoPreSearchCols[i].sSearch } );
-					aoData.push( { "name": "bRegex_"+i,      "value": oSettings.aoPreSearchCols[i].bRegex } );
-					aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
-				}
+			if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
+				$this.addClass( oClasses.sNoFooter );
+			}
+			else if ( tfoot.length > 0 ) {
+				oSettings.nTFoot = tfoot[0];
+				_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
 			}
 			
-			/* Sorting */
-			if ( oSettings.oFeatures.bSort !== false )
+			/* Check if there is data passing into the constructor */
+			if ( oInit.aaData )
 			{
-				var iCounter = 0;
-		
-				aaSort = ( oSettings.aaSortingFixed !== null ) ?
-					oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
-					oSettings.aaSorting.slice();
-				
-				for ( i=0 ; i<aaSort.length ; i++ )
-				{
-					aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;
-					
-					for ( j=0 ; j<aDataSort.length ; j++ )
-					{
-						aoData.push( { "name": "iSortCol_"+iCounter,  "value": aDataSort[j] } );
-						aoData.push( { "name": "sSortDir_"+iCounter,  "value": aaSort[i][1] } );
-						iCounter++;
-					}
-				}
-				aoData.push( { "name": "iSortingCols",   "value": iCounter } );
-				
-				for ( i=0 ; i<iColumns ; i++ )
+				for ( i=0 ; i<oInit.aaData.length ; i++ )
 				{
-					aoData.push( { "name": "bSortable_"+i,  "value": oSettings.aoColumns[i].bSortable } );
+					_fnAddData( oSettings, oInit.aaData[ i ] );
 				}
 			}
-			
-			return aoData;
-		}
-		
-		
-		/**
-		 * Add Ajax parameters from plug-ins
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param array {objects} aoData name/value pairs to send to the server
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnServerParams( oSettings, aoData )
-		{
-			_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] );
-		}
-		
-		
-		/**
-		 * Data the data from the server (nuking the old) and redraw the table
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {object} json json data return from the server.
-		 *  @param {string} json.sEcho Tracking flag for DataTables to match requests
-		 *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
-		 *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
-		 *  @param {array} json.aaData The data to display on this page
-		 *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnAjaxUpdateDraw ( oSettings, json )
-		{
-			if ( json.sEcho !== undefined )
+			else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' )
 			{
-				/* Protect against old returns over-writing a new one. Possible when you get
-				 * very fast interaction, and later queries are completed much faster
+				/* Grab the data from the page - only do this when deferred loading or no Ajax
+				 * source since there is no point in reading the DOM data if we are then going
+				 * to replace it with Ajax data
 				 */
-				if ( json.sEcho*1 < oSettings.iDraw )
-				{
-					return;
-				}
-				else
-				{
-					oSettings.iDraw = json.sEcho * 1;
-				}
+				_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );
 			}
 			
-			if ( !oSettings.oScroll.bInfinite ||
-				   (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
-			{
-				_fnClearTable( oSettings );
-			}
-			oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);
-			oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);
+			/* Copy the data index array */
+			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
 			
-			/* Determine if reordering is required */
-			var sOrdering = _fnColumnOrdering(oSettings);
-			var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering );
-			var aiIndex;
-			if ( bReOrder )
-			{
-				aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
-			}
+			/* Initialisation complete - table can be drawn */
+			oSettings.bInitialised = true;
 			
-			var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
-			for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
+			/* Check if we need to initialise the table (it might not have been handed off to the
+			 * language processor)
+			 */
+			if ( bInitHandedOff === false )
 			{
-				if ( bReOrder )
-				{
-					/* If we need to re-order, then create a new array with the correct order and add it */
-					var aDataSorted = [];
-					for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
-					{
-						aDataSorted.push( aData[i][ aiIndex[j] ] );
-					}
-					_fnAddData( oSettings, aDataSorted );
-				}
-				else
-				{
-					/* No re-order required, sever got it "right" - just straight add */
-					_fnAddData( oSettings, aData[i] );
-				}
+				_fnInitialise( oSettings );
 			}
-			oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-			
-			oSettings.bAjaxDataGet = false;
-			_fnDraw( oSettings );
-			oSettings.bAjaxDataGet = true;
-			_fnProcessingDisplay( oSettings, false );
+		} );
+		_that = null;
+		return this;
+	};
+
+	
+	/*
+	 * It is useful to have variables which are scoped locally so only the
+	 * DataTables functions can access them and they don't leak into global space.
+	 * At the same time these functions are often useful over multiple files in the
+	 * core and API, so we list, or at least document, all variables which are used
+	 * by DataTables as private variables here. This also ensures that there is no
+	 * clashing of variable names and that they can easily referenced for reuse.
+	 */
+	
+	
+	// Defined else where
+	//  _selector_run
+	//  _selector_opts
+	//  _selector_first
+	//  _selector_row_indexes
+	
+	var _ext; // DataTable.ext
+	var _Api; // DataTable.Api
+	var _api_register; // DataTable.Api.register
+	var _api_registerPlural; // DataTable.Api.registerPlural
+	
+	var _re_dic = {};
+	var _re_new_lines = /[\r\n]/g;
+	var _re_html = /<.*?>/g;
+	var _re_date_start = /^[\w\+\-]/;
+	var _re_date_end = /[\w\+\-]$/;
+	
+	// Escape regular expression special characters
+	var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
+	
+	// http://en.wikipedia.org/wiki/Foreign_exchange_market
+	// - \u20BD - Russian ruble.
+	// - \u20a9 - South Korean Won
+	// - \u20BA - Turkish Lira
+	// - \u20B9 - Indian Rupee
+	// - R - Brazil (R$) and South Africa
+	// - fr - Swiss Franc
+	// - kr - Swedish krona, Norwegian krone and Danish krone
+	// - \u2009 is thin space and \u202F is narrow no-break space, both used in many
+	//   standards as thousands separators.
+	var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi;
+	
+	
+	var _empty = function ( d ) {
+		return !d || d === true || d === '-' ? true : false;
+	};
+	
+	
+	var _intVal = function ( s ) {
+		var integer = parseInt( s, 10 );
+		return !isNaN(integer) && isFinite(s) ? integer : null;
+	};
+	
+	// Convert from a formatted number with characters other than `.` as the
+	// decimal place, to a Javascript number
+	var _numToDecimal = function ( num, decimalPoint ) {
+		// Cache created regular expressions for speed as this function is called often
+		if ( ! _re_dic[ decimalPoint ] ) {
+			_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
 		}
-		
-		
-		
-		/**
-		 * Generate the node required for filtering text
-		 *  @returns {node} Filter control element
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFeatureHtmlFilter ( oSettings )
-		{
-			var oPreviousSearch = oSettings.oPreviousSearch;
-			
-			var sSearchStr = oSettings.oLanguage.sSearch;
-			sSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ?
-			  sSearchStr.replace('_INPUT_', '<input type="text" />') :
-			  sSearchStr==="" ? '<input type="text" />' : sSearchStr+' <input type="text" />';
-			
-			var nFilter = document.createElement( 'div' );
-			nFilter.className = oSettings.oClasses.sFilter;
-			nFilter.innerHTML = '<label>'+sSearchStr+'</label>';
-			if ( !oSettings.aanFeatures.f )
-			{
-				nFilter.id = oSettings.sTableId+'_filter';
+		return typeof num === 'string' && decimalPoint !== '.' ?
+			num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
+			num;
+	};
+	
+	
+	var _isNumber = function ( d, decimalPoint, formatted ) {
+		var strType = typeof d === 'string';
+	
+		// If empty return immediately so there must be a number if it is a
+		// formatted string (this stops the string "k", or "kr", etc being detected
+		// as a formatted number for currency
+		if ( _empty( d ) ) {
+			return true;
+		}
+	
+		if ( decimalPoint && strType ) {
+			d = _numToDecimal( d, decimalPoint );
+		}
+	
+		if ( formatted && strType ) {
+			d = d.replace( _re_formatted_numeric, '' );
+		}
+	
+		return !isNaN( parseFloat(d) ) && isFinite( d );
+	};
+	
+	
+	// A string without HTML in it can be considered to be HTML still
+	var _isHtml = function ( d ) {
+		return _empty( d ) || typeof d === 'string';
+	};
+	
+	
+	var _htmlNumeric = function ( d, decimalPoint, formatted ) {
+		if ( _empty( d ) ) {
+			return true;
+		}
+	
+		var html = _isHtml( d );
+		return ! html ?
+			null :
+			_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
+				true :
+				null;
+	};
+	
+	
+	var _pluck = function ( a, prop, prop2 ) {
+		var out = [];
+		var i=0, ien=a.length;
+	
+		// Could have the test in the loop for slightly smaller code, but speed
+		// is essential here
+		if ( prop2 !== undefined ) {
+			for ( ; i<ien ; i++ ) {
+				if ( a[i] && a[i][ prop ] ) {
+					out.push( a[i][ prop ][ prop2 ] );
+				}
 			}
-			
-			var jqFilter = $('input[type="text"]', nFilter);
-		
-			// Store a reference to the input element, so other input elements could be
-			// added to the filter wrapper if needed (submit button for example)
-			nFilter._DT_Input = jqFilter[0];
-		
-			jqFilter.val( oPreviousSearch.sSearch.replace('"','&quot;') );
-			jqFilter.bind( 'keyup.DT', function(e) {
-				/* Update all other filter input elements for the new display */
-				var n = oSettings.aanFeatures.f;
-				var val = this.value==="" ? "" : this.value; // mental IE8 fix :-(
-		
-				for ( var i=0, iLen=n.length ; i<iLen ; i++ )
-				{
-					if ( n[i] != $(this).parents('div.dataTables_filter')[0] )
-					{
-						$(n[i]._DT_Input).val( val );
-					}
+		}
+		else {
+			for ( ; i<ien ; i++ ) {
+				if ( a[i] ) {
+					out.push( a[i][ prop ] );
 				}
-				
-				/* Now do the filter */
-				if ( val != oPreviousSearch.sSearch )
-				{
-					_fnFilterComplete( oSettings, { 
-						"sSearch": val, 
-						"bRegex": oPreviousSearch.bRegex,
-						"bSmart": oPreviousSearch.bSmart ,
-						"bCaseInsensitive": oPreviousSearch.bCaseInsensitive 
-					} );
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	// Basically the same as _pluck, but rather than looping over `a` we use `order`
+	// as the indexes to pick from `a`
+	var _pluck_order = function ( a, order, prop, prop2 )
+	{
+		var out = [];
+		var i=0, ien=order.length;
+	
+		// Could have the test in the loop for slightly smaller code, but speed
+		// is essential here
+		if ( prop2 !== undefined ) {
+			for ( ; i<ien ; i++ ) {
+				if ( a[ order[i] ][ prop ] ) {
+					out.push( a[ order[i] ][ prop ][ prop2 ] );
 				}
-			} );
-		
-			jqFilter
-				.attr('aria-controls', oSettings.sTableId)
-				.bind( 'keypress.DT', function(e) {
-					/* Prevent form submission */
-					if ( e.keyCode == 13 )
-					{
-						return false;
-					}
+			}
+		}
+		else {
+			for ( ; i<ien ; i++ ) {
+				out.push( a[ order[i] ][ prop ] );
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	var _range = function ( len, start )
+	{
+		var out = [];
+		var end;
+	
+		if ( start === undefined ) {
+			start = 0;
+			end = len;
+		}
+		else {
+			end = start;
+			start = len;
+		}
+	
+		for ( var i=start ; i<end ; i++ ) {
+			out.push( i );
+		}
+	
+		return out;
+	};
+	
+	
+	var _removeEmpty = function ( a )
+	{
+		var out = [];
+	
+		for ( var i=0, ien=a.length ; i<ien ; i++ ) {
+			if ( a[i] ) { // careful - will remove all falsy values!
+				out.push( a[i] );
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	var _stripHtml = function ( d ) {
+		return d.replace( _re_html, '' );
+	};
+	
+	
+	/**
+	 * Find the unique elements in a source array.
+	 *
+	 * @param  {array} src Source array
+	 * @return {array} Array of unique items
+	 * @ignore
+	 */
+	var _unique = function ( src )
+	{
+		// A faster unique method is to use object keys to identify used values,
+		// but this doesn't work with arrays or objects, which we must also
+		// consider. See jsperf.com/compare-array-unique-versions/4 for more
+		// information.
+		var
+			out = [],
+			val,
+			i, ien=src.length,
+			j, k=0;
+	
+		again: for ( i=0 ; i<ien ; i++ ) {
+			val = src[i];
+	
+			for ( j=0 ; j<k ; j++ ) {
+				if ( out[j] === val ) {
+					continue again;
 				}
-			);
-			
-			return nFilter;
+			}
+	
+			out.push( val );
+			k++;
 		}
-		
-		
+	
+		return out;
+	};
+	
+	
+	/**
+	 * DataTables utility methods
+	 * 
+	 * This namespace provides helper methods that DataTables uses internally to
+	 * create a DataTable, but which are not exclusively used only for DataTables.
+	 * These methods can be used by extension authors to save the duplication of
+	 * code.
+	 *
+	 *  @namespace
+	 */
+	DataTable.util = {
 		/**
-		 * Filter the table using both the global filter and column based filtering
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {object} oSearch search information
-		 *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
-		 *  @memberof DataTable#oApi
+		 * Throttle the calls to a function. Arguments and context are maintained
+		 * for the throttled function.
+		 *
+		 * @param {function} fn Function to be called
+		 * @param {integer} freq Call frequency in mS
+		 * @return {function} Wrapped function
 		 */
-		function _fnFilterComplete ( oSettings, oInput, iForce )
-		{
-			var oPrevSearch = oSettings.oPreviousSearch;
-			var aoPrevSearch = oSettings.aoPreSearchCols;
-			var fnSaveFilter = function ( oFilter ) {
-				/* Save the filtering values */
-				oPrevSearch.sSearch = oFilter.sSearch;
-				oPrevSearch.bRegex = oFilter.bRegex;
-				oPrevSearch.bSmart = oFilter.bSmart;
-				oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
+		throttle: function ( fn, freq ) {
+			var
+				frequency = freq !== undefined ? freq : 200,
+				last,
+				timer;
+	
+			return function () {
+				var
+					that = this,
+					now  = +new Date(),
+					args = arguments;
+	
+				if ( last && now < last + frequency ) {
+					clearTimeout( timer );
+	
+					timer = setTimeout( function () {
+						last = undefined;
+						fn.apply( that, args );
+					}, frequency );
+				}
+				else {
+					last = now;
+					fn.apply( that, args );
+				}
 			};
-		
-			/* In server-side processing all filtering is done by the server, so no point hanging around here */
-			if ( !oSettings.oFeatures.bServerSide )
+		},
+	
+	
+		/**
+		 * Escape a string such that it can be used in a regular expression
+		 *
+		 *  @param {string} val string to escape
+		 *  @returns {string} escaped string
+		 */
+		escapeRegex: function ( val ) {
+			return val.replace( _re_escape_regex, '\\$1' );
+		}
+	};
+	
+	
+	
+	/**
+	 * Create a mapping object that allows camel case parameters to be looked up
+	 * for their Hungarian counterparts. The mapping is stored in a private
+	 * parameter called `_hungarianMap` which can be accessed on the source object.
+	 *  @param {object} o
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnHungarianMap ( o )
+	{
+		var
+			hungarian = 'a aa ai ao as b fn i m o s ',
+			match,
+			newKey,
+			map = {};
+	
+		$.each( o, function (key, val) {
+			match = key.match(/^([^A-Z]+?)([A-Z])/);
+	
+			if ( match && hungarian.indexOf(match[1]+' ') !== -1 )
 			{
-				/* Global filter */
-				_fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );
-				fnSaveFilter( oInput );
-		
-				/* Now do the individual column filter */
-				for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
+				newKey = key.replace( match[0], match[2].toLowerCase() );
+				map[ newKey ] = key;
+	
+				if ( match[1] === 'o' )
 				{
-					_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex, 
-						aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
+					_fnHungarianMap( o[key] );
 				}
-				
-				/* Custom filtering */
-				_fnFilterCustom( oSettings );
 			}
-			else
-			{
-				fnSaveFilter( oInput );
-			}
-			
-			/* Tell the draw function we have been filtering */
-			oSettings.bFiltered = true;
-			$(oSettings.oInstance).trigger('filter', oSettings);
-			
-			/* Redraw the table */
-			oSettings._iDisplayStart = 0;
-			_fnCalculateEnd( oSettings );
-			_fnDraw( oSettings );
-			
-			/* Rebuild search array 'offline' */
-			_fnBuildSearchArray( oSettings, 0 );
+		} );
+	
+		o._hungarianMap = map;
+	}
+	
+	
+	/**
+	 * Convert from camel case parameters to Hungarian, based on a Hungarian map
+	 * created by _fnHungarianMap.
+	 *  @param {object} src The model object which holds all parameters that can be
+	 *    mapped.
+	 *  @param {object} user The object to convert from camel case to Hungarian.
+	 *  @param {boolean} force When set to `true`, properties which already have a
+	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
+	 *    won't be.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCamelToHungarian ( src, user, force )
+	{
+		if ( ! src._hungarianMap ) {
+			_fnHungarianMap( src );
 		}
-		
-		
-		/**
-		 * Apply custom filtering functions
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFilterCustom( oSettings )
-		{
-			var afnFilters = DataTable.ext.afnFiltering;
-			var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
-		
-			for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
+	
+		var hungarianKey;
+	
+		$.each( user, function (key, val) {
+			hungarianKey = src._hungarianMap[ key ];
+	
+			if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )
 			{
-				var iCorrector = 0;
-				for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
+				// For objects, we need to buzz down into the object to copy parameters
+				if ( hungarianKey.charAt(0) === 'o' )
 				{
-					var iDisIndex = oSettings.aiDisplay[j-iCorrector];
-					var bTest = afnFilters[i](
-						oSettings,
-						_fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),
-						iDisIndex
-					);
-					
-					/* Check if we should use this row based on the filtering function */
-					if ( !bTest )
-					{
-						oSettings.aiDisplay.splice( j-iCorrector, 1 );
-						iCorrector++;
+					// Copy the camelCase options over to the hungarian
+					if ( ! user[ hungarianKey ] ) {
+						user[ hungarianKey ] = {};
 					}
+					$.extend( true, user[hungarianKey], user[key] );
+	
+					_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );
+				}
+				else {
+					user[hungarianKey] = user[ key ];
 				}
 			}
-		}
-		
-		
-		/**
-		 * Filter the table on a per-column basis
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {string} sInput string to filter on
-		 *  @param {int} iColumn column to filter
-		 *  @param {bool} bRegex treat search string as a regular expression or not
-		 *  @param {bool} bSmart use smart filtering or not
-		 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
-		 *  @memberof DataTable#oApi
+		} );
+	}
+	
+	
+	/**
+	 * Language compatibility - when certain options are given, and others aren't, we
+	 * need to duplicate the values over, in order to provide backwards compatibility
+	 * with older language files.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnLanguageCompat( lang )
+	{
+		var defaults = DataTable.defaults.oLanguage;
+		var zeroRecords = lang.sZeroRecords;
+	
+		/* Backwards compatibility - if there is no sEmptyTable given, then use the same as
+		 * sZeroRecords - assuming that is given.
 		 */
-		function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive )
+		if ( ! lang.sEmptyTable && zeroRecords &&
+			defaults.sEmptyTable === "No data available in table" )
 		{
-			if ( sInput === "" )
-			{
-				return;
-			}
-			
-			var iIndexCorrector = 0;
-			var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
-			
-			for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )
-			{
-				var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ),
-					oSettings.aoColumns[iColumn].sType );
-				if ( ! rpSearch.test( sData ) )
-				{
-					oSettings.aiDisplay.splice( i, 1 );
-					iIndexCorrector++;
-				}
-			}
+			_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
 		}
-		
-		
-		/**
-		 * Filter the data table based on user input and draw the table
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {string} sInput string to filter on
-		 *  @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0)
-		 *  @param {bool} bRegex treat as a regular expression or not
-		 *  @param {bool} bSmart perform smart filtering or not
-		 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive )
+	
+		/* Likewise with loading records */
+		if ( ! lang.sLoadingRecords && zeroRecords &&
+			defaults.sLoadingRecords === "Loading..." )
 		{
-			var i;
-			var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
-			var oPrevSearch = oSettings.oPreviousSearch;
-			
-			/* Check if we are forcing or not - optional parameter */
-			if ( !iForce )
-			{
-				iForce = 0;
-			}
-			
-			/* Need to take account of custom filtering functions - always filter */
-			if ( DataTable.ext.afnFiltering.length !== 0 )
-			{
-				iForce = 1;
-			}
-			
-			/*
-			 * If the input is blank - we want the full data set
-			 */
-			if ( sInput.length <= 0 )
-			{
-				oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
-				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-			}
-			else
-			{
-				/*
-				 * We are starting a new search or the new search string is smaller 
-				 * then the old one (i.e. delete). Search from the master array
-			 	 */
-				if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
-					   oPrevSearch.sSearch.length > sInput.length || iForce == 1 ||
-					   sInput.indexOf(oPrevSearch.sSearch) !== 0 )
-				{
-					/* Nuke the old display array - we are going to rebuild it */
-					oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
-					
-					/* Force a rebuild of the search array */
-					_fnBuildSearchArray( oSettings, 1 );
-					
-					/* Search through all records to populate the search array
-					 * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 
-					 * mapping
-					 */
-					for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
-					{
-						if ( rpSearch.test(oSettings.asDataSearch[i]) )
-						{
-							oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
-						}
-					}
-			  }
-			  else
-				{
-			  	/* Using old search array - refine it - do it this way for speed
-			  	 * Don't have to search the whole master array again
-					 */
-			  	var iIndexCorrector = 0;
-			  	
-			  	/* Search the current results */
-			  	for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
-					{
-			  		if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
-						{
-			  			oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
-			  			iIndexCorrector++;
-			  		}
-			  	}
-			  }
-			}
+			_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
 		}
-		
-		
-		/**
-		 * Create an array which can be quickly search through
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iMaster use the master data array - optional
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnBuildSearchArray ( oSettings, iMaster )
-		{
-			if ( !oSettings.oFeatures.bServerSide )
-			{
-				/* Clear out the old data */
-				oSettings.asDataSearch = [];
-		
-				var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
-				var aiIndex = (iMaster===1) ?
-				 	oSettings.aiDisplayMaster :
-				 	oSettings.aiDisplay;
-				
-				for ( var i=0, iLen=aiIndex.length ; i<iLen ; i++ )
-				{
-					oSettings.asDataSearch[i] = _fnBuildSearchRow(
-						oSettings,
-						_fnGetRowData( oSettings, aiIndex[i], 'filter', aiFilterColumns )
-					);
+	
+		// Old parameter name of the thousands separator mapped onto the new
+		if ( lang.sInfoThousands ) {
+			lang.sThousands = lang.sInfoThousands;
+		}
+	
+		var decimal = lang.sDecimal;
+		if ( decimal ) {
+			_addNumericSort( decimal );
+		}
+	}
+	
+	
+	/**
+	 * Map one parameter onto another
+	 *  @param {object} o Object to map
+	 *  @param {*} knew The new parameter name
+	 *  @param {*} old The old parameter name
+	 */
+	var _fnCompatMap = function ( o, knew, old ) {
+		if ( o[ knew ] !== undefined ) {
+			o[ old ] = o[ knew ];
+		}
+	};
+	
+	
+	/**
+	 * Provide backwards compatibility for the main DT options. Note that the new
+	 * options are mapped onto the old parameters, so this is an external interface
+	 * change only.
+	 *  @param {object} init Object to map
+	 */
+	function _fnCompatOpts ( init )
+	{
+		_fnCompatMap( init, 'ordering',      'bSort' );
+		_fnCompatMap( init, 'orderMulti',    'bSortMulti' );
+		_fnCompatMap( init, 'orderClasses',  'bSortClasses' );
+		_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );
+		_fnCompatMap( init, 'order',         'aaSorting' );
+		_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );
+		_fnCompatMap( init, 'paging',        'bPaginate' );
+		_fnCompatMap( init, 'pagingType',    'sPaginationType' );
+		_fnCompatMap( init, 'pageLength',    'iDisplayLength' );
+		_fnCompatMap( init, 'searching',     'bFilter' );
+	
+		// Boolean initialisation of x-scrolling
+		if ( typeof init.sScrollX === 'boolean' ) {
+			init.sScrollX = init.sScrollX ? '100%' : '';
+		}
+		if ( typeof init.scrollX === 'boolean' ) {
+			init.scrollX = init.scrollX ? '100%' : '';
+		}
+	
+		// Column search objects are in an array, so it needs to be converted
+		// element by element
+		var searchCols = init.aoSearchCols;
+	
+		if ( searchCols ) {
+			for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {
+				if ( searchCols[i] ) {
+					_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );
 				}
 			}
 		}
-		
-		
-		/**
-		 * Create a searchable string from a single data row
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {array} aData Row data array to use for the data to search
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnBuildSearchRow( oSettings, aData )
-		{
-			var sSearch = aData.join('  ');
-			
-			/* If it looks like there is an HTML entity in the string, attempt to decode it */
-			if ( sSearch.indexOf('&') !== -1 )
-			{
-				sSearch = $('<div>').html(sSearch).text();
-			}
-			
-			// Strip newline characters
-			return sSearch.replace( /[\n\r]/g, " " );
+	}
+	
+	
+	/**
+	 * Provide backwards compatibility for column options. Note that the new options
+	 * are mapped onto the old parameters, so this is an external interface change
+	 * only.
+	 *  @param {object} init Object to map
+	 */
+	function _fnCompatCols ( init )
+	{
+		_fnCompatMap( init, 'orderable',     'bSortable' );
+		_fnCompatMap( init, 'orderData',     'aDataSort' );
+		_fnCompatMap( init, 'orderSequence', 'asSorting' );
+		_fnCompatMap( init, 'orderDataType', 'sortDataType' );
+	
+		// orderData can be given as an integer
+		var dataSort = init.aDataSort;
+		if ( dataSort && ! $.isArray( dataSort ) ) {
+			init.aDataSort = [ dataSort ];
 		}
-		
-		/**
-		 * Build a regular expression object suitable for searching a table
-		 *  @param {string} sSearch string to search for
-		 *  @param {bool} bRegex treat as a regular expression or not
-		 *  @param {bool} bSmart perform smart filtering or not
-		 *  @param {bool} bCaseInsensitive Do case insensitive matching or not
-		 *  @returns {RegExp} constructed object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive )
-		{
-			var asSearch, sRegExpString;
-			
-			if ( bSmart )
-			{
-				/* Generate the regular expression to use. Something along the lines of:
-				 * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
-				 */
-				asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );
-				sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
-				return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" );
+	}
+	
+	
+	/**
+	 * Browser feature detection for capabilities, quirks
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnBrowserDetect( settings )
+	{
+		// We don't need to do this every time DataTables is constructed, the values
+		// calculated are specific to the browser and OS configuration which we
+		// don't expect to change between initialisations
+		if ( ! DataTable.__browser ) {
+			var browser = {};
+			DataTable.__browser = browser;
+	
+			// Scrolling feature / quirks detection
+			var n = $('<div/>')
+				.css( {
+					position: 'fixed',
+					top: 0,
+					left: 0,
+					height: 1,
+					width: 1,
+					overflow: 'hidden'
+				} )
+				.append(
+					$('<div/>')
+						.css( {
+							position: 'absolute',
+							top: 1,
+							left: 1,
+							width: 100,
+							overflow: 'scroll'
+						} )
+						.append(
+							$('<div/>')
+								.css( {
+									width: '100%',
+									height: 10
+								} )
+						)
+				)
+				.appendTo( 'body' );
+	
+			var outer = n.children();
+			var inner = outer.children();
+	
+			// Numbers below, in order, are:
+			// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
+			//
+			// IE6 XP:                           100 100 100  83
+			// IE7 Vista:                        100 100 100  83
+			// IE 8+ Windows:                     83  83 100  83
+			// Evergreen Windows:                 83  83 100  83
+			// Evergreen Mac with scrollbars:     85  85 100  85
+			// Evergreen Mac without scrollbars: 100 100 100 100
+	
+			// Get scrollbar width
+			browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
+	
+			// IE6/7 will oversize a width 100% element inside a scrolling element, to
+			// include the width of the scrollbar, while other browsers ensure the inner
+			// element is contained without forcing scrolling
+			browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
+	
+			// In rtl text layout, some browsers (most, but not all) will place the
+			// scrollbar on the left, rather than the right.
+			browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;
+	
+			// IE8- don't provide height and width for getBoundingClientRect
+			browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
+	
+			n.remove();
+		}
+	
+		$.extend( settings.oBrowser, DataTable.__browser );
+		settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
+	}
+	
+	
+	/**
+	 * Array.prototype reduce[Right] method, used for browsers which don't support
+	 * JS 1.6. Done this way to reduce code size, since we iterate either way
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnReduce ( that, fn, init, start, end, inc )
+	{
+		var
+			i = start,
+			value,
+			isSet = false;
+	
+		if ( init !== undefined ) {
+			value = init;
+			isSet = true;
+		}
+	
+		while ( i !== end ) {
+			if ( ! that.hasOwnProperty(i) ) {
+				continue;
 			}
-			else
-			{
-				sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );
-				return new RegExp( sSearch, bCaseInsensitive ? "i" : "" );
+	
+			value = isSet ?
+				fn( value, that[i], i, that ) :
+				that[i];
+	
+			isSet = true;
+			i += inc;
+		}
+	
+		return value;
+	}
+	
+	/**
+	 * Add a column to the list used for the table with default values
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} nTh The th element for this column
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddColumn( oSettings, nTh )
+	{
+		// Add column to aoColumns array
+		var oDefaults = DataTable.defaults.column;
+		var iCol = oSettings.aoColumns.length;
+		var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
+			"nTh": nTh ? nTh : document.createElement('th'),
+			"sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
+			"aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
+			"mData": oDefaults.mData ? oDefaults.mData : iCol,
+			idx: iCol
+		} );
+		oSettings.aoColumns.push( oCol );
+	
+		// Add search object for column specific search. Note that the `searchCols[ iCol ]`
+		// passed into extend can be undefined. This allows the user to give a default
+		// with only some of the parameters defined, and also not give a default
+		var searchCols = oSettings.aoPreSearchCols;
+		searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
+	
+		// Use the default column options function to initialise classes etc
+		_fnColumnOptions( oSettings, iCol, $(nTh).data() );
+	}
+	
+	
+	/**
+	 * Apply options for a column
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iCol column index to consider
+	 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnOptions( oSettings, iCol, oOptions )
+	{
+		var oCol = oSettings.aoColumns[ iCol ];
+		var oClasses = oSettings.oClasses;
+		var th = $(oCol.nTh);
+	
+		// Try to get width information from the DOM. We can't get it from CSS
+		// as we'd need to parse the CSS stylesheet. `width` option can override
+		if ( ! oCol.sWidthOrig ) {
+			// Width attribute
+			oCol.sWidthOrig = th.attr('width') || null;
+	
+			// Style attribute
+			var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
+			if ( t ) {
+				oCol.sWidthOrig = t[1];
 			}
 		}
-		
-		
-		/**
-		 * Convert raw data into something that the user can search on
-		 *  @param {string} sData data to be modified
-		 *  @param {string} sType data type
-		 *  @returns {string} search string
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnDataToSearch ( sData, sType )
+	
+		/* User specified column options */
+		if ( oOptions !== undefined && oOptions !== null )
 		{
-			if ( typeof DataTable.ext.ofnSearch[sType] === "function" )
+			// Backwards compatibility
+			_fnCompatCols( oOptions );
+	
+			// Map camel case parameters to their Hungarian counterparts
+			_fnCamelToHungarian( DataTable.defaults.column, oOptions );
+	
+			/* Backwards compatibility for mDataProp */
+			if ( oOptions.mDataProp !== undefined && !oOptions.mData )
 			{
-				return DataTable.ext.ofnSearch[sType]( sData );
+				oOptions.mData = oOptions.mDataProp;
 			}
-			else if ( sData === null )
+	
+			if ( oOptions.sType )
 			{
-				return '';
+				oCol._sManualType = oOptions.sType;
 			}
-			else if ( sType == "html" )
+	
+			// `class` is a reserved word in Javascript, so we need to provide
+			// the ability to use a valid name for the camel case input
+			if ( oOptions.className && ! oOptions.sClass )
 			{
-				return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" );
+				oOptions.sClass = oOptions.className;
 			}
-			else if ( typeof sData === "string" )
+	
+			$.extend( oCol, oOptions );
+			_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+	
+			/* iDataSort to be applied (backwards compatibility), but aDataSort will take
+			 * priority if defined
+			 */
+			if ( oOptions.iDataSort !== undefined )
 			{
-				return sData.replace(/[\r\n]/g," ");
+				oCol.aDataSort = [ oOptions.iDataSort ];
 			}
-			return sData;
+			_fnMap( oCol, oOptions, "aDataSort" );
 		}
-		
-		
-		/**
-		 * scape a string such that it can be used in a regular expression
-		 *  @param {string} sVal string to escape
-		 *  @returns {string} escaped string
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnEscapeRegex ( sVal )
-		{
-			var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ];
-			var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
-			return sVal.replace(reReplace, '\\$1');
+	
+		/* Cache the data get and set functions for speed */
+		var mDataSrc = oCol.mData;
+		var mData = _fnGetObjectDataFn( mDataSrc );
+		var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
+	
+		var attrTest = function( src ) {
+			return typeof src === 'string' && src.indexOf('@') !== -1;
+		};
+		oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
+			attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
+		);
+		oCol._setter = null;
+	
+		oCol.fnGetData = function (rowData, type, meta) {
+			var innerData = mData( rowData, type, undefined, meta );
+	
+			return mRender && type ?
+				mRender( innerData, type, rowData, meta ) :
+				innerData;
+		};
+		oCol.fnSetData = function ( rowData, val, meta ) {
+			return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
+		};
+	
+		// Indicate if DataTables should read DOM data as an object or array
+		// Used in _fnGetRowElements
+		if ( typeof mDataSrc !== 'number' ) {
+			oSettings._rowReadObject = true;
 		}
-		
-		
-		/**
-		 * Generate the node required for the info display
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {node} Information element
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFeatureHtmlInfo ( oSettings )
+	
+		/* Feature sorting overrides column specific when off */
+		if ( !oSettings.oFeatures.bSort )
 		{
-			var nInfo = document.createElement( 'div' );
-			nInfo.className = oSettings.oClasses.sInfo;
-			
-			/* Actions that are to be taken once only for this feature */
-			if ( !oSettings.aanFeatures.i )
-			{
-				/* Add draw callback */
-				oSettings.aoDrawCallback.push( {
-					"fn": _fnUpdateInfo,
-					"sName": "information"
-				} );
-				
-				/* Add id */
-				nInfo.id = oSettings.sTableId+'_info';
-			}
-			oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' );
-			
-			return nInfo;
+			oCol.bSortable = false;
+			th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
 		}
-		
-		
-		/**
-		 * Update the information elements in the display
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnUpdateInfo ( oSettings )
+	
+		/* Check that the class assignment is correct for sorting */
+		var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
+		var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
+		if ( !oCol.bSortable || (!bAsc && !bDesc) )
 		{
-			/* Show information about the table */
-			if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 )
-			{
-				return;
-			}
-			
-			var
-				oLang = oSettings.oLanguage,
-				iStart = oSettings._iDisplayStart+1,
-				iEnd = oSettings.fnDisplayEnd(),
-				iMax = oSettings.fnRecordsTotal(),
-				iTotal = oSettings.fnRecordsDisplay(),
-				sOut;
-			
-			if ( iTotal === 0 )
-			{
-				/* Empty record set */
-				sOut = oLang.sInfoEmpty;
-			}
-			else {
-				/* Normal record set */
-				sOut = oLang.sInfo;
-			}
-		
-			if ( iTotal != iMax )
-			{
-				/* Record set after filtering */
-				sOut += ' ' + oLang.sInfoFiltered;
-			}
-		
-			// Convert the macros
-			sOut += oLang.sInfoPostFix;
-			sOut = _fnInfoMacros( oSettings, sOut );
-			
-			if ( oLang.fnInfoCallback !== null )
-			{
-				sOut = oLang.fnInfoCallback.call( oSettings.oInstance, 
-					oSettings, iStart, iEnd, iMax, iTotal, sOut );
-			}
-			
-			var n = oSettings.aanFeatures.i;
-			for ( var i=0, iLen=n.length ; i<iLen ; i++ )
-			{
-				$(n[i]).html( sOut );
-			}
+			oCol.sSortingClass = oClasses.sSortableNone;
+			oCol.sSortingClassJUI = "";
 		}
-		
-		
-		function _fnInfoMacros ( oSettings, str )
+		else if ( bAsc && !bDesc )
 		{
-			var
-				iStart = oSettings._iDisplayStart+1,
-				sStart = oSettings.fnFormatNumber( iStart ),
-				iEnd = oSettings.fnDisplayEnd(),
-				sEnd = oSettings.fnFormatNumber( iEnd ),
-				iTotal = oSettings.fnRecordsDisplay(),
-				sTotal = oSettings.fnFormatNumber( iTotal ),
-				iMax = oSettings.fnRecordsTotal(),
-				sMax = oSettings.fnFormatNumber( iMax );
-		
-			// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
-			// internally
-			if ( oSettings.oScroll.bInfinite )
-			{
-				sStart = oSettings.fnFormatNumber( 1 );
-			}
-		
-			return str.
-				replace(/_START_/g, sStart).
-				replace(/_END_/g,   sEnd).
-				replace(/_TOTAL_/g, sTotal).
-				replace(/_MAX_/g,   sMax);
+			oCol.sSortingClass = oClasses.sSortableAsc;
+			oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
 		}
-		
-		
-		
-		/**
-		 * Draw the table for the first time, adding all required features
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnInitialise ( oSettings )
+		else if ( !bAsc && bDesc )
 		{
-			var i, iLen, iAjaxStart=oSettings.iInitDisplayStart;
-			
-			/* Ensure that the table data is fully initialised */
-			if ( oSettings.bInitialised === false )
-			{
-				setTimeout( function(){ _fnInitialise( oSettings ); }, 200 );
-				return;
-			}
-			
-			/* Show the display HTML options */
-			_fnAddOptionsHtml( oSettings );
-			
-			/* Build and draw the header / footer for the table */
-			_fnBuildHead( oSettings );
-			_fnDrawHead( oSettings, oSettings.aoHeader );
-			if ( oSettings.nTFoot )
-			{
-				_fnDrawHead( oSettings, oSettings.aoFooter );
-			}
-		
-			/* Okay to show that something is going on now */
-			_fnProcessingDisplay( oSettings, true );
-			
-			/* Calculate sizes for columns */
-			if ( oSettings.oFeatures.bAutoWidth )
-			{
-				_fnCalculateColumnWidths( oSettings );
-			}
-			
-			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				if ( oSettings.aoColumns[i].sWidth !== null )
-				{
-					oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );
-				}
-			}
-			
-			/* If there is default sorting required - let's do it. The sort function will do the
-			 * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows
-			 * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)
-			 */
-			if ( oSettings.oFeatures.bSort )
-			{
-				_fnSort( oSettings );
-			}
-			else if ( oSettings.oFeatures.bFilter )
-			{
-				_fnFilterComplete( oSettings, oSettings.oPreviousSearch );
-			}
-			else
-			{
-				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-				_fnCalculateEnd( oSettings );
-				_fnDraw( oSettings );
-			}
-			
-			/* if there is an ajax source load the data */
-			if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
-			{
-				var aoData = [];
-				_fnServerParams( oSettings, aoData );
-				oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) {
-					var aData = (oSettings.sAjaxDataProp !== "") ?
-					 	_fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json;
-		
-					/* Got the data - add it to the table */
-					for ( i=0 ; i<aData.length ; i++ )
-					{
-						_fnAddData( oSettings, aData[i] );
-					}
-					
-					/* Reset the init display for cookie saving. We've already done a filter, and
-					 * therefore cleared it before. So we need to make it appear 'fresh'
-					 */
-					oSettings.iInitDisplayStart = iAjaxStart;
-					
-					if ( oSettings.oFeatures.bSort )
-					{
-						_fnSort( oSettings );
-					}
-					else
-					{
-						oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-						_fnCalculateEnd( oSettings );
-						_fnDraw( oSettings );
-					}
-					
-					_fnProcessingDisplay( oSettings, false );
-					_fnInitComplete( oSettings, json );
-				}, oSettings );
-				return;
-			}
-			
-			/* Server-side processing initialisation complete is done at the end of _fnDraw */
-			if ( !oSettings.oFeatures.bServerSide )
-			{
-				_fnProcessingDisplay( oSettings, false );
-				_fnInitComplete( oSettings );
-			}
+			oCol.sSortingClass = oClasses.sSortableDesc;
+			oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
 		}
-		
-		
-		/**
-		 * Draw the table for the first time, adding all required features
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
-		 *    with client-side processing (optional)
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnInitComplete ( oSettings, json )
+		else
 		{
-			oSettings._bInitComplete = true;
-			_fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] );
+			oCol.sSortingClass = oClasses.sSortable;
+			oCol.sSortingClassJUI = oClasses.sSortJUI;
 		}
-		
-		
-		/**
-		 * Language compatibility - when certain options are given, and others aren't, we
-		 * need to duplicate the values over, in order to provide backwards compatibility
-		 * with older language files.
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnLanguageCompat( oLanguage )
+	}
+	
+	
+	/**
+	 * Adjust the table column widths for new data. Note: you would probably want to
+	 * do a redraw after calling this function!
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAdjustColumnSizing ( settings )
+	{
+		/* Not interested in doing column width calculation if auto-width is disabled */
+		if ( settings.oFeatures.bAutoWidth !== false )
 		{
-			var oDefaults = DataTable.defaults.oLanguage;
-		
-			/* Backwards compatibility - if there is no sEmptyTable given, then use the same as
-			 * sZeroRecords - assuming that is given.
-			 */
-			if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords &&
-				oDefaults.sEmptyTable === "No data available in table" )
-			{
-				_fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
-			}
-		
-			/* Likewise with loading records */
-			if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords &&
-				oDefaults.sLoadingRecords === "Loading..." )
+			var columns = settings.aoColumns;
+	
+			_fnCalculateColumnWidths( settings );
+			for ( var i=0 , iLen=columns.length ; i<iLen ; i++ )
 			{
-				_fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );
+				columns[i].nTh.style.width = columns[i].sWidth;
 			}
 		}
-		
-		
-		
-		/**
-		 * Generate the node required for user display length changing
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {node} Display length feature node
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFeatureHtmlLength ( oSettings )
+	
+		var scroll = settings.oScroll;
+		if ( scroll.sY !== '' || scroll.sX !== '')
 		{
-			if ( oSettings.oScroll.bInfinite )
-			{
-				return null;
-			}
-			
-			/* This can be overruled by not using the _MENU_ var/macro in the language variable */
-			var sName = 'name="'+oSettings.sTableId+'_length"';
-			var sStdMenu = '<select size="1" '+sName+'>';
-			var i, iLen;
-			var aLengthMenu = oSettings.aLengthMenu;
-			
-			if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && 
-					typeof aLengthMenu[1] === 'object' )
-			{
-				for ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ )
-				{
-					sStdMenu += '<option value="'+aLengthMenu[0][i]+'">'+aLengthMenu[1][i]+'</option>';
-				}
-			}
-			else
-			{
-				for ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ )
-				{
-					sStdMenu += '<option value="'+aLengthMenu[i]+'">'+aLengthMenu[i]+'</option>';
-				}
+			_fnScrollDraw( settings );
+		}
+	
+		_fnCallbackFire( settings, null, 'column-sizing', [settings] );
+	}
+	
+	
+	/**
+	 * Covert the index of a visible column to the index in the data array (take account
+	 * of hidden columns)
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iMatch Visible column index to lookup
+	 *  @returns {int} i the data index
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnVisibleToColumnIndex( oSettings, iMatch )
+	{
+		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+	
+		return typeof aiVis[iMatch] === 'number' ?
+			aiVis[iMatch] :
+			null;
+	}
+	
+	
+	/**
+	 * Covert the index of an index in the data array and convert it to the visible
+	 *   column index (take account of hidden columns)
+	 *  @param {int} iMatch Column index to lookup
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {int} i the data index
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnIndexToVisible( oSettings, iMatch )
+	{
+		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+		var iPos = $.inArray( iMatch, aiVis );
+	
+		return iPos !== -1 ? iPos : null;
+	}
+	
+	
+	/**
+	 * Get the number of visible columns
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {int} i the number of visible columns
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnVisbleColumns( oSettings )
+	{
+		var vis = 0;
+	
+		// No reduce in IE8, use a loop for now
+		$.each( oSettings.aoColumns, function ( i, col ) {
+			if ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {
+				vis++;
 			}
-			sStdMenu += '</select>';
-			
-			var nLength = document.createElement( 'div' );
-			if ( !oSettings.aanFeatures.l )
-			{
-				nLength.id = oSettings.sTableId+'_length';
+		} );
+	
+		return vis;
+	}
+	
+	
+	/**
+	 * Get an array of column indexes that match a given property
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {string} sParam Parameter in aoColumns to look for - typically
+	 *    bVisible or bSearchable
+	 *  @returns {array} Array of indexes with matched properties
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetColumns( oSettings, sParam )
+	{
+		var a = [];
+	
+		$.map( oSettings.aoColumns, function(val, i) {
+			if ( val[sParam] ) {
+				a.push( i );
 			}
-			nLength.className = oSettings.oClasses.sLength;
-			nLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>';
-			
-			/*
-			 * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
-			 * and Stefan Skopnik for fixing the fix!
-			 */
-			$('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true);
-			
-			$('select', nLength).bind( 'change.DT', function(e) {
-				var iVal = $(this).val();
-				
-				/* Update all other length options for the new display */
-				var n = oSettings.aanFeatures.l;
-				for ( i=0, iLen=n.length ; i<iLen ; i++ )
-				{
-					if ( n[i] != this.parentNode )
-					{
-						$('select', n[i]).val( iVal );
+		} );
+	
+		return a;
+	}
+	
+	
+	/**
+	 * Calculate the 'type' of a column
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnTypes ( settings )
+	{
+		var columns = settings.aoColumns;
+		var data = settings.aoData;
+		var types = DataTable.ext.type.detect;
+		var i, ien, j, jen, k, ken;
+		var col, cell, detectedType, cache;
+	
+		// For each column, spin over the 
+		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
+			col = columns[i];
+			cache = [];
+	
+			if ( ! col.sType && col._sManualType ) {
+				col.sType = col._sManualType;
+			}
+			else if ( ! col.sType ) {
+				for ( j=0, jen=types.length ; j<jen ; j++ ) {
+					for ( k=0, ken=data.length ; k<ken ; k++ ) {
+						// Use a cache array so we only need to get the type data
+						// from the formatter once (when using multiple detectors)
+						if ( cache[k] === undefined ) {
+							cache[k] = _fnGetCellData( settings, k, i, 'type' );
+						}
+	
+						detectedType = types[j]( cache[k], settings );
+	
+						// If null, then this type can't apply to this column, so
+						// rather than testing all cells, break out. There is an
+						// exception for the last type which is `html`. We need to
+						// scan all rows since it is possible to mix string and HTML
+						// types
+						if ( ! detectedType && j !== types.length-1 ) {
+							break;
+						}
+	
+						// Only a single match is needed for html type since it is
+						// bottom of the pile and very similar to string
+						if ( detectedType === 'html' ) {
+							break;
+						}
 					}
-				}
-				
-				/* Redraw the table */
-				oSettings._iDisplayLength = parseInt(iVal, 10);
-				_fnCalculateEnd( oSettings );
-				
-				/* If we have space to show extra rows (backing up from the end point - then do so */
-				if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )
-				{
-					oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
-					if ( oSettings._iDisplayStart < 0 )
-					{
-						oSettings._iDisplayStart = 0;
+	
+					// Type is valid for all data points in the column - use this
+					// type
+					if ( detectedType ) {
+						col.sType = detectedType;
+						break;
 					}
 				}
-				
-				if ( oSettings._iDisplayLength == -1 )
-				{
-					oSettings._iDisplayStart = 0;
-				}
-				
-				_fnDraw( oSettings );
-			} );
-		
-		
-			$('select', nLength).attr('aria-controls', oSettings.sTableId);
-			
-			return nLength;
-		}
-		
-		
-		/**
-		 * Recalculate the end point based on the start point
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnCalculateEnd( oSettings )
-		{
-			if ( oSettings.oFeatures.bPaginate === false )
-			{
-				oSettings._iDisplayEnd = oSettings.aiDisplay.length;
-			}
-			else
-			{
-				/* Set the end point of the display - based on how many elements there are
-				 * still to display
-				 */
-				if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
-					   oSettings._iDisplayLength == -1 )
-				{
-					oSettings._iDisplayEnd = oSettings.aiDisplay.length;
-				}
-				else
-				{
-					oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
-				}
-			}
-		}
-		
-		
-		
-		/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-		 * Note that most of the paging logic is done in 
-		 * DataTable.ext.oPagination
-		 */
-		
-		/**
-		 * Generate the node required for default pagination
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {node} Pagination feature node
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFeatureHtmlPaginate ( oSettings )
-		{
-			if ( oSettings.oScroll.bInfinite )
-			{
-				return null;
-			}
-			
-			var nPaginate = document.createElement( 'div' );
-			nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
-			
-			DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, 
-				function( oSettings ) {
-					_fnCalculateEnd( oSettings );
-					_fnDraw( oSettings );
+	
+				// Fall back - if no type was detected, always use string
+				if ( ! col.sType ) {
+					col.sType = 'string';
 				}
-			);
-			
-			/* Add a draw callback for the pagination on first instance, to update the paging display */
-			if ( !oSettings.aanFeatures.p )
-			{
-				oSettings.aoDrawCallback.push( {
-					"fn": function( oSettings ) {
-						DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
-							_fnCalculateEnd( oSettings );
-							_fnDraw( oSettings );
-						} );
-					},
-					"sName": "pagination"
-				} );
 			}
-			return nPaginate;
 		}
-		
-		
-		/**
-		 * Alter the display settings to change the page
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
-		 *    or page number to jump to (integer)
-		 *  @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnPageChange ( oSettings, mAction )
+	}
+	
+	
+	/**
+	 * Take the column definitions and static columns arrays and calculate how
+	 * they relate to column indexes. The callback function will then apply the
+	 * definition found for a column to a suitable configuration object.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
+	 *  @param {array} aoCols The aoColumns array that defines columns individually
+	 *  @param {function} fn Callback function - takes two parameters, the calculated
+	 *    column index and the definition for that column.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
+	{
+		var i, iLen, j, jLen, k, kLen, def;
+		var columns = oSettings.aoColumns;
+	
+		// Column definitions with aTargets
+		if ( aoColDefs )
 		{
-			var iOldStart = oSettings._iDisplayStart;
-			
-			if ( typeof mAction === "number" )
-			{
-				oSettings._iDisplayStart = mAction * oSettings._iDisplayLength;
-				if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() )
-				{
-					oSettings._iDisplayStart = 0;
-				}
-			}
-			else if ( mAction == "first" )
-			{
-				oSettings._iDisplayStart = 0;
-			}
-			else if ( mAction == "previous" )
+			/* Loop over the definitions array - loop in reverse so first instance has priority */
+			for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
 			{
-				oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
-					oSettings._iDisplayStart - oSettings._iDisplayLength :
-					0;
-				
-				/* Correct for under-run */
-				if ( oSettings._iDisplayStart < 0 )
+				def = aoColDefs[i];
+	
+				/* Each definition can target multiple columns, as it is an array */
+				var aTargets = def.targets !== undefined ?
+					def.targets :
+					def.aTargets;
+	
+				if ( ! $.isArray( aTargets ) )
 				{
-				  oSettings._iDisplayStart = 0;
+					aTargets = [ aTargets ];
 				}
-			}
-			else if ( mAction == "next" )
-			{
-				if ( oSettings._iDisplayLength >= 0 )
+	
+				for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
 				{
-					/* Make sure we are not over running the display array */
-					if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
+					if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
 					{
-						oSettings._iDisplayStart += oSettings._iDisplayLength;
+						/* Add columns that we don't yet know about */
+						while( columns.length <= aTargets[j] )
+						{
+							_fnAddColumn( oSettings );
+						}
+	
+						/* Integer, basic index */
+						fn( aTargets[j], def );
 					}
-				}
-				else
-				{
-					oSettings._iDisplayStart = 0;
-				}
-			}
-			else if ( mAction == "last" )
-			{
-				if ( oSettings._iDisplayLength >= 0 )
-				{
-					var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
-					oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
-				}
-				else
-				{
-					oSettings._iDisplayStart = 0;
-				}
-			}
-			else
-			{
-				_fnLog( oSettings, 0, "Unknown paging action: "+mAction );
-			}
-			$(oSettings.oInstance).trigger('page', oSettings);
-			
-			return iOldStart != oSettings._iDisplayStart;
-		}
-		
-		
-		
-		/**
-		 * Generate the node required for the processing node
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {node} Processing element
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFeatureHtmlProcessing ( oSettings )
-		{
-			var nProcessing = document.createElement( 'div' );
-			
-			if ( !oSettings.aanFeatures.r )
-			{
-				nProcessing.id = oSettings.sTableId+'_processing';
-			}
-			nProcessing.innerHTML = oSettings.oLanguage.sProcessing;
-			nProcessing.className = oSettings.oClasses.sProcessing;
-			oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );
-			
-			return nProcessing;
-		}
-		
-		
-		/**
-		 * Display or hide the processing indicator
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {bool} bShow Show the processing indicator (true) or not (false)
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnProcessingDisplay ( oSettings, bShow )
-		{
-			if ( oSettings.oFeatures.bProcessing )
-			{
-				var an = oSettings.aanFeatures.r;
-				for ( var i=0, iLen=an.length ; i<iLen ; i++ )
-				{
-					an[i].style.visibility = bShow ? "visible" : "hidden";
-				}
-			}
-		
-			$(oSettings.oInstance).trigger('processing', [oSettings, bShow]);
-		}
-		
-		/**
-		 * Add any control elements for the table - specifically scrolling
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {node} Node to add to the DOM
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnFeatureHtmlTable ( oSettings )
-		{
-			/* Check if scrolling is enabled or not - if not then leave the DOM unaltered */
-			if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
-			{
-				return oSettings.nTable;
-			}
-			
-			/*
-			 * The HTML structure that we want to generate in this function is:
-			 *  div - nScroller
-			 *    div - nScrollHead
-			 *      div - nScrollHeadInner
-			 *        table - nScrollHeadTable
-			 *          thead - nThead
-			 *    div - nScrollBody
-			 *      table - oSettings.nTable
-			 *        thead - nTheadSize
-			 *        tbody - nTbody
-			 *    div - nScrollFoot
-			 *      div - nScrollFootInner
-			 *        table - nScrollFootTable
-			 *          tfoot - nTfoot
-			 */
-			var
-			 	nScroller = document.createElement('div'),
-			 	nScrollHead = document.createElement('div'),
-			 	nScrollHeadInner = document.createElement('div'),
-			 	nScrollBody = document.createElement('div'),
-			 	nScrollFoot = document.createElement('div'),
-			 	nScrollFootInner = document.createElement('div'),
-			 	nScrollHeadTable = oSettings.nTable.cloneNode(false),
-			 	nScrollFootTable = oSettings.nTable.cloneNode(false),
-				nThead = oSettings.nTable.getElementsByTagName('thead')[0],
-			 	nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : 
-					oSettings.nTable.getElementsByTagName('tfoot')[0],
-				oClasses = oSettings.oClasses;
-			
-			nScrollHead.appendChild( nScrollHeadInner );
-			nScrollFoot.appendChild( nScrollFootInner );
-			nScrollBody.appendChild( oSettings.nTable );
-			nScroller.appendChild( nScrollHead );
-			nScroller.appendChild( nScrollBody );
-			nScrollHeadInner.appendChild( nScrollHeadTable );
-			nScrollHeadTable.appendChild( nThead );
-			if ( nTfoot !== null )
-			{
-				nScroller.appendChild( nScrollFoot );
-				nScrollFootInner.appendChild( nScrollFootTable );
-				nScrollFootTable.appendChild( nTfoot );
-			}
-			
-			nScroller.className = oClasses.sScrollWrapper;
-			nScrollHead.className = oClasses.sScrollHead;
-			nScrollHeadInner.className = oClasses.sScrollHeadInner;
-			nScrollBody.className = oClasses.sScrollBody;
-			nScrollFoot.className = oClasses.sScrollFoot;
-			nScrollFootInner.className = oClasses.sScrollFootInner;
-			
-			if ( oSettings.oScroll.bAutoCss )
-			{
-				nScrollHead.style.overflow = "hidden";
-				nScrollHead.style.position = "relative";
-				nScrollFoot.style.overflow = "hidden";
-				nScrollBody.style.overflow = "auto";
-			}
-			
-			nScrollHead.style.border = "0";
-			nScrollHead.style.width = "100%";
-			nScrollFoot.style.border = "0";
-			nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ?
-				oSettings.oScroll.sXInner : "100%"; /* will be overwritten */
-			
-			/* Modify attributes to respect the clones */
-			nScrollHeadTable.removeAttribute('id');
-			nScrollHeadTable.style.marginLeft = "0";
-			oSettings.nTable.style.marginLeft = "0";
-			if ( nTfoot !== null )
-			{
-				nScrollFootTable.removeAttribute('id');
-				nScrollFootTable.style.marginLeft = "0";
-			}
-			
-			/* Move caption elements from the body to the header, footer or leave where it is
-			 * depending on the configuration. Note that the DTD says there can be only one caption */
-			var nCaption = $(oSettings.nTable).children('caption');
-			if ( nCaption.length > 0 )
-			{
-				nCaption = nCaption[0];
-				if ( nCaption._captionSide === "top" )
-				{
-					nScrollHeadTable.appendChild( nCaption );
-				}
-				else if ( nCaption._captionSide === "bottom" && nTfoot )
-				{
-					nScrollFootTable.appendChild( nCaption );
-				}
-			}
-			
-			/*
-			 * Sizing
-			 */
-			/* When x-scrolling add the width and a scroller to move the header with the body */
-			if ( oSettings.oScroll.sX !== "" )
-			{
-				nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
-				nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );
-				
-				if ( nTfoot !== null )
-				{
-					nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );	
-				}
-				
-				/* When the body is scrolled, then we also want to scroll the headers */
-				$(nScrollBody).scroll( function (e) {
-					nScrollHead.scrollLeft = this.scrollLeft;
-					
-					if ( nTfoot !== null )
+					else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
 					{
-						nScrollFoot.scrollLeft = this.scrollLeft;
+						/* Negative integer, right to left column counting */
+						fn( columns.length+aTargets[j], def );
 					}
-				} );
-			}
-			
-			/* When yscrolling, add the height */
-			if ( oSettings.oScroll.sY !== "" )
-			{
-				nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );
-			}
-			
-			/* Redraw - align columns across the tables */
-			oSettings.aoDrawCallback.push( {
-				"fn": _fnScrollDraw,
-				"sName": "scrolling"
-			} );
-			
-			/* Infinite scrolling event handlers */
-			if ( oSettings.oScroll.bInfinite )
-			{
-				$(nScrollBody).scroll( function() {
-					/* Use a blocker to stop scrolling from loading more data while other data is still loading */
-					if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 )
+					else if ( typeof aTargets[j] === 'string' )
 					{
-						/* Check if we should load the next data set */
-						if ( $(this).scrollTop() + $(this).height() > 
-							$(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )
+						/* Class name matching on TH element */
+						for ( k=0, kLen=columns.length ; k<kLen ; k++ )
 						{
-							/* Only do the redraw if we have to - we might be at the end of the data */
-							if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )
+							if ( aTargets[j] == "_all" ||
+							     $(columns[k].nTh).hasClass( aTargets[j] ) )
 							{
-								_fnPageChange( oSettings, 'next' );
-								_fnCalculateEnd( oSettings );
-								_fnDraw( oSettings );
+								fn( k, def );
 							}
 						}
 					}
-				} );
+				}
 			}
-			
-			oSettings.nScrollHead = nScrollHead;
-			oSettings.nScrollFoot = nScrollFoot;
-			
-			return nScroller;
 		}
-		
-		
-		/**
-		 * Update the various tables for resizing. It's a bit of a pig this function, but
-		 * basically the idea to:
-		 *   1. Re-create the table inside the scrolling div
-		 *   2. Take live measurements from the DOM
-		 *   3. Apply the measurements
-		 *   4. Clean up
-		 *  @param {object} o dataTables settings object
-		 *  @returns {node} Node to add to the DOM
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnScrollDraw ( o )
+	
+		// Statically defined columns array
+		if ( aoCols )
 		{
-			var
-				nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],
-				nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
-				nScrollBody = o.nTable.parentNode,
-				i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
-				nTheadSize, nTfootSize,
-				iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth,
-				nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,
-				nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,
-				ie67 = o.oBrowser.bScrollOversize,
-				zeroOut = function(nSizer) {
-					oStyle = nSizer.style;
-					oStyle.paddingTop = "0";
-					oStyle.paddingBottom = "0";
-					oStyle.borderTopWidth = "0";
-					oStyle.borderBottomWidth = "0";
-					oStyle.height = 0;
-				};
-			
-			/*
-			 * 1. Re-create the table inside the scrolling div
-			 */
-			
-			/* Remove the old minimised thead and tfoot elements in the inner table */
-			$(o.nTable).children('thead, tfoot').remove();
-		
-			/* Clone the current header and footer elements and then place it into the inner table */
-			nTheadSize = $(o.nTHead).clone()[0];
-			o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
-			anHeadToSize = o.nTHead.getElementsByTagName('tr');
-			anHeadSizers = nTheadSize.getElementsByTagName('tr');
-			
-			if ( o.nTFoot !== null )
-			{
-				nTfootSize = $(o.nTFoot).clone()[0];
-				o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
-				anFootToSize = o.nTFoot.getElementsByTagName('tr');
-				anFootSizers = nTfootSize.getElementsByTagName('tr');
-			}
-			
-			/*
-			 * 2. Take live measurements from the DOM - do not alter the DOM itself!
-			 */
-			
-			/* Remove old sizing and apply the calculated column widths
-			 * Get the unique column headers in the newly created (cloned) header. We want to apply the
-			 * calculated sizes to this header
-			 */
-			if ( o.oScroll.sX === "" )
-			{
-				nScrollBody.style.width = '100%';
-				nScrollHeadInner.parentNode.style.width = '100%';
-			}
-			
-			var nThs = _fnGetUniqueThs( o, nTheadSize );
-			for ( i=0, iLen=nThs.length ; i<iLen ; i++ )
-			{
-				iVis = _fnVisibleToColumnIndex( o, i );
-				nThs[i].style.width = o.aoColumns[iVis].sWidth;
-			}
-			
-			if ( o.nTFoot !== null )
+			for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
 			{
-				_fnApplyToChildren( function(n) {
-					n.style.width = "";
-				}, anFootSizers );
+				fn( i, aoCols[i] );
 			}
-		
-			// If scroll collapse is enabled, when we put the headers back into the body for sizing, we
-			// will end up forcing the scrollbar to appear, making our measurements wrong for when we
-			// then hide it (end of this function), so add the header height to the body scroller.
-			if ( o.oScroll.bCollapse && o.oScroll.sY !== "" )
-			{
-				nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px";
-			}
-			
-			/* Size the table as a whole */
-			iSanityWidth = $(o.nTable).outerWidth();
-			if ( o.oScroll.sX === "" )
-			{
-				/* No x scrolling */
-				o.nTable.style.width = "100%";
-				
-				/* I know this is rubbish - but IE7 will make the width of the table when 100% include
-				 * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this
-				 * into account.
-				 */
-				if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || 
-					$(nScrollBody).css('overflow-y') == "scroll")  )
-				{
-					o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth);
-				}
-			}
-			else
-			{
-				if ( o.oScroll.sXInner !== "" )
-				{
-					/* x scroll inner has been given - use it */
-					o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);
-				}
-				else if ( iSanityWidth == $(nScrollBody).width() &&
-				   $(nScrollBody).height() < $(o.nTable).height() )
-				{
-					/* There is y-scrolling - try to take account of the y scroll bar */
-					o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );
-					if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )
-					{
-						/* Not possible to take account of it */
-						o.nTable.style.width = _fnStringToCss( iSanityWidth );
-					}
-				}
-				else
-				{
-					/* All else fails */
-					o.nTable.style.width = _fnStringToCss( iSanityWidth );
-				}
-			}
-			
-			/* Recalculate the sanity width - now that we've applied the required width, before it was
-			 * a temporary variable. This is required because the column width calculation is done
-			 * before this table DOM is created.
-			 */
-			iSanityWidth = $(o.nTable).outerWidth();
-			
-			/* We want the hidden header to have zero height, so remove padding and borders. Then
-			 * set the width based on the real headers
-			 */
-			
-			// Apply all styles in one pass. Invalidates layout only once because we don't read any 
-			// DOM properties.
-			_fnApplyToChildren( zeroOut, anHeadSizers );
-			 
-			// Read all widths in next pass. Forces layout only once because we do not change 
-			// any DOM properties.
-			_fnApplyToChildren( function(nSizer) {
-				aApplied.push( _fnStringToCss( $(nSizer).width() ) );
-			}, anHeadSizers );
-			 
-			// Apply all widths in final pass. Invalidates layout only once because we do not
-			// read any DOM properties.
-			_fnApplyToChildren( function(nToSize, i) {
-				nToSize.style.width = aApplied[i];
-			}, anHeadToSize );
-		
-			$(anHeadSizers).height(0);
-			
-			/* Same again with the footer if we have one */
-			if ( o.nTFoot !== null )
-			{
-				_fnApplyToChildren( zeroOut, anFootSizers );
-				 
-				_fnApplyToChildren( function(nSizer) {
-					aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) );
-				}, anFootSizers );
-				 
-				_fnApplyToChildren( function(nToSize, i) {
-					nToSize.style.width = aAppliedFooter[i];
-				}, anFootToSize );
-		
-				$(anFootSizers).height(0);
-			}
-			
-			/*
-			 * 3. Apply the measurements
-			 */
-			
-			/* "Hide" the header and footer that we used for the sizing. We want to also fix their width
-			 * to what they currently are
-			 */
-			_fnApplyToChildren( function(nSizer, i) {
-				nSizer.innerHTML = "";
-				nSizer.style.width = aApplied[i];
-			}, anHeadSizers );
-			
-			if ( o.nTFoot !== null )
-			{
-				_fnApplyToChildren( function(nSizer, i) {
-					nSizer.innerHTML = "";
-					nSizer.style.width = aAppliedFooter[i];
-				}, anFootSizers );
-			}
-			
-			/* Sanity check that the table is of a sensible width. If not then we are going to get
-			 * misalignment - try to prevent this by not allowing the table to shrink below its min width
-			 */
-			if ( $(o.nTable).outerWidth() < iSanityWidth )
-			{
-				/* The min width depends upon if we have a vertical scrollbar visible or not */
-				var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || 
-					$(nScrollBody).css('overflow-y') == "scroll")) ?
-						iSanityWidth+o.oScroll.iBarWidth : iSanityWidth;
-				
-				/* IE6/7 are a law unto themselves... */
-				if ( ie67 && (nScrollBody.scrollHeight > 
-					nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll")  )
-				{
-					o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth );
-				}
-				
-				/* Apply the calculated minimum width to the table wrappers */
-				nScrollBody.style.width = _fnStringToCss( iCorrection );
-				o.nScrollHead.style.width = _fnStringToCss( iCorrection );
-				
-				if ( o.nTFoot !== null )
-				{
-					o.nScrollFoot.style.width = _fnStringToCss( iCorrection );
-				}
-				
-				/* And give the user a warning that we've stopped the table getting too small */
-				if ( o.oScroll.sX === "" )
-				{
-					_fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
-						" misalignment. The table has been drawn at its minimum possible width." );
-				}
-				else if ( o.oScroll.sXInner !== "" )
-				{
-					_fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
-						" misalignment. Increase the sScrollXInner value or remove it to allow automatic"+
-						" calculation" );
-				}
-			}
-			else
-			{
-				nScrollBody.style.width = _fnStringToCss( '100%' );
-				o.nScrollHead.style.width = _fnStringToCss( '100%' );
-				
-				if ( o.nTFoot !== null )
-				{
-					o.nScrollFoot.style.width = _fnStringToCss( '100%' );
-				}
-			}
-			
-			
-			/*
-			 * 4. Clean up
-			 */
-			if ( o.oScroll.sY === "" )
-			{
-				/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
-				 * the scrollbar height from the visible display, rather than adding it on. We need to
-				 * set the height in order to sort this. Don't want to do it in any other browsers.
-				 */
-				if ( ie67 )
-				{
-					nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );
-				}
+		}
+	}
+	
+	/**
+	 * Add a data array to the table, creating DOM node etc. This is the parallel to
+	 * _fnGatherData, but for adding rows from a Javascript source, rather than a
+	 * DOM source.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {array} aData data array to be added
+	 *  @param {node} [nTr] TR element to add to the table - optional. If not given,
+	 *    DataTables will create a row automatically
+	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
+	 *    if nTr is.
+	 *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddData ( oSettings, aDataIn, nTr, anTds )
+	{
+		/* Create the object for storing information about this new row */
+		var iRow = oSettings.aoData.length;
+		var oData = $.extend( true, {}, DataTable.models.oRow, {
+			src: nTr ? 'dom' : 'data',
+			idx: iRow
+		} );
+	
+		oData._aData = aDataIn;
+		oSettings.aoData.push( oData );
+	
+		/* Create the cells */
+		var nTd, sThisType;
+		var columns = oSettings.aoColumns;
+	
+		// Invalidate the column types as the new data needs to be revalidated
+		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
+		{
+			columns[i].sType = null;
+		}
+	
+		/* Add to the display array */
+		oSettings.aiDisplayMaster.push( iRow );
+	
+		var id = oSettings.rowIdFn( aDataIn );
+		if ( id !== undefined ) {
+			oSettings.aIds[ id ] = oData;
+		}
+	
+		/* Create the DOM information, or register it if already present */
+		if ( nTr || ! oSettings.oFeatures.bDeferRender )
+		{
+			_fnCreateTr( oSettings, iRow, nTr, anTds );
+		}
+	
+		return iRow;
+	}
+	
+	
+	/**
+	 * Add one or more TR elements to the table. Generally we'd expect to
+	 * use this for reading data from a DOM sourced table, but it could be
+	 * used for an TR element. Note that if a TR is given, it is used (i.e.
+	 * it is not cloned).
+	 *  @param {object} settings dataTables settings object
+	 *  @param {array|node|jQuery} trs The TR element(s) to add to the table
+	 *  @returns {array} Array of indexes for the added rows
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddTr( settings, trs )
+	{
+		var row;
+	
+		// Allow an individual node to be passed in
+		if ( ! (trs instanceof $) ) {
+			trs = $(trs);
+		}
+	
+		return trs.map( function (i, el) {
+			row = _fnGetRowElements( settings, el );
+			return _fnAddData( settings, row.data, el, row.cells );
+		} );
+	}
+	
+	
+	/**
+	 * Take a TR element and convert it to an index in aoData
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} n the TR element to find
+	 *  @returns {int} index if the node is found, null if not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnNodeToDataIndex( oSettings, n )
+	{
+		return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
+	}
+	
+	
+	/**
+	 * Take a TD element and convert it into a column data index (not the visible index)
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iRow The row number the TD/TH can be found in
+	 *  @param {node} n The TD/TH element to find
+	 *  @returns {int} index if the node is found, -1 if not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnNodeToColumnIndex( oSettings, iRow, n )
+	{
+		return $.inArray( n, oSettings.aoData[ iRow ].anCells );
+	}
+	
+	
+	/**
+	 * Get the data for a given cell from the internal cache, taking into account data mapping
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} rowIdx aoData row id
+	 *  @param {int} colIdx Column index
+	 *  @param {string} type data get type ('display', 'type' 'filter' 'sort')
+	 *  @returns {*} Cell data
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetCellData( settings, rowIdx, colIdx, type )
+	{
+		var draw           = settings.iDraw;
+		var col            = settings.aoColumns[colIdx];
+		var rowData        = settings.aoData[rowIdx]._aData;
+		var defaultContent = col.sDefaultContent;
+		var cellData       = col.fnGetData( rowData, type, {
+			settings: settings,
+			row:      rowIdx,
+			col:      colIdx
+		} );
+	
+		if ( cellData === undefined ) {
+			if ( settings.iDrawError != draw && defaultContent === null ) {
+				_fnLog( settings, 0, "Requested unknown parameter "+
+					(typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+
+					" for row "+rowIdx+", column "+colIdx, 4 );
+				settings.iDrawError = draw;
 			}
-			
-			if ( o.oScroll.sY !== "" && o.oScroll.bCollapse )
-			{
-				nScrollBody.style.height = _fnStringToCss( o.oScroll.sY );
-				
-				var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?
-				 	o.oScroll.iBarWidth : 0;
-				if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
-				{
-					nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra );
+			return defaultContent;
+		}
+	
+		// When the data source is null and a specific data type is requested (i.e.
+		// not the original data), we can use default column data
+		if ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {
+			cellData = defaultContent;
+		}
+		else if ( typeof cellData === 'function' ) {
+			// If the data source is a function, then we run it and use the return,
+			// executing in the scope of the data object (for instances)
+			return cellData.call( rowData );
+		}
+	
+		if ( cellData === null && type == 'display' ) {
+			return '';
+		}
+		return cellData;
+	}
+	
+	
+	/**
+	 * Set the value for a specific cell, into the internal data cache
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} rowIdx aoData row id
+	 *  @param {int} colIdx Column index
+	 *  @param {*} val Value to set
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSetCellData( settings, rowIdx, colIdx, val )
+	{
+		var col     = settings.aoColumns[colIdx];
+		var rowData = settings.aoData[rowIdx]._aData;
+	
+		col.fnSetData( rowData, val, {
+			settings: settings,
+			row:      rowIdx,
+			col:      colIdx
+		}  );
+	}
+	
+	
+	// Private variable that is used to match action syntax in the data property object
+	var __reArray = /\[.*?\]$/;
+	var __reFn = /\(\)$/;
+	
+	/**
+	 * Split string on periods, taking into account escaped periods
+	 * @param  {string} str String to split
+	 * @return {array} Split string
+	 */
+	function _fnSplitObjNotation( str )
+	{
+		return $.map( str.match(/(\\.|[^\.])+/g) || [''], function ( s ) {
+			return s.replace(/\\./g, '.');
+		} );
+	}
+	
+	
+	/**
+	 * Return a function that can be used to get data from a source object, taking
+	 * into account the ability to use nested objects as a source
+	 *  @param {string|int|function} mSource The data source for the object
+	 *  @returns {function} Data get function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetObjectDataFn( mSource )
+	{
+		if ( $.isPlainObject( mSource ) )
+		{
+			/* Build an object of get functions, and wrap them in a single call */
+			var o = {};
+			$.each( mSource, function (key, val) {
+				if ( val ) {
+					o[key] = _fnGetObjectDataFn( val );
 				}
-			}
-			
-			/* Finally set the width's of the header and footer tables */
-			var iOuterWidth = $(o.nTable).outerWidth();
-			nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
-			nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );
-		
-			// Figure out if there are scrollbar present - if so then we need a the header and footer to
-			// provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
-			var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll";
-			nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
-			
-			if ( o.nTFoot !== null )
-			{
-				nScrollFootTable.style.width = _fnStringToCss( iOuterWidth );
-				nScrollFootInner.style.width = _fnStringToCss( iOuterWidth );
-				nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
-			}
-		
-			/* Adjust the position of the header in case we loose the y-scrollbar */
-			$(nScrollBody).scroll();
-			
-			/* If sorting or filtering has occurred, jump the scrolling back to the top */
-			if ( o.bSorted || o.bFiltered )
-			{
-				nScrollBody.scrollTop = 0;
-			}
+			} );
+	
+			return function (data, type, row, meta) {
+				var t = o[type] || o._;
+				return t !== undefined ?
+					t(data, type, row, meta) :
+					data;
+			};
 		}
-		
-		
-		/**
-		 * Apply a given function to the display child nodes of an element array (typically
-		 * TD children of TR rows
-		 *  @param {function} fn Method to apply to the objects
-		 *  @param array {nodes} an1 List of elements to look through for display children
-		 *  @param array {nodes} an2 Another list (identical structure to the first) - optional
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnApplyToChildren( fn, an1, an2 )
+		else if ( mSource === null )
 		{
-			var index=0, i=0, iLen=an1.length;
-			var nNode1, nNode2;
-		
-			while ( i < iLen )
-			{
-				nNode1 = an1[i].firstChild;
-				nNode2 = an2 ? an2[i].firstChild : null;
-				while ( nNode1 )
+			/* Give an empty string for rendering / sorting etc */
+			return function (data) { // type, row and meta also passed, but not used
+				return data;
+			};
+		}
+		else if ( typeof mSource === 'function' )
+		{
+			return function (data, type, row, meta) {
+				return mSource( data, type, row, meta );
+			};
+		}
+		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
+			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
+		{
+			/* If there is a . in the source string then the data source is in a
+			 * nested object so we loop over the data for each level to get the next
+			 * level down. On each loop we test for undefined, and if found immediately
+			 * return. This allows entire objects to be missing and sDefaultContent to
+			 * be used if defined, rather than throwing an error
+			 */
+			var fetchData = function (data, type, src) {
+				var arrayNotation, funcNotation, out, innerSrc;
+	
+				if ( src !== "" )
 				{
-					if ( nNode1.nodeType === 1 )
+					var a = _fnSplitObjNotation( src );
+	
+					for ( var i=0, iLen=a.length ; i<iLen ; i++ )
 					{
-						if ( an2 )
+						// Check if we are dealing with special notation
+						arrayNotation = a[i].match(__reArray);
+						funcNotation = a[i].match(__reFn);
+	
+						if ( arrayNotation )
 						{
-							fn( nNode1, nNode2, index );
+							// Array notation
+							a[i] = a[i].replace(__reArray, '');
+	
+							// Condition allows simply [] to be passed in
+							if ( a[i] !== "" ) {
+								data = data[ a[i] ];
+							}
+							out = [];
+	
+							// Get the remainder of the nested object to get
+							a.splice( 0, i+1 );
+							innerSrc = a.join('.');
+	
+							// Traverse each entry in the array getting the properties requested
+							if ( $.isArray( data ) ) {
+								for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
+									out.push( fetchData( data[j], type, innerSrc ) );
+								}
+							}
+	
+							// If a string is given in between the array notation indicators, that
+							// is used to join the strings together, otherwise an array is returned
+							var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
+							data = (join==="") ? out : out.join(join);
+	
+							// The inner call to fetchData has already traversed through the remainder
+							// of the source requested, so we exit from the loop
+							break;
 						}
-						else
+						else if ( funcNotation )
 						{
-							fn( nNode1, index );
+							// Function call
+							a[i] = a[i].replace(__reFn, '');
+							data = data[ a[i] ]();
+							continue;
 						}
-						index++;
+	
+						if ( data === null || data[ a[i] ] === undefined )
+						{
+							return undefined;
+						}
+						data = data[ a[i] ];
 					}
-					nNode1 = nNode1.nextSibling;
-					nNode2 = an2 ? nNode2.nextSibling : null;
 				}
-				i++;
-			}
+	
+				return data;
+			};
+	
+			return function (data, type) { // row and meta also passed, but not used
+				return fetchData( data, type, mSource );
+			};
 		}
-		
-		/**
-		 * Convert a CSS unit width to pixels (e.g. 2em)
-		 *  @param {string} sWidth width to be converted
-		 *  @param {node} nParent parent to get the with for (required for relative widths) - optional
-		 *  @returns {int} iWidth width in pixels
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnConvertToWidth ( sWidth, nParent )
+		else
 		{
-			if ( !sWidth || sWidth === null || sWidth === '' )
-			{
-				return 0;
-			}
-			
-			if ( !nParent )
-			{
-				nParent = document.body;
-			}
-			
-			var iWidth;
-			var nTmp = document.createElement( "div" );
-			nTmp.style.width = _fnStringToCss( sWidth );
-			
-			nParent.appendChild( nTmp );
-			iWidth = nTmp.offsetWidth;
-			nParent.removeChild( nTmp );
-			
-			return ( iWidth );
+			/* Array or flat object mapping */
+			return function (data, type) { // row and meta also passed, but not used
+				return data[mSource];
+			};
 		}
-		
-		
-		/**
-		 * Calculate the width of columns for the table
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnCalculateColumnWidths ( oSettings )
+	}
+	
+	
+	/**
+	 * Return a function that can be used to set data from a source object, taking
+	 * into account the ability to use nested objects as a source
+	 *  @param {string|int|function} mSource The data source for the object
+	 *  @returns {function} Data set function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSetObjectDataFn( mSource )
+	{
+		if ( $.isPlainObject( mSource ) )
 		{
-			var iTableWidth = oSettings.nTable.offsetWidth;
-			var iUserInputs = 0;
-			var iTmpWidth;
-			var iVisibleColumns = 0;
-			var iColums = oSettings.aoColumns.length;
-			var i, iIndex, iCorrector, iWidth;
-			var oHeaders = $('th', oSettings.nTHead);
-			var widthAttr = oSettings.nTable.getAttribute('width');
-			var nWrapper = oSettings.nTable.parentNode;
-			
-			/* Convert any user input sizes into pixel sizes */
-			for ( i=0 ; i<iColums ; i++ )
-			{
-				if ( oSettings.aoColumns[i].bVisible )
+			/* Unlike get, only the underscore (global) option is used for for
+			 * setting data since we don't know the type here. This is why an object
+			 * option is not documented for `mData` (which is read/write), but it is
+			 * for `mRender` which is read only.
+			 */
+			return _fnSetObjectDataFn( mSource._ );
+		}
+		else if ( mSource === null )
+		{
+			/* Nothing to do when the data source is null */
+			return function () {};
+		}
+		else if ( typeof mSource === 'function' )
+		{
+			return function (data, val, meta) {
+				mSource( data, 'set', val, meta );
+			};
+		}
+		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
+			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
+		{
+			/* Like the get, we need to get data from a nested object */
+			var setData = function (data, val, src) {
+				var a = _fnSplitObjNotation( src ), b;
+				var aLast = a[a.length-1];
+				var arrayNotation, funcNotation, o, innerSrc;
+	
+				for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
 				{
-					iVisibleColumns++;
-					
-					if ( oSettings.aoColumns[i].sWidth !== null )
+					// Check if we are dealing with an array notation request
+					arrayNotation = a[i].match(__reArray);
+					funcNotation = a[i].match(__reFn);
+	
+					if ( arrayNotation )
 					{
-						iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, 
-							nWrapper );
-						if ( iTmpWidth !== null )
+						a[i] = a[i].replace(__reArray, '');
+						data[ a[i] ] = [];
+	
+						// Get the remainder of the nested object to set so we can recurse
+						b = a.slice();
+						b.splice( 0, i+1 );
+						innerSrc = b.join('.');
+	
+						// Traverse each entry in the array setting the properties requested
+						if ( $.isArray( val ) )
+						{
+							for ( var j=0, jLen=val.length ; j<jLen ; j++ )
+							{
+								o = {};
+								setData( o, val[j], innerSrc );
+								data[ a[i] ].push( o );
+							}
+						}
+						else
 						{
-							oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
+							// We've been asked to save data to an array, but it
+							// isn't array data to be saved. Best that can be done
+							// is to just save the value.
+							data[ a[i] ] = val;
 						}
-							
-						iUserInputs++;
+	
+						// The inner call to setData has already traversed through the remainder
+						// of the source and has set the data, thus we can exit here
+						return;
 					}
-				}
-			}
-			
-			/* If the number of columns in the DOM equals the number that we have to process in 
-			 * DataTables, then we can use the offsets that are created by the web-browser. No custom 
-			 * sizes can be set in order for this to happen, nor scrolling used
-			 */
-			if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
-				oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
-			{
-				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
-				{
-					iTmpWidth = $(oHeaders[i]).width();
-					if ( iTmpWidth !== null )
+					else if ( funcNotation )
 					{
-						oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
+						// Function call
+						a[i] = a[i].replace(__reFn, '');
+						data = data[ a[i] ]( val );
 					}
-				}
-			}
-			else
-			{
-				/* Otherwise we are going to have to do some calculations to get the width of each column.
-				 * Construct a 1 row table with the widest node in the data, and any user defined widths,
-				 * then insert it into the DOM and allow the browser to do all the hard work of
-				 * calculating table widths.
-				 */
-				var
-					nCalcTmp = oSettings.nTable.cloneNode( false ),
-					nTheadClone = oSettings.nTHead.cloneNode(true),
-					nBody = document.createElement( 'tbody' ),
-					nTr = document.createElement( 'tr' ),
-					nDivSizing;
-				
-				nCalcTmp.removeAttribute( "id" );
-				nCalcTmp.appendChild( nTheadClone );
-				if ( oSettings.nTFoot !== null )
-				{
-					nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );
-					_fnApplyToChildren( function(n) {
-						n.style.width = "";
-					}, nCalcTmp.getElementsByTagName('tr') );
-				}
-				
-				nCalcTmp.appendChild( nBody );
-				nBody.appendChild( nTr );
-				
-				/* Remove any sizing that was previously applied by the styles */
-				var jqColSizing = $('thead th', nCalcTmp);
-				if ( jqColSizing.length === 0 )
-				{
-					jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);
-				}
-		
-				/* Apply custom sizing to the cloned header */
-				var nThs = _fnGetUniqueThs( oSettings, nTheadClone );
-				iCorrector = 0;
-				for ( i=0 ; i<iColums ; i++ )
-				{
-					var oColumn = oSettings.aoColumns[i];
-					if ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== "" )
-					{
-						nThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig );
-					}
-					else if ( oColumn.bVisible )
-					{
-						nThs[i-iCorrector].style.width = "";
-					}
-					else
-					{
-						iCorrector++;
-					}
-				}
-		
-				/* Find the biggest td for each column and put it into the table */
-				for ( i=0 ; i<iColums ; i++ )
-				{
-					if ( oSettings.aoColumns[i].bVisible )
-					{
-						var nTd = _fnGetWidestNode( oSettings, i );
-						if ( nTd !== null )
-						{
-							nTd = nTd.cloneNode(true);
-							if ( oSettings.aoColumns[i].sContentPadding !== "" )
-							{
-								nTd.innerHTML += oSettings.aoColumns[i].sContentPadding;
-							}
-							nTr.appendChild( nTd );
-						}
-					}
-				}
-				
-				/* Build the table and 'display' it */
-				nWrapper.appendChild( nCalcTmp );
-				
-				/* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
-				 * when not scrolling leave the table width as it is. This results in slightly different,
-				 * but I think correct behaviour
-				 */
-				if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" )
-				{
-					nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);
-				}
-				else if ( oSettings.oScroll.sX !== "" )
-				{
-					nCalcTmp.style.width = "";
-					if ( $(nCalcTmp).width() < nWrapper.offsetWidth )
+	
+					// If the nested object doesn't currently exist - since we are
+					// trying to set the value - create it
+					if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
 					{
-						nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
+						data[ a[i] ] = {};
 					}
+					data = data[ a[i] ];
 				}
-				else if ( oSettings.oScroll.sY !== "" )
-				{
-					nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
-				}
-				else if ( widthAttr )
-				{
-					nCalcTmp.style.width = _fnStringToCss( widthAttr );
-				}
-				nCalcTmp.style.visibility = "hidden";
-				
-				/* Scrolling considerations */
-				_fnScrollingWidthAdjust( oSettings, nCalcTmp );
-				
-				/* Read the width's calculated by the browser and store them for use by the caller. We
-				 * first of all try to use the elements in the body, but it is possible that there are
-				 * no elements there, under which circumstances we use the header elements
-				 */
-				var oNodes = $("tbody tr:eq(0)", nCalcTmp).children();
-				if ( oNodes.length === 0 )
-				{
-					oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] );
-				}
-		
-				/* Browsers need a bit of a hand when a width is assigned to any columns when 
-				 * x-scrolling as they tend to collapse the table to the min-width, even if
-				 * we sent the column widths. So we need to keep track of what the table width
-				 * should be by summing the user given values, and the automatic values
-				 */
-				if ( oSettings.oScroll.sX !== "" )
+	
+				// Last item in the input - i.e, the actual set
+				if ( aLast.match(__reFn ) )
 				{
-					var iTotal = 0;
-					iCorrector = 0;
-					for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
-					{
-						if ( oSettings.aoColumns[i].bVisible )
-						{
-							if ( oSettings.aoColumns[i].sWidthOrig === null )
-							{
-								iTotal += $(oNodes[iCorrector]).outerWidth();
-							}
-							else
-							{
-								iTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) +
-									($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width());
-							}
-							iCorrector++;
-						}
-					}
-					
-					nCalcTmp.style.width = _fnStringToCss( iTotal );
-					oSettings.nTable.style.width = _fnStringToCss( iTotal );
+					// Function call
+					data = data[ aLast.replace(__reFn, '') ]( val );
 				}
-		
-				iCorrector = 0;
-				for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+				else
 				{
-					if ( oSettings.aoColumns[i].bVisible )
-					{
-						iWidth = $(oNodes[iCorrector]).width();
-						if ( iWidth !== null && iWidth > 0 )
-						{
-							oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth );
-						}
-						iCorrector++;
-					}
+					// If array notation is used, we just want to strip it and use the property name
+					// and assign the value. If it isn't used, then we get the result we want anyway
+					data[ aLast.replace(__reArray, '') ] = val;
 				}
-		
-				var cssWidth = $(nCalcTmp).css('width');
-				oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ?
-				    cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() );
-				nCalcTmp.parentNode.removeChild( nCalcTmp );
-			}
-		
-			if ( widthAttr )
-			{
-				oSettings.nTable.style.width = _fnStringToCss( widthAttr );
-			}
+			};
+	
+			return function (data, val) { // meta is also passed in, but not used
+				return setData( data, val, mSource );
+			};
 		}
-		
-		
-		/**
-		 * Adjust a table's width to take account of scrolling
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {node} n table node
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnScrollingWidthAdjust ( oSettings, n )
+		else
 		{
-			if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" )
-			{
-				/* When y-scrolling only, we want to remove the width of the scroll bar so the table
-				 * + scroll bar will fit into the area avaialble.
-				 */
-				var iOrigWidth = $(n).width();
-				n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );
-			}
-			else if ( oSettings.oScroll.sX !== "" )
-			{
-				/* When x-scrolling both ways, fix the table at it's current size, without adjusting */
-				n.style.width = _fnStringToCss( $(n).outerWidth() );
-			}
+			/* Array or flat object mapping */
+			return function (data, val) { // meta is also passed in, but not used
+				data[mSource] = val;
+			};
 		}
-		
-		
-		/**
-		 * Get the widest node
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iCol column of interest
-		 *  @returns {node} widest table node
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnGetWidestNode( oSettings, iCol )
+	}
+	
+	
+	/**
+	 * Return an array with the full table data
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns array {array} aData Master data array
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetDataMaster ( settings )
+	{
+		return _pluck( settings.aoData, '_aData' );
+	}
+	
+	
+	/**
+	 * Nuke the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnClearTable( settings )
+	{
+		settings.aoData.length = 0;
+		settings.aiDisplayMaster.length = 0;
+		settings.aiDisplay.length = 0;
+		settings.aIds = {};
+	}
+	
+	
+	 /**
+	 * Take an array of integers (index array) and remove a target integer (value - not
+	 * the key!)
+	 *  @param {array} a Index array to target
+	 *  @param {int} iTarget value to find
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDeleteIndex( a, iTarget, splice )
+	{
+		var iTargetIndex = -1;
+	
+		for ( var i=0, iLen=a.length ; i<iLen ; i++ )
 		{
-			var iMaxIndex = _fnGetMaxLenString( oSettings, iCol );
-			if ( iMaxIndex < 0 )
+			if ( a[i] == iTarget )
 			{
-				return null;
+				iTargetIndex = i;
 			}
-		
-			if ( oSettings.aoData[iMaxIndex].nTr === null )
+			else if ( a[i] > iTarget )
 			{
-				var n = document.createElement('td');
-				n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' );
-				return n;
+				a[i]--;
 			}
-			return _fnGetTdNodes(oSettings, iMaxIndex)[iCol];
 		}
-		
-		
-		/**
-		 * Get the maximum strlen for each data column
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iCol column of interest
-		 *  @returns {string} max string length for each column
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnGetMaxLenString( oSettings, iCol )
+	
+		if ( iTargetIndex != -1 && splice === undefined )
 		{
-			var iMax = -1;
-			var iMaxIndex = -1;
-			
-			for ( var i=0 ; i<oSettings.aoData.length ; i++ )
-			{
-				var s = _fnGetCellData( oSettings, i, iCol, 'display' )+"";
-				s = s.replace( /<.*?>/g, "" );
-				if ( s.length > iMax )
-				{
-					iMax = s.length;
-					iMaxIndex = i;
+			a.splice( iTargetIndex, 1 );
+		}
+	}
+	
+	
+	/**
+	 * Mark cached data as invalid such that a re-read of the data will occur when
+	 * the cached data is next requested. Also update from the data source object.
+	 *
+	 * @param {object} settings DataTables settings object
+	 * @param {int}    rowIdx   Row index to invalidate
+	 * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'
+	 *     or 'data'
+	 * @param {int}    [colIdx] Column index to invalidate. If undefined the whole
+	 *     row will be invalidated
+	 * @memberof DataTable#oApi
+	 *
+	 * @todo For the modularisation of v1.11 this will need to become a callback, so
+	 *   the sort and filter methods can subscribe to it. That will required
+	 *   initialisation options for sorting, which is why it is not already baked in
+	 */
+	function _fnInvalidate( settings, rowIdx, src, colIdx )
+	{
+		var row = settings.aoData[ rowIdx ];
+		var i, ien;
+		var cellWrite = function ( cell, col ) {
+			// This is very frustrating, but in IE if you just write directly
+			// to innerHTML, and elements that are overwritten are GC'ed,
+			// even if there is a reference to them elsewhere
+			while ( cell.childNodes.length ) {
+				cell.removeChild( cell.firstChild );
+			}
+	
+			cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
+		};
+	
+		// Are we reading last data from DOM or the data object?
+		if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
+			// Read the data from the DOM
+			row._aData = _fnGetRowElements(
+					settings, row, colIdx, colIdx === undefined ? undefined : row._aData
+				)
+				.data;
+		}
+		else {
+			// Reading from data object, update the DOM
+			var cells = row.anCells;
+	
+			if ( cells ) {
+				if ( colIdx !== undefined ) {
+					cellWrite( cells[colIdx], colIdx );
+				}
+				else {
+					for ( i=0, ien=cells.length ; i<ien ; i++ ) {
+						cellWrite( cells[i], i );
+					}
 				}
 			}
-			
-			return iMaxIndex;
 		}
-		
-		
-		/**
-		 * Append a CSS unit (only if required) to a string
-		 *  @param {array} aArray1 first array
-		 *  @param {array} aArray2 second array
-		 *  @returns {int} 0 if match, 1 if length is different, 2 if no match
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnStringToCss( s )
-		{
-			if ( s === null )
-			{
-				return "0px";
+	
+		// For both row and cell invalidation, the cached data for sorting and
+		// filtering is nulled out
+		row._aSortData = null;
+		row._aFilterData = null;
+	
+		// Invalidate the type for a specific column (if given) or all columns since
+		// the data might have changed
+		var cols = settings.aoColumns;
+		if ( colIdx !== undefined ) {
+			cols[ colIdx ].sType = null;
+		}
+		else {
+			for ( i=0, ien=cols.length ; i<ien ; i++ ) {
+				cols[i].sType = null;
 			}
-			
-			if ( typeof s == 'number' )
-			{
-				if ( s < 0 )
-				{
-					return "0px";
+	
+			// Update DataTables special `DT_*` attributes for the row
+			_fnRowAttributes( settings, row );
+		}
+	}
+	
+	
+	/**
+	 * Build a data source object from an HTML row, reading the contents of the
+	 * cells that are in the row.
+	 *
+	 * @param {object} settings DataTables settings object
+	 * @param {node|object} TR element from which to read data or existing row
+	 *   object from which to re-read the data from the cells
+	 * @param {int} [colIdx] Optional column index
+	 * @param {array|object} [d] Data source object. If `colIdx` is given then this
+	 *   parameter should also be given and will be used to write the data into.
+	 *   Only the column in question will be written
+	 * @returns {object} Object with two parameters: `data` the data read, in
+	 *   document order, and `cells` and array of nodes (they can be useful to the
+	 *   caller, so rather than needing a second traversal to get them, just return
+	 *   them from here).
+	 * @memberof DataTable#oApi
+	 */
+	function _fnGetRowElements( settings, row, colIdx, d )
+	{
+		var
+			tds = [],
+			td = row.firstChild,
+			name, col, o, i=0, contents,
+			columns = settings.aoColumns,
+			objectRead = settings._rowReadObject;
+	
+		// Allow the data object to be passed in, or construct
+		d = d !== undefined ?
+			d :
+			objectRead ?
+				{} :
+				[];
+	
+		var attr = function ( str, td  ) {
+			if ( typeof str === 'string' ) {
+				var idx = str.indexOf('@');
+	
+				if ( idx !== -1 ) {
+					var attr = str.substring( idx+1 );
+					var setter = _fnSetObjectDataFn( str );
+					setter( d, td.getAttribute( attr ) );
 				}
-				return s+"px";
 			}
-			
-			/* Check if the last character is not 0-9 */
-			var c = s.charCodeAt( s.length-1 );
-			if (c < 0x30 || c > 0x39)
-			{
-				return s;
+		};
+	
+		// Read data from a cell and store into the data object
+		var cellProcess = function ( cell ) {
+			if ( colIdx === undefined || colIdx === i ) {
+				col = columns[i];
+				contents = $.trim(cell.innerHTML);
+	
+				if ( col && col._bAttrSrc ) {
+					var setter = _fnSetObjectDataFn( col.mData._ );
+					setter( d, contents );
+	
+					attr( col.mData.sort, cell );
+					attr( col.mData.type, cell );
+					attr( col.mData.filter, cell );
+				}
+				else {
+					// Depending on the `data` option for the columns the data can
+					// be read to either an object or an array.
+					if ( objectRead ) {
+						if ( ! col._setter ) {
+							// Cache the setter function
+							col._setter = _fnSetObjectDataFn( col.mData );
+						}
+						col._setter( d, contents );
+					}
+					else {
+						d[i] = contents;
+					}
+				}
+			}
+	
+			i++;
+		};
+	
+		if ( td ) {
+			// `tr` element was passed in
+			while ( td ) {
+				name = td.nodeName.toUpperCase();
+	
+				if ( name == "TD" || name == "TH" ) {
+					cellProcess( td );
+					tds.push( td );
+				}
+	
+				td = td.nextSibling;
 			}
-			return s+"px";
 		}
-		
-		
-		/**
-		 * Get the width of a scroll bar in this browser being used
-		 *  @returns {int} width in pixels
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnScrollBarWidth ()
-		{  
-			var inner = document.createElement('p');
-			var style = inner.style;
-			style.width = "100%";
-			style.height = "200px";
-			style.padding = "0px";
-			
-			var outer = document.createElement('div');
-			style = outer.style;
-			style.position = "absolute";
-			style.top = "0px";
-			style.left = "0px";
-			style.visibility = "hidden";
-			style.width = "200px";
-			style.height = "150px";
-			style.padding = "0px";
-			style.overflow = "hidden";
-			outer.appendChild(inner);
-			
-			document.body.appendChild(outer);
-			var w1 = inner.offsetWidth;
-			outer.style.overflow = 'scroll';
-			var w2 = inner.offsetWidth;
-			if ( w1 == w2 )
-			{
-				w2 = outer.clientWidth;
+		else {
+			// Existing row object passed in
+			tds = row.anCells;
+	
+			for ( var j=0, jen=tds.length ; j<jen ; j++ ) {
+				cellProcess( tds[j] );
 			}
-			
-			document.body.removeChild(outer);
-			return (w1 - w2);  
 		}
-		
-		/**
-		 * Change the order of the table
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {bool} bApplyClasses optional - should we apply classes or not
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnSort ( oSettings, bApplyClasses )
+	
+		// Read the ID from the DOM if present
+		var rowNode = row.firstChild ? row : row.nTr;
+	
+		if ( rowNode ) {
+			var id = rowNode.getAttribute( 'id' );
+	
+			if ( id ) {
+				_fnSetObjectDataFn( settings.rowId )( d, id );
+			}
+		}
+	
+		return {
+			data: d,
+			cells: tds
+		};
+	}
+	/**
+	 * Create a new TR element (and it's TD children) for a row
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iRow Row to consider
+	 *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,
+	 *    DataTables will create a row automatically
+	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
+	 *    if nTr is.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
+	{
+		var
+			row = oSettings.aoData[iRow],
+			rowData = row._aData,
+			cells = [],
+			nTr, nTd, oCol,
+			i, iLen;
+	
+		if ( row.nTr === null )
 		{
-			var
-				i, iLen, j, jLen, k, kLen,
-				sDataType, nTh,
-				aaSort = [],
-			 	aiOrig = [],
-				oSort = DataTable.ext.oSort,
-				aoData = oSettings.aoData,
-				aoColumns = oSettings.aoColumns,
-				oAria = oSettings.oLanguage.oAria;
-			
-			/* No sorting required if server-side or no sorting array */
-			if ( !oSettings.oFeatures.bServerSide && 
-				(oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
+			nTr = nTrIn || document.createElement('tr');
+	
+			row.nTr = nTr;
+			row.anCells = cells;
+	
+			/* Use a private property on the node to allow reserve mapping from the node
+			 * to the aoData array for fast look up
+			 */
+			nTr._DT_RowIndex = iRow;
+	
+			/* Special parameters can be given by the data source to be used on the row */
+			_fnRowAttributes( oSettings, row );
+	
+			/* Process each column */
+			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
 			{
-				aaSort = ( oSettings.aaSortingFixed !== null ) ?
-					oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
-					oSettings.aaSorting.slice();
+				oCol = oSettings.aoColumns[i];
+	
+				nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );
+				nTd._DT_CellIndex = {
+					row: iRow,
+					column: i
+				};
 				
-				/* If there is a sorting data type, and a function belonging to it, then we need to
-				 * get the data from the developer's function and apply it for this column
-				 */
-				for ( i=0 ; i<aaSort.length ; i++ )
-				{
-					var iColumn = aaSort[i][0];
-					var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );
-					sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
-					if ( DataTable.ext.afnSortData[sDataType] )
-					{
-						var aData = DataTable.ext.afnSortData[sDataType].call( 
-							oSettings.oInstance, oSettings, iColumn, iVisColumn
-						);
-						if ( aData.length === aoData.length )
-						{
-							for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
-							{
-								_fnSetCellData( oSettings, j, iColumn, aData[j] );
-							}
-						}
-						else
-						{
-							_fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" );
-						}
-					}
+				cells.push( nTd );
+	
+				// Need to create the HTML if new, or if a rendering function is defined
+				if ( (!nTrIn || oCol.mRender || oCol.mData !== i) &&
+					 (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')
+				) {
+					nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
 				}
-				
-				/* Create a value - key array of the current row positions such that we can use their
-				 * current position during the sort, if values match, in order to perform stable sorting
-				 */
-				for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
+	
+				/* Add user defined class */
+				if ( oCol.sClass )
 				{
-					aiOrig[ oSettings.aiDisplayMaster[i] ] = i;
+					nTd.className += ' '+oCol.sClass;
 				}
-		
-				/* Build an internal data array which is specific to the sort, so we can get and prep
-				 * the data to be sorted only once, rather than needing to do it every time the sorting
-				 * function runs. This make the sorting function a very simple comparison
-				 */
-				var iSortLen = aaSort.length;
-				var fnSortFormat, aDataSort;
-				for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+	
+				// Visibility - add or remove as required
+				if ( oCol.bVisible && ! nTrIn )
 				{
-					for ( j=0 ; j<iSortLen ; j++ )
-					{
-						aDataSort = aoColumns[ aaSort[j][0] ].aDataSort;
-		
-						for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
-						{
-							sDataType = aoColumns[ aDataSort[k] ].sType;
-							fnSortFormat = oSort[ (sDataType ? sDataType : 'string')+"-pre" ];
-							
-							aoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ?
-								fnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) :
-								_fnGetCellData( oSettings, i, aDataSort[k], 'sort' );
-						}
-					}
+					nTr.appendChild( nTd );
 				}
-				
-				/* Do the sort - here we want multi-column sorting based on a given data source (column)
-				 * and sorting function (from oSort) in a certain direction. It's reasonably complex to
-				 * follow on it's own, but this is what we want (example two column sorting):
-				 *  fnLocalSorting = function(a,b){
-				 *  	var iTest;
-				 *  	iTest = oSort['string-asc']('data11', 'data12');
-				 *  	if (iTest !== 0)
-				 *  		return iTest;
-				 *    iTest = oSort['numeric-desc']('data21', 'data22');
-				 *    if (iTest !== 0)
-				 *  		return iTest;
-				 *  	return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
-				 *  }
-				 * Basically we have a test for each sorting column, if the data in that column is equal,
-				 * test the next column. If all columns match, then we use a numeric sort on the row 
-				 * positions in the original data array to provide a stable sort.
-				 */
-				oSettings.aiDisplayMaster.sort( function ( a, b ) {
-					var k, l, lLen, iTest, aDataSort, sDataType;
-					for ( k=0 ; k<iSortLen ; k++ )
-					{
-						aDataSort = aoColumns[ aaSort[k][0] ].aDataSort;
-		
-						for ( l=0, lLen=aDataSort.length ; l<lLen ; l++ )
-						{
-							sDataType = aoColumns[ aDataSort[l] ].sType;
-							
-							iTest = oSort[ (sDataType ? sDataType : 'string')+"-"+aaSort[k][1] ](
-								aoData[a]._aSortData[ aDataSort[l] ],
-								aoData[b]._aSortData[ aDataSort[l] ]
-							);
-						
-							if ( iTest !== 0 )
-							{
-								return iTest;
-							}
-						}
-					}
-					
-					return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
-				} );
-			}
-			
-			/* Alter the sorting classes to take account of the changes */
-			if ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender )
-			{
-				_fnSortingClasses( oSettings );
-			}
-		
-			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
-			{
-				var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" );
-				nTh = aoColumns[i].nTh;
-				nTh.removeAttribute('aria-sort');
-				nTh.removeAttribute('aria-label');
-				
-				/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
-				if ( aoColumns[i].bSortable )
+				else if ( ! oCol.bVisible && nTrIn )
 				{
-					if ( aaSort.length > 0 && aaSort[0][0] == i )
-					{
-						nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" );
-						
-						var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? 
-							aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];
-						nTh.setAttribute('aria-label', sTitle+
-							(nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
-					}
-					else
-					{
-						nTh.setAttribute('aria-label', sTitle+
-							(aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
-					}
+					nTd.parentNode.removeChild( nTd );
 				}
-				else
+	
+				if ( oCol.fnCreatedCell )
 				{
-					nTh.setAttribute('aria-label', sTitle);
+					oCol.fnCreatedCell.call( oSettings.oInstance,
+						nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i
+					);
 				}
 			}
-			
-			/* Tell the draw function that we have sorted the data */
-			oSettings.bSorted = true;
-			$(oSettings.oInstance).trigger('sort', oSettings);
-			
-			/* Copy the master data into the draw array and re-draw */
-			if ( oSettings.oFeatures.bFilter )
-			{
-				/* _fnFilter() will redraw the table for us */
-				_fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
+	
+			_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );
+		}
+	
+		// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
+		// and deployed
+		row.nTr.setAttribute( 'role', 'row' );
+	}
+	
+	
+	/**
+	 * Add attributes to a row based on the special `DT_*` parameters in a data
+	 * source object.
+	 *  @param {object} settings DataTables settings object
+	 *  @param {object} DataTables row object for the row to be modified
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnRowAttributes( settings, row )
+	{
+		var tr = row.nTr;
+		var data = row._aData;
+	
+		if ( tr ) {
+			var id = settings.rowIdFn( data );
+	
+			if ( id ) {
+				tr.id = id;
 			}
-			else
-			{
-				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
-				oSettings._iDisplayStart = 0; /* reset display back to page 0 */
-				_fnCalculateEnd( oSettings );
-				_fnDraw( oSettings );
+	
+			if ( data.DT_RowClass ) {
+				// Remove any classes added by DT_RowClass before
+				var a = data.DT_RowClass.split(' ');
+				row.__rowc = row.__rowc ?
+					_unique( row.__rowc.concat( a ) ) :
+					a;
+	
+				$(tr)
+					.removeClass( row.__rowc.join(' ') )
+					.addClass( data.DT_RowClass );
+			}
+	
+			if ( data.DT_RowAttr ) {
+				$(tr).attr( data.DT_RowAttr );
+			}
+	
+			if ( data.DT_RowData ) {
+				$(tr).data( data.DT_RowData );
 			}
 		}
+	}
+	
+	
+	/**
+	 * Create the HTML header for the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnBuildHead( oSettings )
+	{
+		var i, ien, cell, row, column;
+		var thead = oSettings.nTHead;
+		var tfoot = oSettings.nTFoot;
+		var createHeader = $('th, td', thead).length === 0;
+		var classes = oSettings.oClasses;
+		var columns = oSettings.aoColumns;
+	
+		if ( createHeader ) {
+			row = $('<tr/>').appendTo( thead );
+		}
+	
+		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
+			column = columns[i];
+			cell = $( column.nTh ).addClass( column.sClass );
+	
+			if ( createHeader ) {
+				cell.appendTo( row );
+			}
+	
+			// 1.11 move into sorting
+			if ( oSettings.oFeatures.bSort ) {
+				cell.addClass( column.sSortingClass );
+	
+				if ( column.bSortable !== false ) {
+					cell
+						.attr( 'tabindex', oSettings.iTabIndex )
+						.attr( 'aria-controls', oSettings.sTableId );
+	
+					_fnSortAttachListener( oSettings, column.nTh, i );
+				}
+			}
+	
+			if ( column.sTitle != cell[0].innerHTML ) {
+				cell.html( column.sTitle );
+			}
+	
+			_fnRenderer( oSettings, 'header' )(
+				oSettings, cell, column, classes
+			);
+		}
+	
+		if ( createHeader ) {
+			_fnDetectHeader( oSettings.aoHeader, thead );
+		}
 		
-		
-		/**
-		 * Attach a sort handler (click) to a node
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {node} nNode node to attach the handler to
-		 *  @param {int} iDataIndex column sorting index
-		 *  @param {function} [fnCallback] callback function
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )
+		/* ARIA role for the rows */
+	 	$(thead).find('>tr').attr('role', 'row');
+	
+		/* Deal with the footer - add classes if required */
+		$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
+		$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
+	
+		// Cache the footer cells. Note that we only take the cells from the first
+		// row in the footer. If there is more than one row the user wants to
+		// interact with, they need to use the table().foot() method. Note also this
+		// allows cells to be used for multiple columns using colspan
+		if ( tfoot !== null ) {
+			var cells = oSettings.aoFooter[0];
+	
+			for ( i=0, ien=cells.length ; i<ien ; i++ ) {
+				column = columns[i];
+				column.nTf = cells[i].cell;
+	
+				if ( column.sClass ) {
+					$(column.nTf).addClass( column.sClass );
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Draw the header (or footer) element based on the column visibility states. The
+	 * methodology here is to use the layout array from _fnDetectHeader, modified for
+	 * the instantaneous column visibility, to construct the new layout. The grid is
+	 * traversed over cell at a time in a rows x columns grid fashion, although each
+	 * cell insert can cover multiple elements in the grid - which is tracks using the
+	 * aApplied array. Cell inserts in the grid will only occur where there isn't
+	 * already a cell in that position.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param array {objects} aoSource Layout array from _fnDetectHeader
+	 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
+	{
+		var i, iLen, j, jLen, k, kLen, n, nLocalTr;
+		var aoLocal = [];
+		var aApplied = [];
+		var iColumns = oSettings.aoColumns.length;
+		var iRowspan, iColspan;
+	
+		if ( ! aoSource )
+		{
+			return;
+		}
+	
+		if (  bIncludeHidden === undefined )
+		{
+			bIncludeHidden = false;
+		}
+	
+		/* Make a copy of the master layout array, but without the visible columns in it */
+		for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
 		{
-			_fnBindAction( nNode, {}, function (e) {
-				/* If the column is not sortable - don't to anything */
-				if ( oSettings.aoColumns[iDataIndex].bSortable === false )
+			aoLocal[i] = aoSource[i].slice();
+			aoLocal[i].nTr = aoSource[i].nTr;
+	
+			/* Remove any columns which are currently hidden */
+			for ( j=iColumns-1 ; j>=0 ; j-- )
+			{
+				if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
 				{
-					return;
+					aoLocal[i].splice( j, 1 );
 				}
-				
-				/*
-				 * This is a little bit odd I admit... I declare a temporary function inside the scope of
-				 * _fnBuildHead and the click handler in order that the code presented here can be used 
-				 * twice - once for when bProcessing is enabled, and another time for when it is 
-				 * disabled, as we need to perform slightly different actions.
-				 *   Basically the issue here is that the Javascript engine in modern browsers don't 
-				 * appear to allow the rendering engine to update the display while it is still executing
-				 * it's thread (well - it does but only after long intervals). This means that the 
-				 * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
-				 * I force an execution break by using setTimeout - but this breaks the expected 
-				 * thread continuation for the end-developer's point of view (their code would execute
-				 * too early), so we only do it when we absolutely have to.
+			}
+	
+			/* Prep the applied array - it needs an element for each row */
+			aApplied.push( [] );
+		}
+	
+		for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
+		{
+			nLocalTr = aoLocal[i].nTr;
+	
+			/* All cells are going to be replaced, so empty out the row */
+			if ( nLocalTr )
+			{
+				while( (n = nLocalTr.firstChild) )
+				{
+					nLocalTr.removeChild( n );
+				}
+			}
+	
+			for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
+			{
+				iRowspan = 1;
+				iColspan = 1;
+	
+				/* Check to see if there is already a cell (row/colspan) covering our target
+				 * insert point. If there is, then there is nothing to do.
 				 */
-				var fnInnerSorting = function () {
-					var iColumn, iNextSort;
-					
-					/* If the shift key is pressed then we are multiple column sorting */
-					if ( e.shiftKey )
+				if ( aApplied[i][j] === undefined )
+				{
+					nLocalTr.appendChild( aoLocal[i][j].cell );
+					aApplied[i][j] = 1;
+	
+					/* Expand the cell to cover as many rows as needed */
+					while ( aoLocal[i+iRowspan] !== undefined &&
+					        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
 					{
-						/* Are we already doing some kind of sort on this column? */
-						var bFound = false;
-						for ( var i=0 ; i<oSettings.aaSorting.length ; i++ )
-						{
-							if ( oSettings.aaSorting[i][0] == iDataIndex )
-							{
-								bFound = true;
-								iColumn = oSettings.aaSorting[i][0];
-								iNextSort = oSettings.aaSorting[i][2]+1;
-								
-								if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
-								{
-									/* Reached the end of the sorting options, remove from multi-col sort */
-									oSettings.aaSorting.splice( i, 1 );
-								}
-								else
-								{
-									/* Move onto next sorting direction */
-									oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
-									oSettings.aaSorting[i][2] = iNextSort;
-								}
-								break;
-							}
-						}
-						
-						/* No sort yet - add it in */
-						if ( bFound === false )
-						{
-							oSettings.aaSorting.push( [ iDataIndex, 
-								oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
-						}
+						aApplied[i+iRowspan][j] = 1;
+						iRowspan++;
 					}
-					else
+	
+					/* Expand the cell to cover as many columns as needed */
+					while ( aoLocal[i][j+iColspan] !== undefined &&
+					        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
 					{
-						/* If no shift key then single column sort */
-						if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )
-						{
-							iColumn = oSettings.aaSorting[0][0];
-							iNextSort = oSettings.aaSorting[0][2]+1;
-							if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
-							{
-								iNextSort = 0;
-							}
-							oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
-							oSettings.aaSorting[0][2] = iNextSort;
-						}
-						else
+						/* Must update the applied array over the rows for the columns */
+						for ( k=0 ; k<iRowspan ; k++ )
 						{
-							oSettings.aaSorting.splice( 0, oSettings.aaSorting.length );
-							oSettings.aaSorting.push( [ iDataIndex, 
-								oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
+							aApplied[i+k][j+iColspan] = 1;
 						}
+						iColspan++;
 					}
-					
-					/* Run the sort */
-					_fnSort( oSettings );
-				}; /* /fnInnerSorting */
-				
-				if ( !oSettings.oFeatures.bProcessing )
-				{
-					fnInnerSorting();
-				}
-				else
-				{
-					_fnProcessingDisplay( oSettings, true );
-					setTimeout( function() {
-						fnInnerSorting();
-						if ( !oSettings.oFeatures.bServerSide )
-						{
-							_fnProcessingDisplay( oSettings, false );
-						}
-					}, 0 );
-				}
-				
-				/* Call the user specified callback function - used for async user interaction */
-				if ( typeof fnCallback == 'function' )
-				{
-					fnCallback( oSettings );
+	
+					/* Do the actual expansion in the DOM */
+					$(aoLocal[i][j].cell)
+						.attr('rowspan', iRowspan)
+						.attr('colspan', iColspan);
 				}
-			} );
+			}
 		}
-		
-		
-		/**
-		 * Set the sorting classes on the header, Note: it is safe to call this function 
-		 * when bSort and bSortClasses are false
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnSortingClasses( oSettings )
+	}
+	
+	
+	/**
+	 * Insert the required TR nodes into the table for display
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDraw( oSettings )
+	{
+		/* Provide a pre-callback function which can be used to cancel the draw is false is returned */
+		var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
+		if ( $.inArray( false, aPreDraw ) !== -1 )
 		{
-			var i, iLen, j, jLen, iFound;
-			var aaSort, sClass;
-			var iColumns = oSettings.aoColumns.length;
-			var oClasses = oSettings.oClasses;
-			
-			for ( i=0 ; i<iColumns ; i++ )
+			_fnProcessingDisplay( oSettings, false );
+			return;
+		}
+	
+		var i, iLen, n;
+		var anRows = [];
+		var iRowCount = 0;
+		var asStripeClasses = oSettings.asStripeClasses;
+		var iStripes = asStripeClasses.length;
+		var iOpenRows = oSettings.aoOpenRows.length;
+		var oLang = oSettings.oLanguage;
+		var iInitDisplayStart = oSettings.iInitDisplayStart;
+		var bServerSide = _fnDataSource( oSettings ) == 'ssp';
+		var aiDisplay = oSettings.aiDisplay;
+	
+		oSettings.bDrawing = true;
+	
+		/* Check and see if we have an initial draw position from state saving */
+		if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )
+		{
+			oSettings._iDisplayStart = bServerSide ?
+				iInitDisplayStart :
+				iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
+					0 :
+					iInitDisplayStart;
+	
+			oSettings.iInitDisplayStart = -1;
+		}
+	
+		var iDisplayStart = oSettings._iDisplayStart;
+		var iDisplayEnd = oSettings.fnDisplayEnd();
+	
+		/* Server-side processing draw intercept */
+		if ( oSettings.bDeferLoading )
+		{
+			oSettings.bDeferLoading = false;
+			oSettings.iDraw++;
+			_fnProcessingDisplay( oSettings, false );
+		}
+		else if ( !bServerSide )
+		{
+			oSettings.iDraw++;
+		}
+		else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+		{
+			return;
+		}
+	
+		if ( aiDisplay.length !== 0 )
+		{
+			var iStart = bServerSide ? 0 : iDisplayStart;
+			var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
+	
+			for ( var j=iStart ; j<iEnd ; j++ )
 			{
-				if ( oSettings.aoColumns[i].bSortable )
+				var iDataIndex = aiDisplay[j];
+				var aoData = oSettings.aoData[ iDataIndex ];
+				if ( aoData.nTr === null )
+				{
+					_fnCreateTr( oSettings, iDataIndex );
+				}
+	
+				var nRow = aoData.nTr;
+	
+				/* Remove the old striping classes and then add the new one */
+				if ( iStripes !== 0 )
 				{
-					$(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
-						" "+ oSettings.aoColumns[i].sSortingClass );
+					var sStripe = asStripeClasses[ iRowCount % iStripes ];
+					if ( aoData._sRowStripe != sStripe )
+					{
+						$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
+						aoData._sRowStripe = sStripe;
+					}
 				}
+	
+				// Row callback functions - might want to manipulate the row
+				// iRowCount and j are not currently documented. Are they at all
+				// useful?
+				_fnCallbackFire( oSettings, 'aoRowCallback', null,
+					[nRow, aoData._aData, iRowCount, j] );
+	
+				anRows.push( nRow );
+				iRowCount++;
 			}
-			
-			if ( oSettings.aaSortingFixed !== null )
+		}
+		else
+		{
+			/* Table is empty - create a row with an empty message in it */
+			var sZero = oLang.sZeroRecords;
+			if ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )
 			{
-				aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
+				sZero = oLang.sLoadingRecords;
 			}
-			else
+			else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
 			{
-				aaSort = oSettings.aaSorting.slice();
+				sZero = oLang.sEmptyTable;
 			}
-			
-			/* Apply the required classes to the header */
-			for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+	
+			anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )
+				.append( $('<td />', {
+					'valign':  'top',
+					'colSpan': _fnVisbleColumns( oSettings ),
+					'class':   oSettings.oClasses.sRowEmpty
+				} ).html( sZero ) )[0];
+		}
+	
+		/* Header and footer callbacks */
+		_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
+			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+	
+		_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
+			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+	
+		var body = $(oSettings.nTBody);
+	
+		body.children().detach();
+		body.append( $(anRows) );
+	
+		/* Call all required callback functions for the end of a draw */
+		_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
+	
+		/* Draw is complete, sorting and filtering must be as well */
+		oSettings.bSorted = false;
+		oSettings.bFiltered = false;
+		oSettings.bDrawing = false;
+	}
+	
+	
+	/**
+	 * Redraw the table - taking account of the various features which are enabled
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {boolean} [holdPosition] Keep the current paging position. By default
+	 *    the paging is reset to the first page
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnReDraw( settings, holdPosition )
+	{
+		var
+			features = settings.oFeatures,
+			sort     = features.bSort,
+			filter   = features.bFilter;
+	
+		if ( sort ) {
+			_fnSort( settings );
+		}
+	
+		if ( filter ) {
+			_fnFilterComplete( settings, settings.oPreviousSearch );
+		}
+		else {
+			// No filtering, so we want to just use the display master
+			settings.aiDisplay = settings.aiDisplayMaster.slice();
+		}
+	
+		if ( holdPosition !== true ) {
+			settings._iDisplayStart = 0;
+		}
+	
+		// Let any modules know about the draw hold position state (used by
+		// scrolling internally)
+		settings._drawHold = holdPosition;
+	
+		_fnDraw( settings );
+	
+		settings._drawHold = false;
+	}
+	
+	
+	/**
+	 * Add the options to the page HTML for the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddOptionsHtml ( oSettings )
+	{
+		var classes = oSettings.oClasses;
+		var table = $(oSettings.nTable);
+		var holding = $('<div/>').insertBefore( table ); // Holding element for speed
+		var features = oSettings.oFeatures;
+	
+		// All DataTables are wrapped in a div
+		var insert = $('<div/>', {
+			id:      oSettings.sTableId+'_wrapper',
+			'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
+		} );
+	
+		oSettings.nHolding = holding[0];
+		oSettings.nTableWrapper = insert[0];
+		oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
+	
+		/* Loop over the user set positioning and place the elements as needed */
+		var aDom = oSettings.sDom.split('');
+		var featureNode, cOption, nNewNode, cNext, sAttr, j;
+		for ( var i=0 ; i<aDom.length ; i++ )
+		{
+			featureNode = null;
+			cOption = aDom[i];
+	
+			if ( cOption == '<' )
 			{
-				if ( oSettings.aoColumns[i].bSortable )
+				/* New container div */
+				nNewNode = $('<div/>')[0];
+	
+				/* Check to see if we should append an id and/or a class name to the container */
+				cNext = aDom[i+1];
+				if ( cNext == "'" || cNext == '"' )
 				{
-					sClass = oSettings.aoColumns[i].sSortingClass;
-					iFound = -1;
-					for ( j=0 ; j<aaSort.length ; j++ )
+					sAttr = "";
+					j = 2;
+					while ( aDom[i+j] != cNext )
 					{
-						if ( aaSort[j][0] == i )
-						{
-							sClass = ( aaSort[j][1] == "asc" ) ?
-								oClasses.sSortAsc : oClasses.sSortDesc;
-							iFound = j;
-							break;
-						}
+						sAttr += aDom[i+j];
+						j++;
 					}
-					$(oSettings.aoColumns[i].nTh).addClass( sClass );
-					
-					if ( oSettings.bJUI )
+	
+					/* Replace jQuery UI constants @todo depreciated */
+					if ( sAttr == "H" )
 					{
-						/* jQuery UI uses extra markup */
-						var jqSpan = $("span."+oClasses.sSortIcon,  oSettings.aoColumns[i].nTh);
-						jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ 
-							oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
-						
-						var sSpanClass;
-						if ( iFound == -1 )
-						{
-						 	sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
-						}
-						else if ( aaSort[iFound][1] == "asc" )
-						{
-							sSpanClass = oClasses.sSortJUIAsc;
-						}
-						else
-						{
-							sSpanClass = oClasses.sSortJUIDesc;
-						}
-						
-						jqSpan.addClass( sSpanClass );
+						sAttr = classes.sJUIHeader;
 					}
-				}
-				else
-				{
-					/* No sorting on this column, so add the base class. This will have been assigned by
-					 * _fnAddColumn
+					else if ( sAttr == "F" )
+					{
+						sAttr = classes.sJUIFooter;
+					}
+	
+					/* The attribute can be in the format of "#id.class", "#id" or "class" This logic
+					 * breaks the string into parts and applies them as needed
 					 */
-					$(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
-				}
-			}
-			
-			/* 
-			 * Apply the required classes to the table body
-			 * Note that this is given as a feature switch since it can significantly slow down a sort
-			 * on large data sets (adding and removing of classes is always slow at the best of times..)
-			 * Further to this, note that this code is admittedly fairly ugly. It could be made a lot 
-			 * simpler using jQuery selectors and add/removeClass, but that is significantly slower
-			 * (on the order of 5 times slower) - hence the direct DOM manipulation here.
-			 * Note that for deferred drawing we do use jQuery - the reason being that taking the first
-			 * row found to see if the whole column needs processed can miss classes since the first
-			 * column might be new.
-			 */
-			sClass = oClasses.sSortColumn;
-			
-			if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
-			{
-				var nTds = _fnGetTdNodes( oSettings );
-				
-				/* Determine what the sorting class for each column should be */
-				var iClass, iTargetCol;
-				var asClasses = [];
-				for (i = 0; i < iColumns; i++)
-				{
-					asClasses.push("");
-				}
-				for (i = 0, iClass = 1; i < aaSort.length; i++)
-				{
-					iTargetCol = parseInt( aaSort[i][0], 10 );
-					asClasses[iTargetCol] = sClass + iClass;
-					
-					if ( iClass < 3 )
+					if ( sAttr.indexOf('.') != -1 )
 					{
-						iClass++;
+						var aSplit = sAttr.split('.');
+						nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
+						nNewNode.className = aSplit[1];
 					}
-				}
-				
-				/* Make changes to the classes for each cell as needed */
-				var reClass = new RegExp(sClass + "[123]");
-				var sTmpClass, sCurrentClass, sNewClass;
-				for ( i=0, iLen=nTds.length; i<iLen; i++ )
-				{
-					/* Determine which column we're looking at */
-					iTargetCol = i % iColumns;
-					
-					/* What is the full list of classes now */
-					sCurrentClass = nTds[i].className;
-					/* What sorting class should be applied? */
-					sNewClass = asClasses[iTargetCol];
-					/* What would the new full list be if we did a replacement? */
-					sTmpClass = sCurrentClass.replace(reClass, sNewClass);
-					
-					if ( sTmpClass != sCurrentClass )
+					else if ( sAttr.charAt(0) == "#" )
 					{
-						/* We changed something */
-						nTds[i].className = $.trim( sTmpClass );
+						nNewNode.id = sAttr.substr(1, sAttr.length-1);
 					}
-					else if ( sNewClass.length > 0 && sCurrentClass.indexOf(sNewClass) == -1 )
+					else
 					{
-						/* We need to add a class */
-						nTds[i].className = sCurrentClass + " " + sNewClass;
+						nNewNode.className = sAttr;
 					}
+	
+					i += j; /* Move along the position array */
 				}
+	
+				insert.append( nNewNode );
+				insert = $(nNewNode);
 			}
-		}
-		
-		
-		
-		/**
-		 * Save the state of a table in a cookie such that the page can be reloaded
-		 *  @param {object} oSettings dataTables settings object
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnSaveState ( oSettings )
-		{
-			if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying )
+			else if ( cOption == '>' )
 			{
-				return;
+				/* End container div */
+				insert = insert.parent();
 			}
-		
-			/* Store the interesting variables */
-			var i, iLen, bInfinite=oSettings.oScroll.bInfinite;
-			var oState = {
-				"iCreate":      new Date().getTime(),
-				"iStart":       (bInfinite ? 0 : oSettings._iDisplayStart),
-				"iEnd":         (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd),
-				"iLength":      oSettings._iDisplayLength,
-				"aaSorting":    $.extend( true, [], oSettings.aaSorting ),
-				"oSearch":      $.extend( true, {}, oSettings.oPreviousSearch ),
-				"aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ),
-				"abVisCols":    []
-			};
-		
-			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+			// @todo Move options into their own plugins?
+			else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
 			{
-				oState.abVisCols.push( oSettings.aoColumns[i].bVisible );
+				/* Length */
+				featureNode = _fnFeatureHtmlLength( oSettings );
 			}
-		
-			_fnCallbackFire( oSettings, "aoStateSaveParams", 'stateSaveParams', [oSettings, oState] );
-			
-			oSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState );
-		}
-		
-		
-		/**
-		 * Attempt to load a saved table state from a cookie
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {object} oInit DataTables init object so we can override settings
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnLoadState ( oSettings, oInit )
-		{
-			if ( !oSettings.oFeatures.bStateSave )
+			else if ( cOption == 'f' && features.bFilter )
 			{
-				return;
+				/* Filter */
+				featureNode = _fnFeatureHtmlFilter( oSettings );
 			}
-		
-			var oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings );
-			if ( !oData )
+			else if ( cOption == 'r' && features.bProcessing )
 			{
-				return;
+				/* pRocessing */
+				featureNode = _fnFeatureHtmlProcessing( oSettings );
 			}
-			
-			/* Allow custom and plug-in manipulation functions to alter the saved data set and
-			 * cancelling of loading by returning false
-			 */
-			var abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] );
-			if ( $.inArray( false, abStateLoad ) !== -1 )
+			else if ( cOption == 't' )
 			{
-				return;
+				/* Table */
+				featureNode = _fnFeatureHtmlTable( oSettings );
 			}
-			
-			/* Store the saved state so it might be accessed at any time */
-			oSettings.oLoadedState = $.extend( true, {}, oData );
-			
-			/* Restore key features */
-			oSettings._iDisplayStart    = oData.iStart;
-			oSettings.iInitDisplayStart = oData.iStart;
-			oSettings._iDisplayEnd      = oData.iEnd;
-			oSettings._iDisplayLength   = oData.iLength;
-			oSettings.aaSorting         = oData.aaSorting.slice();
-			oSettings.saved_aaSorting   = oData.aaSorting.slice();
-			
-			/* Search filtering  */
-			$.extend( oSettings.oPreviousSearch, oData.oSearch );
-			$.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );
-			
-			/* Column visibility state
-			 * Pass back visibility settings to the init handler, but to do not here override
-			 * the init object that the user might have passed in
-			 */
-			oInit.saved_aoColumns = [];
-			for ( var i=0 ; i<oData.abVisCols.length ; i++ )
+			else if ( cOption ==  'i' && features.bInfo )
 			{
-				oInit.saved_aoColumns[i] = {};
-				oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];
+				/* Info */
+				featureNode = _fnFeatureHtmlInfo( oSettings );
 			}
-		
-			_fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] );
-		}
-		
-		
-		/**
-		 * Create a new cookie with a value to store the state of a table
-		 *  @param {string} sName name of the cookie to create
-		 *  @param {string} sValue the value the cookie should take
-		 *  @param {int} iSecs duration of the cookie
-		 *  @param {string} sBaseName sName is made up of the base + file name - this is the base
-		 *  @param {function} fnCallback User definable function to modify the cookie
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )
-		{
-			var date = new Date();
-			date.setTime( date.getTime()+(iSecs*1000) );
-			
-			/* 
-			 * Shocking but true - it would appear IE has major issues with having the path not having
-			 * a trailing slash on it. We need the cookie to be available based on the path, so we
-			 * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
-			 * patch to use at least some of the path
-			 */
-			var aParts = window.location.pathname.split('/');
-			var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase();
-			var sFullCookie, oData;
-			
-			if ( fnCallback !== null )
-			{
-				oData = (typeof $.parseJSON === 'function') ? 
-					$.parseJSON( sValue ) : eval( '('+sValue+')' );
-				sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),
-					aParts.join('/')+"/" );
-			}
-			else
+			else if ( cOption == 'p' && features.bPaginate )
 			{
-				sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) +
-					"; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/";
+				/* Pagination */
+				featureNode = _fnFeatureHtmlPaginate( oSettings );
 			}
-			
-			/* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
-			 * belonging to DataTables.
-			 */
-			var
-				aCookies =document.cookie.split(';'),
-				iNewCookieLen = sFullCookie.split(';')[0].length,
-				aOldCookies = [];
-			
-			if ( iNewCookieLen+document.cookie.length+10 > 4096 ) /* Magic 10 for padding */
+			else if ( DataTable.ext.feature.length !== 0 )
 			{
-				for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
+				/* Plug-in features */
+				var aoFeatures = DataTable.ext.feature;
+				for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
 				{
-					if ( aCookies[i].indexOf( sBaseName ) != -1 )
+					if ( cOption == aoFeatures[k].cFeature )
 					{
-						/* It's a DataTables cookie, so eval it and check the time stamp */
-						var aSplitCookie = aCookies[i].split('=');
-						try {
-							oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' );
-		
-							if ( oData && oData.iCreate )
-							{
-								aOldCookies.push( {
-									"name": aSplitCookie[0],
-									"time": oData.iCreate
-								} );
-							}
-						}
-						catch( e ) {}
-					}
-				}
-		
-				// Make sure we delete the oldest ones first
-				aOldCookies.sort( function (a, b) {
-					return b.time - a.time;
-				} );
-		
-				// Eliminate as many old DataTables cookies as we need to
-				while ( iNewCookieLen + document.cookie.length + 10 > 4096 ) {
-					if ( aOldCookies.length === 0 ) {
-						// Deleted all DT cookies and still not enough space. Can't state save
-						return;
+						featureNode = aoFeatures[k].fnInit( oSettings );
+						break;
 					}
-					
-					var old = aOldCookies.pop();
-					document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
-						aParts.join('/') + "/";
-				}
-			}
-			
-			document.cookie = sFullCookie;
-		}
-		
-		
-		/**
-		 * Read an old cookie to get a cookie with an old table state
-		 *  @param {string} sName name of the cookie to read
-		 *  @returns {string} contents of the cookie - or null if no cookie with that name found
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnReadCookie ( sName )
-		{
-			var
-				aParts = window.location.pathname.split('/'),
-				sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=',
-			 	sCookieContents = document.cookie.split(';');
-			
-			for( var i=0 ; i<sCookieContents.length ; i++ )
-			{
-				var c = sCookieContents[i];
-				
-				while (c.charAt(0)==' ')
-				{
-					c = c.substring(1,c.length);
-				}
-				
-				if (c.indexOf(sNameEQ) === 0)
-				{
-					return decodeURIComponent( c.substring(sNameEQ.length,c.length) );
 				}
 			}
-			return null;
-		}
-		
-		
-		/**
-		 * Return the settings object for a particular table
-		 *  @param {node} nTable table we are using as a dataTable
-		 *  @returns {object} Settings object - or null if not found
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnSettingsFromNode ( nTable )
-		{
-			for ( var i=0 ; i<DataTable.settings.length ; i++ )
+	
+			/* Add to the 2D features array */
+			if ( featureNode )
 			{
-				if ( DataTable.settings[i].nTable === nTable )
+				var aanFeatures = oSettings.aanFeatures;
+	
+				if ( ! aanFeatures[cOption] )
 				{
-					return DataTable.settings[i];
+					aanFeatures[cOption] = [];
 				}
+	
+				aanFeatures[cOption].push( featureNode );
+				insert.append( featureNode );
 			}
-			
-			return null;
 		}
-		
-		
-		/**
-		 * Return an array with the TR nodes for the table
-		 *  @param {object} oSettings dataTables settings object
-		 *  @returns {array} TR array
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnGetTrNodes ( oSettings )
+	
+		/* Built our DOM structure - replace the holding div with what we want */
+		holding.replaceWith( insert );
+		oSettings.nHolding = null;
+	}
+	
+	
+	/**
+	 * Use the DOM source to create up an array of header cells. The idea here is to
+	 * create a layout grid (array) of rows x columns, which contains a reference
+	 * to the cell that that point in the grid (regardless of col/rowspan), such that
+	 * any column / row could be removed and the new grid constructed
+	 *  @param array {object} aLayout Array to store the calculated layout in
+	 *  @param {node} nThead The header/footer element for the table
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDetectHeader ( aLayout, nThead )
+	{
+		var nTrs = $(nThead).children('tr');
+		var nTr, nCell;
+		var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
+		var bUnique;
+		var fnShiftCol = function ( a, i, j ) {
+			var k = a[i];
+	                while ( k[j] ) {
+				j++;
+			}
+			return j;
+		};
+	
+		aLayout.splice( 0, aLayout.length );
+	
+		/* We know how many rows there are in the layout - so prep it */
+		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
 		{
-			var aNodes = [];
-			var aoData = oSettings.aoData;
-			for ( var i=0, iLen=aoData.length ; i<iLen ; i++ )
-			{
-				if ( aoData[i].nTr !== null )
-				{
-					aNodes.push( aoData[i].nTr );
-				}
-			}
-			return aNodes;
+			aLayout.push( [] );
 		}
-		
-		
-		/**
-		 * Return an flat array with all TD nodes for the table, or row
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} [iIndividualRow] aoData index to get the nodes for - optional 
-		 *    if not given then the return array will contain all nodes for the table
-		 *  @returns {array} TD array
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnGetTdNodes ( oSettings, iIndividualRow )
+	
+		/* Calculate a layout array */
+		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
 		{
-			var anReturn = [];
-			var iCorrector;
-			var anTds, nTd;
-			var iRow, iRows=oSettings.aoData.length,
-				iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;
-			
-			/* Allow the collection to be limited to just one row */
-			if ( iIndividualRow !== undefined )
-			{
-				iStart = iIndividualRow;
-				iEnd = iIndividualRow+1;
-			}
-		
-			for ( iRow=iStart ; iRow<iEnd ; iRow++ )
-			{
-				oData = oSettings.aoData[iRow];
-				if ( oData.nTr !== null )
+			nTr = nTrs[i];
+			iColumn = 0;
+	
+			/* For every cell in the row... */
+			nCell = nTr.firstChild;
+			while ( nCell ) {
+				if ( nCell.nodeName.toUpperCase() == "TD" ||
+				     nCell.nodeName.toUpperCase() == "TH" )
 				{
-					/* get the TD child nodes - taking into account text etc nodes */
-					anTds = [];
-					nTd = oData.nTr.firstChild;
-					while ( nTd )
-					{
-						sNodeName = nTd.nodeName.toLowerCase();
-						if ( sNodeName == 'td' || sNodeName == 'th' )
-						{
-							anTds.push( nTd );
-						}
-						nTd = nTd.nextSibling;
-					}
-		
-					iCorrector = 0;
-					for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
+					/* Get the col and rowspan attributes from the DOM and sanitise them */
+					iColspan = nCell.getAttribute('colspan') * 1;
+					iRowspan = nCell.getAttribute('rowspan') * 1;
+					iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
+					iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
+	
+					/* There might be colspan cells already in this row, so shift our target
+					 * accordingly
+					 */
+					iColShifted = fnShiftCol( aLayout, i, iColumn );
+	
+					/* Cache calculation for unique columns */
+					bUnique = iColspan === 1 ? true : false;
+	
+					/* If there is col / rowspan, copy the information into the layout grid */
+					for ( l=0 ; l<iColspan ; l++ )
 					{
-						if ( oSettings.aoColumns[iColumn].bVisible )
+						for ( k=0 ; k<iRowspan ; k++ )
 						{
-							anReturn.push( anTds[iColumn-iCorrector] );
-						}
-						else
-						{
-							anReturn.push( oData._anHidden[iColumn] );
-							iCorrector++;
+							aLayout[i+k][iColShifted+l] = {
+								"cell": nCell,
+								"unique": bUnique
+							};
+							aLayout[i+k].nTr = nTr;
 						}
 					}
 				}
+				nCell = nCell.nextSibling;
 			}
-		
-			return anReturn;
 		}
-		
-		
-		/**
-		 * Log an error message
-		 *  @param {object} oSettings dataTables settings object
-		 *  @param {int} iLevel log error messages, or display them to the user
-		 *  @param {string} sMesg error message
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnLog( oSettings, iLevel, sMesg )
+	}
+	
+	
+	/**
+	 * Get an array of unique th elements, one for each column
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} nHeader automatically detect the layout from this node - optional
+	 *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
+	 *  @returns array {node} aReturn list of unique th's
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
+	{
+		var aReturn = [];
+		if ( !aLayout )
 		{
-			var sAlert = (oSettings===null) ?
-				"DataTables warning: "+sMesg :
-				"DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg;
-			
-			if ( iLevel === 0 )
-			{
-				if ( DataTable.ext.sErrMode == 'alert' )
-				{
-					alert( sAlert );
-				}
-				else
-				{
-					throw new Error(sAlert);
-				}
-				return;
-			}
-			else if ( window.console && console.log )
+			aLayout = oSettings.aoHeader;
+			if ( nHeader )
 			{
-				console.log( sAlert );
+				aLayout = [];
+				_fnDetectHeader( aLayout, nHeader );
 			}
 		}
-		
-		
-		/**
-		 * See if a property is defined on one object, if so assign it to the other object
-		 *  @param {object} oRet target object
-		 *  @param {object} oSrc source object
-		 *  @param {string} sName property
-		 *  @param {string} [sMappedName] name to map too - optional, sName used if not given
-		 *  @memberof DataTable#oApi
-		 */
-		function _fnMap( oRet, oSrc, sName, sMappedName )
+	
+		for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
 		{
-			if ( sMappedName === undefined )
+			for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
 			{
-				sMappedName = sName;
-			}
-			if ( oSrc[sName] !== undefined )
-			{
-				oRet[sMappedName] = oSrc[sName];
+				if ( aLayout[i][j].unique &&
+					 (!aReturn[j] || !oSettings.bSortCellsTop) )
+				{
+					aReturn[j] = aLayout[i][j].cell;
+				}
 			}
 		}
-		
-		
-		/**
-		 * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow
-		 * copy arrays. The reason we need to do this, is that we don't want to deep copy array
-		 * init values (such as aaSorting) since the dev wouldn't be able to override them, but
-		 * we do want to deep copy arrays.
-		 *  @param {object} oOut Object to extend
-		 *  @param {object} oExtender Object from which the properties will be applied to oOut
-		 *  @returns {object} oOut Reference, just for convenience - oOut === the return.
-		 *  @memberof DataTable#oApi
-		 *  @todo This doesn't take account of arrays inside the deep copied objects.
-		 */
-		function _fnExtend( oOut, oExtender )
+	
+		return aReturn;
+	}
+	
+	/**
+	 * Create an Ajax call based on the table's settings, taking into account that
+	 * parameters can have multiple forms, and backwards compatibility.
+	 *
+	 * @param {object} oSettings dataTables settings object
+	 * @param {array} data Data to send to the server, required by
+	 *     DataTables - may be augmented by developer callbacks
+	 * @param {function} fn Callback function to run when data is obtained
+	 */
+	function _fnBuildAjax( oSettings, data, fn )
+	{
+		// Compatibility with 1.9-, allow fnServerData and event to manipulate
+		_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );
+	
+		// Convert to object based for 1.10+ if using the old array scheme which can
+		// come from server-side processing or serverParams
+		if ( data && $.isArray(data) ) {
+			var tmp = {};
+			var rbracket = /(.*?)\[\]$/;
+	
+			$.each( data, function (key, val) {
+				var match = val.name.match(rbracket);
+	
+				if ( match ) {
+					// Support for arrays
+					var name = match[0];
+	
+					if ( ! tmp[ name ] ) {
+						tmp[ name ] = [];
+					}
+					tmp[ name ].push( val.value );
+				}
+				else {
+					tmp[val.name] = val.value;
+				}
+			} );
+			data = tmp;
+		}
+	
+		var ajaxData;
+		var ajax = oSettings.ajax;
+		var instance = oSettings.oInstance;
+		var callback = function ( json ) {
+			_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );
+			fn( json );
+		};
+	
+		if ( $.isPlainObject( ajax ) && ajax.data )
 		{
-			var val;
-			
-			for ( var prop in oExtender )
-			{
-				if ( oExtender.hasOwnProperty(prop) )
-				{
-					val = oExtender[prop];
-		
-					if ( typeof oInit[prop] === 'object' && val !== null && $.isArray(val) === false )
-					{
-						$.extend( true, oOut[prop], val );

  (This diff was longer than 20,000 lines, and has been truncated...)


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@doris.apache.org
For additional commands, e-mail: dev-help@doris.apache.org