<!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
&quot;License&quot;); 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 &quot;AS IS&quot; 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 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">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>Pony Mail!</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/solar.css" rel="alternate stylesheet" type="text/css" title="Solar theme" media="all">
    <link href="css/metro.css" rel="alternate stylesheet" type="text/css" title="Metropolis" media="all">
    <link href="css/popup.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body style="margin: 0px;" onload="oauthWelcome(document.location.search.substr(1));">
    
    <div class="container-fluid">
      
    <div class="row">
      <div id="bread" class="col-md-12" style="text-align: center">
        <a href="./">
        <img src="images/logo_large.png" width="256" height="233"/><br/>
        </a>
        <p>
          <h3>Log in using one of the following identity providers:</h3>
          <br/>
        </p>
        <p style="margin: 0 auto; font-size: 16pt; max-width: 640px;" id="oauthtypes">
          
        </p>
      </div>
      
      </div>
    </div>
    <div class="row">
      <!-- Popup box for various notices -->
     <div style="display: none;" class="bs-callout bs-callout-success fade-in" id="popupper" style="margin: 2px !important; padding: 5px;"></div>
    </div>
    <div id="splash" class="splash fade-in"> &nbsp; </div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>
    <script src="js/config.js"></script>
    <script src="js/ponymail.js"></script>
    <script src="js/oauth.js"></script>
  </body>
</html>