/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
.nav li {
  /*padding: 2.5% 0;*/
  /*color: #3C3C3C;*/ }

/*.nav li:hover {*/
/*border-bottom: 2px solid #CE5650;*/
/*color: black;*/
/*}*/
/*.nav li.selected {*/
/*font-weight: bolder;*/
/*color: #3C3C3C;*/
/*letter-spacing: 0.03em;*/
/*border-bottom: 2px solid #CE5650;*/
/*}*/
.nav a,
.nav a:visited {
  display: table-cell;
  text-align: center;
  text-decoration: none;
  color: black; }

/*# sourceMappingURL=data:application/json;base64,ewoJInZlcnNpb24iOiAzLAoJImZpbGUiOiAic3JjL3N0eWxlL25hdi5jc3MiLAoJInNvdXJjZXMiOiBbCgkJInNyYy9hcHAvZncvbmF2L25hdi5jc3MiCgldLAoJIm1hcHBpbmdzIjogIkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFJSCxJQUFJLENBQUMsRUFBRSxDQUFDO0VBQ0osb0JBQW9CO0VBQ3BCLG1CQUFtQixFQUN0Qjs7QUFDRCxtQkFBbUI7QUFDZixxQ0FBcUM7QUFDckMsaUJBQWlCO0FBQ3JCLEtBQUs7QUFDTCxzQkFBc0I7QUFDbEIsd0JBQXdCO0FBQ3hCLG1CQUFtQjtBQUNuQiwyQkFBMkI7QUFDM0IscUNBQXFDO0FBQ3pDLEtBQUs7QUFFTCxJQUFJLENBQUMsQ0FBQztBQUNOLElBQUksQ0FBQyxDQUFDLEFBQUEsUUFBUSxDQUFDO0VBQ1gsT0FBTyxFQUFFLFVBQVc7RUFDcEIsVUFBVSxFQUFFLE1BQU87RUFDbkIsZUFBZSxFQUFFLElBQUs7RUFDdEIsS0FBSyxFQUFFLEtBQU0sR0FDaEIiLAoJIm5hbWVzIjogW10KfQ== */