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

.responseheader {
        color:blue;
        font-size:10pt;
        font-weight:bold;
        text-align:left;
        font-family:verdana, arial, sans-serif;
        margin-left:10px;
        }

.responsetext {
        color:#222222;
        font-size:8pt;
        font-weight:normal;
        text-align:left;
        font-family:verdana, arial, sans-serif;
        margin-left:20px;
        }

.responseTreeWrapper {
        color:black;
        background:#ffffff;
        font-size:8pt;
        font-weight:normal;
        font-family:verdana, arial, sans-serif;
        text-align:left;
        text-decoration:none;
        margin-left:12px;
        margin-top:2px;
        border-top:1px solid black;
        border-left:1px solid black;
        }

.responseSelected {
        background:#BBBBBB;
        border:1px dashed black;
        }
.forummenuwrapper {
        color:#8B008B;
        background:#D4D0C8;
        font-size:10pt;
        text-decoration:none;
        margin-left:12px;
        margin-right:20px;
        float:right;
        text-align:right;
        max-width:50%;
        padding-left:14px;
        }
.forumheader {
        color:black;
        font-size:12pt;
        font-weight:bold;
        text-align:left;
        font-family:verdana, arial, sans-serif;
        margin-left:10px;
        }

.forumtext {
        color:#222222;
        font-size:12pt;
        font-weight:normal;
        text-align:left;
        font-family:verdana, arial, sans-serif;
        margin-left:20px;
        }

.forumtitle{
        color:#8B008B;
        background:#D4D0C8;
        font-size:22pt;
        font-weight:bold;
        text-align:left;
        font-family:verdana, arial, sans-serif;
        text-decoration:none;
        display:inline;
        float:left;
        }

.forumtitleboxed {
        color:#8B008B;
        background:#D4D0C8;
        font-size:22pt;
        text-decoration:none;
        border:1px solid black;
        padding:4px;
        display:inline;
        float:left;
        }

.forumhr {
        color:#8B008B;
        background:#D4D0C8;
        border:1px solid #8B008B;
        padding:4px;
        height:22pt;
        }

.forumwrapper {
        background:#D4D0C8;
        border:1px solid #8B008B;
        padding:4px;
        margin-top:6px;
        font-size:12pt;
        font-weight:normal;
        text-align:left;
        font-family:verdana, arial, sans-serif;
        }

.forumcontentwrapper {
        background:#f8f8f8;
        border:1px solid #000000;
        padding:4px;
        margin-top:6px;
        color:black;
        font-size:12pt;
        font-weight:normal;
        text-align:left;
        font-family:verdana, arial, sans-serif;
        }
