Apache Wicket
Copyright 2006-2016 The Apache Software Foundation

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

This is an aggregated NOTICE file for the Apache Wicket projects included
in this distribution.

NB: DO NOT ADD LICENSES/NOTICES/ATTRIBUTIONS TO THIS FILE, BUT IN THE
    NOTICE FILE OF THE CORRESPONDING PROJECT. THE RELEASE PROCEDURE WILL
    AUTOMATICALLY INCLUDE THE NOTICE IN THIS FILE.

---------------------------------------------------------------------------
src/./wicket-guice
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2006-2012 Apache Software Foundation

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

   This product includes Guice, developed at Google, and licensed
   under the Apache License 2.0. (http://code.google.com/p/google-guice/).
---------------------------------------------------------------------------
src/./wicket-examples
---------------------------------------------------------------------------
   Apache Wicket Examples
   Copyright 2006-2012 Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).
   
   Contains Script.aculo.us javascript library released under a MIT license.
   Copyright (c) 2005 Thomas Fuchs
   
   Contains prototype.js javascript library released under a MIT style license.
   (c) 2005 Sam Stephenson
   
   Contains behaviour.js javascript library released under BSD license.
   Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
   of Simon Willison
   
   com.meterware.httpunit.ParsedHTML is taken from HttpUnit, released
   under a MIT style license.
   Copyright (c) 2000-2004, Russell Gold
   
   Contains software developed by the Dojo foundation.
   The dojo javascript is dual licensed under the AFL and BSD license.
   Included in this software under the BSD license.
   Copyright (c) 2004-2005, The Dojo Foundation

   This product includes software developed by the Spring Framework Project
   (http://www.springframework.org).

   This product includes software developed by the CGLib Project
   (http://cglib.sourceforge.net).

   This product includes ASM, released under a BSD style license (http://asm.objectweb.org).
   Copyright (c) 2000-2005 INRIA, France Telecom

   This product includes software developed by
   Joda.org (http://www.joda.org/).

   This product includes jhighlight (https://jhighlight.dev.java.net/)
   which is released under CDDL 1.0 license (http://www.opensource.org/licenses/cddl1.php).

---------------------------------------------------------------------------
src/./wicket-core
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2006-2012 Apache Software Foundation

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

   This product includes software from QOS.ch (http://slf4j.org) licensed under the X11 license
   Copyright (c) 2004-2008 QOS.ch
   
   This product includes software developed by the jQuery Foundation (http://jquery.com/), released under MIT.

   Contains Diff library from Mavens JRCS, released under
   The Apache Software License, Version 1.1.
   (c) 1999-2003

   org.apache.wicket.markup.html.form.upload.MultiFileUploadField.js is taken from [1]
   and has the following notice:
      "Licence:
       Use this however/wherever you like, just don't blame me if it breaks
       anything.

       Credit:
       If you're nice, you'll leave this bit:

       Class by Stickman -- http://www.the-stickman.com
       with thanks to:
       [for Safari fixes]
          Luis Torrefranca -- http://www.law.pitt.edu
          and
          Shawn Parker & John Pennypacker -- http://www.fuzzycoconut.com
       [for duplicate name bug]
          'neal'"
   [1]: http://the-stickman.com/web-development/javascript/upload-multiple-files-with-a-single-file-element/

---------------------------------------------------------------------------
src/./wicket-datetime
---------------------------------------------------------------------------
   Apache Wicket Date Time
   Copyright 2006-2012 Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).
   
   Contains code of the Yahoo User Interface library (version: 2.8.2r1),
   released under the BSD License:
   http://developer.yahoo.net/yui/license.txt
   Copyright (c) 2010, Yahoo! Inc.

   This product includes software developed by
   Joda.org (http://www.joda.org/).
   
