<!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.
-->
<!--[if gt IE 8]> 
<script type="text/javascript">
function Redirect() {
               window.location.assign("login.jsp");
            }
Redirect();
</script>
<![endif]-->
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if gt IE 7]>
        <script src="js/external_lib/es5-shim.min.js"></script>
        <script src="js/external_lib/respond.min.js"></script>
    <![endif]-->
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Atlas</title>
    <link href='https://fonts.googleapis.com/css?family=Raleway:400,400italic,700,700italic' rel='stylesheet' type='text/css'>
    <link href="js/libs/font-awesome/css/font-awesome.min.css" rel="stylesheet">
    <link rel="stylesheet" href="js/libs/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="css/bootstrap-sidebar.css" />
    <link rel="stylesheet" type="text/css" href="css/style.css">
</head>

<body>
    <div id="wrapper">
        <!-- Sidebar Begin -->
        <div id="sidebar-wrapper">
            <ul class="sidebar-nav">
                <li class="sidebar-brand">
                    <a href="#"><i class="fa fa-globe"></i> Apache <strong>Atlas</strong></a>
                    <!-- <a href="#menu-toggle" class="pull-right" id="menu-toggle"><i class="fa fa-bars"></i></a> -->
                </li>
            </ul>
        </div>
        <!-- Sidebar End -->
        <!-- Page Content Begin -->
        <div id="page-content-wrapper">
            <header class="clearfix">
                <div style="visibility: hidden;" class="input-group col-sm-4 pull-right main-search">
                    <input type="text" class="form-control" placeholder="Search...">
                </div>
            </header>
            <div class="page-title clearfix">
                <h3>Please note that Atlas does not supports old version of Internet Explorer.</h3>
                <p>We recommend upgrading to the latest <a href='https://www.microsoft.com/en-gb/download/internet-explorer.aspx'>Internet Explorer</a>, <a href='https://www.google.co.in/chrome/browser/desktop/'>Google Chrome</a>, or <a href='https://www.mozilla.org/en-US/firefox/new/'>Firefox</a>.</p>
            </div>
        </div>
        <!-- Page Content End -->
    </div>
</body>

</html>
