<!DOCTYPE html>
<!--
 * 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.    
-->
<html manifest="/cache-manifest.cmf">
<head>
<title>Page not found</title>
<meta name="viewport" content="width=device-width user-scalable=no initial-scale=1.0"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<link rel="stylesheet" type="text/css" href="/ui-min.css"/>
<script type="text/javascript" src="/all-min.js"></script>
<script type="text/javascript" src="/menu.js"></script>
</head>
<body class="delayed">
<div id="bodydiv" class="bodydiv" onload="ui.onload();" onbeforeunload="ui.onbeforeunload();">

<div id="headdiv" class="hsection">
<script type="text/javascript" src="/headconfig.js"></script>
</div>

<div id="menu"></div>

<table style="width: 100%;">
<tr><td><h2><span id="h1"></span></h2></td></tr>
</table>

<div style="margin-left: auto; margin-right: auto; text-align: center;">
<div class="hd2">Sorry, that page was not found.</div>
<div>You may have clicked an expired link or mistyped the address.</div>
</div>

<script type="text/javascript">
ui.initbody();

// Set page title
$('h1').innerHTML = hometitle(window.location.hostname);

// Load the menu bar
if (!issubdomain(window.location.hostname))
    displaymenu();
</script>

<div id="footdiv" class="fsection">
<script type="text/javascript" src="/footconfig.js"></script>
</div>

</div>
</body>
</html>
