/*
  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.
*/

body {
  background-color:#F6F4F2;
  font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size:16px;
}

h1, ul, li {
  margin:0px;
  padding:0px;
}

#header {
  background-color:#515151;
  background:#515151 -webkit-gradient(
    linear,
    left top,
    left bottom,
    color-stop(0.2, #515151),
    color-stop(0.8, #302F2D)
  );
  background:-moz-linear-gradient(center bottom , #515151 20%, #747474 80%);
  border-top:1px solid #919192;
  height:32px;
  left:0px;
  position:fixed;
  top:0px;
  width:100%;
  z-index:1;
}
#subheader {
  background-color:#CBCBCB;
  background:-webkit-gradient(linear,
    left top,
    left bottom,
    color-stop(0.0, #F9F9F9),
    color-stop(1.0, #CBCBCB)
  );
  background:-moz-linear-gradient(center bottom , #CBCBCB 0%, #F9F9F9 100%);
  border-top:1px solid #383A3C;
  border-bottom:1px solid #919395;
  height:32px;
  left:0px;
  position:fixed;
  top:32px;
  width:100%;
  z-index:1;
}
#sidebar {
  background-color:#ECEAE7;
  bottom:0px;
  left:0px;
  overflow:auto;
  padding:20px 40px 0px 0px;
  position:fixed;
  text-align:right;
  top:66px;
  width:180px;
  z-index:1;
}
#scrollable {
  bottom:0px;
  left:220px;
  position:fixed;
  overflow:auto;
  right:0px;
  top:64px;
}
#content {
/*  top:64px;*/
/*  bottom:0px;*/
/*  right:0px;*/
/*  left:220px;*/
/*  margin:64px auto 0px 220px;*/
  margin:20px 60px;
/*  position:absolute;*/
/*  overflow:auto;*/
  z-index:0;
}

#header h1,
#header h1 a,
#subheader h1 {
  color:#F6F4F2;
  font-size:18px;
  font-weight:normal;
  line-height:32px;
  margin:0px;
  text-align:center;
  text-shadow:0px -1px 1px #222222;
}

#header h1 a strong {
  font-weight:bold;
}

#header h1 {
  text-align:left;
  margin-left:20px;
}

#subheader h1 {
  color:#000000;
  text-shadow:#FFFFFF 0px 1px 0px;
}

#header small,
#subheader small {
  color:#EFEFEF;
  font-size:14px;
  line-height:32px;
  position:absolute;
  top:0px;
  right:20px;
  text-shadow:-1px 1px 1px #666666;
}

#sidebar .vertical_divider {
  background-color:#CCCCCC;
  bottom:0px;
  border-right:1px solid #FFFFFF;
  position:absolute;
  top:0px;
  right:0px;
  width:1px;
}

#sidebar h1 {
  color:#000000;
  font-size:18px;
  padding:0px;
  margin:30px 0px;
  font-weight:normal;
  text-shadow:#FFFFFF 0px 1px 0px;
}

#sidebar ul,
#sidebar li {
  margin:0px;
  padding:0px;
}
#sidebar li,
#sidebar li a {
  color:#767573;
  font-size:14px;
  list-style:none;
  margin:15px 0px;
  text-shadow:#FFFFFF 0px 1px 1px;
}
#sidebar li a {
  -webkit-transition:color .15s ease-out;
  -moz-transition:color .15s ease-out;
  -o-transition:color .15s ease-out;
}
#sidebar li a:hover {
  color:#242220;
  -webkit-transition:color .15s ease-in;
  -moz-transition:color .15s ease-in;
  -o-transition:color .15s ease-in;
}


#otherbar {
  display:none;
}

#content {
  font-size:13px;
  line-height:160%;
  max-width:750px;
}

#content h1 {
  border-bottom:2px solid;
  font-size:2em;
  font-weight:normal;
  margin:2.0em 0px 1.3em 0px;
  padding-bottom:0.6em;
}
#content h2 {
  color:#242220;
  font-size:1.4em;
  font-weight:bold;
  margin:1.3em 0px 0.8em 0px;
  text-shadow:#FFFFFF 0px 1px 1px;
}
#content h3 {
  font-size:1.1em;
  font-weight:bold;
  margin:0.8em 0px 0.5em 0px;
  text-shadow:#FFFFFF 0px 1px 1px;
}

hr {
  display:none;
  border:none;
  margin:40px 0px;
  border-top:1px solid #CCCCCC;
  border-bottom:1px solid #FFFFFF;
}

p,blockquote,pre,ul {
  margin:1em 0px;
}

blockquote {
  color:#767573;
	font-style:normal;
  margin-left:35px;
  padding-left:20px;
	position:relative;
	text-shadow:#FFFFFF 0px 1px 0px;
}
blockquote code {
	font-style: normal;
}
blockquote p {
  padding:10px 0px;
}
blockquote::before {
  font-style: normal;
  content: '\201C';
  font-size: 450%;
  font-family:Georgia, Palatino, 'Times New Roman', Times;;
  position: absolute;
  left: -25px;
  top:0.3em;
  color: #E0E0E0;
}

ul {
  margin-left:40px;
}
ul > li {
	list-style:disc;
	list-style-position:outside;
}
ul ul {
  margin-bottom:0.5em;
  margin-top:0.5em;
}



code {
	font-family:"DejaVu", "Monaco", "Courier New", "Courier";
	font-size:90%;
	padding:2px 4px;
	white-space:pre-wrap;;
}

pre {
/*    border:1px solid #CCCCCC;*/
    background:#F2F0EE;
    -webkit-border-radius:11px;
    -moz-border-radius:11px;
    border-radius:11px;
    display:block;
    line-height:110%;
    margin:1.5em 0px 3em 0px;
    padding:15px 20px;
    white-space:pre-wrap;
}
pre code {
  background:none;
	border:none;
	font-size:11px;
	padding:0px;
}

a[href] {
/*  color:inherit;*/
  color:#F06433;
  text-decoration:none;
  text-shadow:#FFF 0px 1px 0px;
}
a[href]:hover {
  color:#d0410f;
}

.prettyprint a[href],
.prettyprint a[href] span {
  text-decoration:underline;
  text-shadow:none;
}
.prettyprint a[href] :hover,
.prettyprint a[href] span :hover {
  text-decoration:none;
}

code a[href] {
  color:inherit;
/*  border-bottom:1px dotted #000000;*/
  text-decoration:underline;
}
code a[href]:hover {
  color:inherit;
  text-decoration:none;
}

a[href].external:after {
	content: "*";
	font-style: super;
	opacity: .5;
}

#index {
	-webkit-column-width: 235px;
	-webkit-column-rule-width: 5px;
	-moz-column-width: 235px;
	-moz-column-rule-width: 5px;
	column-width: 235px;
	column-rule-width: 5px;
}

#index h2:after,
#index h3:after { 
  content:"";
}

#index h2 { 
  margin:0px;
  padding:0px;
}

#index {
  padding: 10px 1px;
}

#index ul {
	margin:0px 0px 30px 0px;
	padding:0;
}

#index ul li {
	list-style: none;
}

#index ul li a {

}

#home h1 {
  border-bottom:1px solid #919395;
  padding-bottom:20px;
  margin:30px 0px;
}

#home h2 {
  font-weight:normal;
  margin:0px 0px 10px 0px;
  padding:0px;
}

#home h2:after {
  content:'';
}

#home h2 a {
  text-shadow:#FFFFFF 0px 1px 1px;
}

#home span {
  color:#8B8078;
  font-size:14px;
  text-shadow:#FFFFFF 0px 1px 0px;
}

#home ul {
  float:left;
  margin:0px;
  padding:0px;
}
#home ul li {
  float:left;
  height:120px;
  list-style:none;
  margin:0px;
  padding:0px 20px;
  width:200px;
}

/*
Class compatability tables "compat";
Apply nested TD classes "y"/"n", "p" (partial), or "u" (unknown).
Results in green/red/gold/gray background & auto-inserts check/X char.
Assumes table is 2D grid, with single TH preceding TDs in body of table.
*/

.compat .y { background-color: lightgreen; }
.compat .y::before { content: "\2714";     margin-right: 6px;  }

.compat .n { background-color: pink; }
.compat .n::before { content: "\2718"; margin-right: 6px;  }

.compat .p { background-color: gold; }

.compat .u { background-color: #dddddd; }

/* center cell & straddled column heads by default */

.compat td , th[colspan]:first-of-type { text-align: center }
.compat tr>th:first-of-type { text-align: right }
