<!--
   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>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<link rel='stylesheet' type='text/css' href='help.css'/>
<style type='text/css'>
a.navLink {
 color:navy;
}
a.navLink-external {
 color:navy;
}
a.navLink:visited {
 color:navy;
}
a.navLink-external:visited {
 color:navy;
}
#asf-logo{
    width: 200px;
    height: 51px;
}
</style>
</head>
<body>

<table width="100%" height="100%" style="border-right:1px solid #a0a0a0;">

<tr><td align="left">
<a target='topic' class='navLinkSection' href='docs/click.html' title=' Click Overview'>
Click </a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/user-guide.html' title=' User Guide'>
User Guide</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/downloads.html' title=' Downloads'>
Downloads</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/quick-start.html' title=' Click Quick Start Guide'>
Quick Start Guide</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/faq.html' title=' Frequently Asked Questions'>
FAQ</a>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkTopic' href='docs/click-cheat-sheet.pdf' title=' Click Framework Cheat Sheet'>
Cheat Sheet PDF</a>
<img src='images/external.png' align='baseline' border='0' alt="External link"/>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/roadmap-changes.html' title=' RoadMap and Changes'>
RoadMap &amp; Changes</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/developer-guide/developer-guide.html' title=' Guide for developers and contributors'>
Developer Guide</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/who-we-are.html' title=' Who we are'>
Who we are</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkSection' href='docs/javadoc.html' title=' Click Javadoc API'>
Javadoc</a>
</td></tr>

<tr><td>
<a target="topic" class="navLinkTopic" href="docs/click-api/overview-summary.html" title=" Click Javadoc API">
Click API</a>
</td></tr>

<tr><td>
<a target="topic" class="navLinkTopic" href="docs/extras-api/overview-summary.html" title=" Click Extras Javadoc API" >
Extras API</a>
</td></tr>

<tr><td>
<a target="topic" class="navLinkTopic" href="docs/mock-api/overview-summary.html" title=" Click Extras Javadoc API">
Mock API</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkSection' href='docs/click-online.html' title=' Click Online'>
Click Online</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/examples.html' title=' Example Applications'>
Examples</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/extensions.html' title=' Extension Projects'>
Extension Projects</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/click-online.html#mailing-lists' title=' Mailing Lists'>
Mailing Lists</a>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkTopic' href='https://issues.apache.org/jira/browse/CLK' title=' Issue Tracker'>
Issue Tracker</a>
<img src='images/external.png' align='baseline' border='0' alt="External link"/>
</td></tr>

<tr><td>
<a target='topic' class='navLinkSection' style="color:navy;" href='docs/click-ide.html' title=' ClickIDE Eclipse Plugin'>
ClickIDE</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' style="color:navy;" href='docs/click-ide-roadmap-changes.html' title=' ClickIDE RoadMap and Changes'>
RoadMap &amp; Changes</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/click-ide-downloads.html' title=' ClickIDE Download'>
Downloads</a>
</td></tr>

<tr><td>
<img src='images/book.gif' align='absbottom' border='0' alt="External link"/>&nbsp;
References </a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/velocity/velocity.html' title=' Velocity'>
Velocity </a>
</td></tr>

<tr><td>
<a target="_blank" class="navLinkTopic" href="http://www.w3.org/TR/html401/" title=" W3C HTML 4.01 Specification" >
HTML 4.01 </a>
<img border="0" align="baseline" src="images/external.png" alt="External link"/>
</td></tr>

<tr><td>
<a target="_blank" class="navLinkTopic" href="http://www.w3.org/TR/CSS21/" title=" W3C CSS 2.1 Specification">
CSS 2.1 </a>
<img border="0" align="baseline" src="images/external.png" alt="External link"/>
</td></tr>

<tr><td>
<a target="_blank" class="navLinkTopic" href="http://download.oracle.com/javaee/1.4/api/javax/servlet/http/package-summary.html" title=" Servlet 2.4 Javadoc API">
Servlet 2.4 API</a>
<img border="0" align="baseline" src="images/external.png" alt="External link"/>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkTopic' href='http://www.apache.org/security/' title=' Security'>
Security</a>
<img border="0" align="baseline" src="images/external.png" alt="External link"/>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkSection' href='http://www.apache.org/' title=' Apache'>
Apache</a>
<img border="0" align="baseline" src="images/external.png" alt="External link"/>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkTopic' href='http://www.apache.org/licenses/' title=' License'>
License</a>
<img border="0" align="baseline" src="images/external.png" alt="External link"/>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkTopic' href='http://www.apache.org/foundation/sponsorship.html' title=' Sponsorship'>
Sponsorship</a>
<img border="0" align="baseline" src="images/external.png" alt="External link"/>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkTopic' href='http://apache.org/foundation/thanks.html' title=' Thanks'>
Thanks</a>
        <img border="0" align="baseline" src="images/external.png" alt="External link"/>
</td></tr>


<tr height="100%">
<td>&nbsp;</td>
</tr>

</table>

</body>
</html>