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

a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
  background: none;
  padding-right: 0;
}

body ul {
  list-style-type: square;
}

#downloadbox {
  float: right;
  margin-left: 2em;
  padding-left: 1em;
  padding-right: 1em;
  padding-bottom: 1em;
  border: 1px solid #999;
  background-color: #eee;
  width: 17.5em;
}

#downloadbox h5 {
  color: #000;
  margin: 0;
  border-bottom: 1px solid #aaaaaa;
  font-size: smaller;
  padding: 0;
  margin-top: 1em;
}

#downloadbox p {
  margin-top: 1em;
  margin-bottom: 0;
}

#downloadbox li {
  text-indent: inherit;
}

div.p {
  margin-top: 5px;
  margin-bottom: 10px;
}

pre.commandline {
  border: 1px solid #bbb;
  background-color: white;
  margin-top: 5px;
  margin-bottom: 5px;
  font-size: 10pt;
  padding: 15px;
  color: gray;
}

pre.commandline .input {
  color: #55f;
}

pre.commandline .command {
  color: black;
  font-weight: bold;
}

#banner {
  background: none;
}

#banner img {
  margin: 2px;
}

