Apache OODT
Copyright 2010 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This product includes the WebAppers Progress Bar, version 0.2, written by
Ray Cheung. WebAppers Progress Bar is freely distributable under the terms 
of the Creative Commons license. For details, see the WebAppers web site: 
    http://www.webappers.com/progressBar/

This product includes the Prototype JavaScript framework, version 1.5.0,
written by Sam Stephenson. Prototype is freely distributable under the terms 
of an MIT-style license. For details, see the Prototype web site: 
    http://prototype.conio.net/

This product includes the jQuery JavaScript Library, version 1.3.1, written
by John Resig. jQuery is dually licensed under the MIT and GPL licenses, and
is included in this software distribution under the MIT license. For details,
see the jQuery web site: 
    http://jquery.com/

This product includes the jQuery UI, versions 1.2.2b2 and 1.5.3, written by 
Paul Bakaus. The jQuery UI is dually licensed under the MIT and GPL licenses, 
and is included in this software distribution under the MIT license. For 
details, see the jQuery UI web site:
    http://docs.jquery.com/UI

This product includes the jQuery UI CSS Framework. The jQuery UI CSS 
Framework is dually licensed under the MIT and GPL licenses, and is included 
in this software distribution under the MIT license. For details, see the 
jQuery UI web site:
    http://jqueryui.com/about

This product includes the jQuery Alert Dialogs Plugin, version 1.1, written
by Cory S.N. LaViska for A Beautiful Site, LLC. The jQuery Alert Dialogs 
Plugin is dually licensed under the MIT and GPL licenses, and is included in 
this software distribution under the MIT license. For details, see the A
Beautiful Site web site:
    http://abeautifulsite.net/

This product includes the jQuery PeriodicalUpdater Plugin, version 2.0, 
written by Robert Fischer for Smokejumper IT and 360innovate. The jQuery
PeriodicalUpdater Plugin is dually licensed under the MIT and GPL licenses, 
and is included in this software distribution under the MIT license. For 
details, see the following websites:
     Robert Fischer (http://smokejumperit.com)
     360innovate (http://www.360innovate.co.uk)

This product includes the jQuery blockUI Plugin, version 2.15, written by
M. Alsup. The jQuery blockUI Plugin is dually licensed under the MIT and 
GPL licenses, and is included in this software distribution under the MIT 
license. For details, see:
     http://malsup.com/jquery/block/

This product includes the jQuery Cookie Plugin, written by Klaus Hartl.
The jQuery Cookie Plugin is dually licensed under the MIT and GPL licenses, 
and is included in this software distribution under the MIT license.

This product includes the jQuery Treeview Plugin, version 1.4, and the
Async Treeview extension, version 0.1, written by Jörn Zaefferer. The 
jQuery Treeview Plugin and Async Treeview are dually licensed under the MIT 
and GPL licenses, and is included in this software distribution under the 
MIT license. For details, see:
     http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
     http://docs.jquery.com/Plugins/Treeview
 
This product includes the Dynamic Tree View Control, version 0.4.0, written
by Martin Wendt. The Dynamic Tree View COntrol is licensed under the MIT
license. For details, see:
     http://dynatree.googlecode.com/

This product utilizes using v1.3.4 of Doug Lea's java.util.concurrent.

This product utilizes jsch version 0.1.42.

------------------------------------------------------------------------------
Copyright (c) 2002-2010 Atsuhiko Yamanaka, JCraft,Inc. 
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice,
     this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above copyright 
     notice, this list of conditions and the following disclaimer in 
     the documentation and/or other materials provided with the distribution.

  3. The names of the authors may not be used to endorse or promote products
     derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
