Apache AsterixDB
Copyright 2016 The Apache Software Foundation

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

AsterixDB utilizes many libraries, which come with the following applicable NOTICE(s):

 - lib/hyracks-api-0.2.17-incubating.jar

    hyracks-api
    Copyright 2016 The Apache Software Foundation

 - lib/hyracks-comm-0.2.17-incubating.jar

    hyracks-comm
    Copyright 2016 The Apache Software Foundation

 - lib/hyracks-control-cc-0.2.17-incubating.jar

    hyracks-control-cc
    Copyright 2016 The Apache Software Foundation

 - lib/hyracks-control-common-0.2.17-incubating.jar

    hyracks-control-common
    Copyright 2016 The Apache Software Foundation

 - lib/hyracks-control-nc-0.2.17-incubating.jar

    hyracks-control-nc
    Copyright 2016 The Apache Software Foundation

 - lib/hyracks-ipc-0.2.17-incubating.jar

    hyracks-ipc
    Copyright 2016 The Apache Software Foundation

 - lib/hyracks-net-0.2.17-incubating.jar

    hyracks-net
    Copyright 2016 The Apache Software Foundation

 - lib/wicket-core-1.5.2.jar
   Apache Wicket
   Copyright 2006-2011 Apache Software Foundation

   This product includes software from QOS.ch (http://slf4j.org) licensed under the X11 license
   Copyright (c) 2004-2008 QOS.ch

   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/
 - lib/wicket-request-1.5.2.jar

    Wicket Request
    Copyright 2006-2011 Apache Software Foundation

 - lib/wicket-util-1.5.2.jar

    Wicket Util
    Copyright 2006-2011 Apache Software Foundation
