<!--
  ~ 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.
  -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Continuum</title>

  <link rel="stylesheet" type="text/css" href="continuum_files/tigris.css" media="screen">
  <link rel="stylesheet" type="text/css" href="continuum_files/print.css" media="print">

  <script src="continuum_files/tigris.js" type="text/javascript"></script></head>

<body onload="focus()" class="composite">

<div id="banner">
  <table border="1" cellpadding="8" cellspacing="0" width="100%">
    <tbody><tr>
      <td>
        <a href="http://www.apache.org/">
          Your company logo here
        </a>
      </td>
      <td>
        <a href="http://maven.apache.org/continuum">
          <img src="continuum_files/continuum_logo_75.gif" alt="Continuum" align="right" border="0">
        </a>
      </td>
    </tr>
    </tbody></table>
</div>

<div id="breadcrumbs">
  <div style="float: right">
    <a href="http://maven.apache.org/continuum">Continuum</a> |
    <a href="http://maven.apache.org/">Maven</a> |
    <a href="http://www.apache.org/">Apache</a>
  </div>

  <div>
    Welcome, <b>Guest</b> | <a href="login.html">Login</a>
  </div>
</div>

<table id="main" border="0" cellpadding="4" cellspacing="0" width="100%">
  <tbody><tr valign="top">
    <td id="leftcol" width="30%">
      <div id="navcolum">
        <div id="projectmenu" class="toolgroup">
          <div class="label">Continuum</div>

          <div class="body">
            <div><a href="index.html">Show Projects</a></div>

            <div><a href="schedule.html">View Build Schedule</a></div>
          </div>
        </div>

        <div id="projecttools" class="toolgroup">
          <div class="label">Add Project</div>

          <div class="body">
            <div><a href="addMaven2Project.html">Maven 2.0+ Project</a></div>

            <div><a href="addMaven1Project.html">Maven 1.x Project</a></div>

            <div><a href="addAntProject.html">Ant Project</a></div>

            <div><a href="addShellProject.html">Shell Project</a></div>
          </div>
        </div>

        <div id="projectimport" class="toolgroup">
          <div class="label">Import Project</div>

          <div class="body">
            <div>
              <a href="addCruiseControlProject.html">CruiseControl</a>
            </div>
          </div>
        </div>

      </div>
    </td>
    <td>
      <div id="bodycol">
        <div class="app">
          <div id="h3">
            <h3>Build Schedule</h3>

            <table width="100%">
              <tr>
                <th colspan="4">Recently Completed (last hour)</th>
              </tr>
              <tr>
                <th width="10%">Time</th><th>Build</th><th width="20%">Profile</th><th width="10%">&nbsp;</th>
              </tr>
              <tr>
                <td>1/5/04 10:00am</td><td><a href="viewGroup.html">Plexus (Group)</a></td><td><a
                      href="viewProfile.html">Maven 2.0 Default</a></td><td><a href="viewBuild.html">Details</a></td>
              </tr>
            </table>
            <br/>
            <table width="100%">
              <tr>
                <th colspan="4">In Progress</th>
              </tr>
              <tr>
                <th width="10%">&nbsp;</th><th>Build</th><th width="20%">Profile</th><th width="10%">&nbsp;</th>
              </tr>
              <tr>
                <td>In progress</td><td><a href="viewProject.html">plexus-utils</a></td><td><a
                      href="viewProfile.html">Maven 2.0 Default</a></td><td><a href="#">Cancel</a></td>
              </tr>
            </table>
            <br/>
            <table width="100%">
              <tr>
                <th colspan="4">Coming Up (next 2 hours)</th>
              </tr>
              <tr>
                <th width="10%">Time</th><th>Build</th><th width="20%">Profile</th><th width="10%">&nbsp;</th>
              </tr>
              <tr>
                <td>1/5/04 11:00am</td><td><a href="viewProject.html">plexus-utils</a></td><td><a
                      href="viewProfile.html">JDK 1.3, Clean checkout</a></td><td><a href="schedule.html">Build
                Now</a> | <a href="schedule.html">Skip</a></td>
              </tr>
              <tr>
                <td>1/5/04 12:00pm</td><td><a href="viewGroup.html">Plexus (Group)</a></td><td><a
                      href="viewProfile.html">Maven 2.0 Default</a></td><td><a href="schedule.html">Build Now</a>
                | <a href="schedule.html">Skip</a></td>
              </tr>
              <tr>
                <td>&nbsp;</td><td><a href="viewProject.html">plexus-utils</a></td><td><a href="viewProfile.html">JDK
                1.3, Clean checkout</a></td><td><a href="schedule.html">Build
                Now</a> | <a href="schedule.html">Skip</a></td>
              </tr>
            </table>
          </div>
        </div>
      </div>
    </td>
  </tr>
  </tbody></table>

<div id="footer">
  <table border="0" cellpadding="4" cellspacing="0">
    <tbody><tr>
      <td>
        Continuum &#169; 2005 Apache Software Foundation
      </td>
    </tr>
    </tbody></table>
</div>

</body></html>