Apache NiFi
Copyright 2014-2017 The Apache Software Foundation

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

===========================================
Apache Software License v2
===========================================

The following binary components are provided under the Apache Software License v2

  (ASLv2) Apache NiFi
    The following NOTICE information applies:
        Apache NiFi
        Copyright 2014-2017 The Apache Software Foundation

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

        This product includes the following work from the Apache Hadoop project:

        BoundedByteArrayOutputStream.java adapted to SoftLimitBoundedByteArrayOutputStream.java

  (ASLv2) Jetty
    The following NOTICE information applies:
       Jetty Web Container
       Copyright 1995-2015 Mort Bay Consulting Pty Ltd.

  (ASLv2) Apache Commons IO
    The following NOTICE information applies:
      Apache Commons IO
      Copyright 2002-2012 The Apache Software Foundation

  (ASLv2) Apache Commons Net
    The following NOTICE information applies:
      Apache Commons Net
      Copyright 2001-2013 The Apache Software Foundation

  (ASLv2) Apache Commons Collections
    The following NOTICE information applies:
      Apache Commons Collections
      Copyright 2001-2013 The Apache Software Foundation

  (ASLv2) Apache Commons Compress
    The following NOTICE information applies:
      Apache Commons Compress
      Copyright 2002-2014 The Apache Software Foundation

      The files in the package org.apache.commons.compress.archivers.sevenz
      were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/),
      which has been placed in the public domain:

      "LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html)

  (ASLv2) Apache Commons Codec
    The following NOTICE information applies:
      Apache Commons Codec
      Copyright 2002-2014 The Apache Software Foundation

      src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
      contains test data from http://aspell.net/test/orig/batch0.tab.
      Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)

      ===============================================================================

      The content of package org.apache.commons.codec.language.bm has been translated
      from the original php source code available at http://stevemorse.org/phoneticinfo.htm
      with permission from the original authors.
      Original source copyright:
      Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

  (ASLv2) Apache HttpComponents
    The following NOTICE information applies:
      Apache HttpClient
      Copyright 1999-2015 The Apache Software Foundation

      Apache HttpCore
      Copyright 2005-2015 The Apache Software Foundation

      Apache HttpMime
      Copyright 1999-2013 The Apache Software Foundation

      This project contains annotations derived from JCIP-ANNOTATIONS
      Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net

  (ASLv2) Apache Jakarta HttpClient
    The following NOTICE information applies:
      Apache Jakarta HttpClient
      Copyright 1999-2007 The Apache Software Foundation

  (ASLv2) Apache Commons Logging
    The following NOTICE information applies:
      Apache Commons Logging
      Copyright 2003-2014 The Apache Software Foundation

  (ASLv2) Apache Commons Lang
    The following NOTICE information applies:
      Apache Commons Lang
      Copyright 2001-2015 The Apache Software Foundation

      This product includes software from the Spring Framework,
      under the Apache License 2.0 (see: StringUtils.containsWhitespace())

  (ASLv2) Apache Commons Configuration
    The following NOTICE information applies:
      Apache Commons Configuration
      Copyright 2001-2008 The Apache Software Foundation

  (ASLv2) Apache Commons JEXL
    The following NOTICE information applies:
      Apache Commons JEXL
      Copyright 2001-2011 The Apache Software Foundation

  (ASLv2) Spring Framework
    The following NOTICE information applies:
      Spring Framework 4.1.4.RELEASE
      Copyright (c) 2002-2015 Pivotal, Inc.

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

      Portions of this software was originally based on the following:

        - software copyright (c) 1999-2002, Lotus Development Corporation., http://www.lotus.com.
        - software copyright (c) 2001-2002, Sun Microsystems., http://www.sun.com.
        - software copyright (c) 2003, IBM Corporation., http://www.ibm.com.
        - voluntary contributions made by Ovidiu Predescu (ovidiu@cup.hp.com) on behalf of the
          Apache Software Foundation and was originally developed at Hewlett Packard Company.

  (ASLv2) Apache XML Commons XML APIs
    Copyright 2006 The Apache Software Foundation.

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

    Portions of this software were originally based on the following:
      - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
      - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
      - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org

  (ASLv2) Jackson JSON processor
    The following NOTICE information applies:
      # Jackson JSON processor

      Jackson is a high-performance, Free/Open Source JSON processing library.
      It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
      been in development since 2007.
      It is currently developed by a community of developers, as well as supported
      commercially by FasterXML.com.

      ## Licensing

      Jackson core and extension components may licensed under different licenses.
      To find the details that apply to this artifact see the accompanying LICENSE file.
      For more information, including possible other licensing options, contact
      FasterXML.com (http://fasterxml.com).

      ## Credits

      A list of contributors may be found from CREDITS file, which is included
      in some artifacts (usually source distributions); but is always available
      from the source code management (SCM) system project uses.

  (ASLv2) Apache Thrift
    The following NOTICE information applies:
      Apache Thrift
      Copyright 2006-2010 The Apache Software Foundation.

  (ASLv2) Apache MINA
    The following NOTICE information applies:
      Apache MINA Core
      Copyright 2004-2011 Apache MINA Project

  (ASLv2) Apache Velocity
    The following NOTICE information applies:
      Apache Velocity
      Copyright (C) 2000-2007 The Apache Software Foundation

  (ASLv2) Apache Commons CLI
    The following NOTICE information applies:
      Apache Commons CLI
      Copyright 2001-2009 The Apache Software Foundation

  (ASLv2) Apache Commons Math
    The following NOTICE information applies:
      Apache Commons Math
      Copyright 2001-2012 The Apache Software Foundation

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

      ===============================================================================

      The BracketFinder (package org.apache.commons.math3.optimization.univariate)
      and PowellOptimizer (package org.apache.commons.math3.optimization.general)
      classes are based on the Python code in module "optimize.py" (version 0.5)
      developed by Travis E. Oliphant for the SciPy library (http://www.scipy.org/)
      Copyright © 2003-2009 SciPy Developers.
      ===============================================================================

      The LinearConstraint, LinearObjectiveFunction, LinearOptimizer,
      RelationShip, SimplexSolver and SimplexTableau classes in package
      org.apache.commons.math3.optimization.linear include software developed by
      Benjamin McCann (http://www.benmccann.com) and distributed with
      the following copyright: Copyright 2009 Google Inc.
      ===============================================================================

      This product includes software developed by the
      University of Chicago, as Operator of Argonne National
      Laboratory.
      The LevenbergMarquardtOptimizer class in package
      org.apache.commons.math3.optimization.general includes software
      translated from the lmder, lmpar and qrsolv Fortran routines
      from the Minpack package
      Minpack Copyright Notice (1999) University of Chicago.  All rights reserved
      ===============================================================================

      The GraggBulirschStoerIntegrator class in package
      org.apache.commons.math3.ode.nonstiff includes software translated
      from the odex Fortran routine developed by E. Hairer and G. Wanner.
      Original source copyright:
      Copyright (c) 2004, Ernst Hairer
      ===============================================================================

      The EigenDecompositionImpl class in package
      org.apache.commons.math3.linear includes software translated
      from some LAPACK Fortran routines.  Original source copyright:
      Copyright (c) 1992-2008 The University of Tennessee.  All rights reserved.
      ===============================================================================

      The MersenneTwister class in package org.apache.commons.math3.random
      includes software translated from the 2002-01-26 version of
      the Mersenne-Twister generator written in C by Makoto Matsumoto and Takuji
      Nishimura. Original source copyright:
      Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
      All rights reserved
      ===============================================================================

      The LocalizedFormatsTest class in the unit tests is an adapted version of
      the OrekitMessagesTest class from the orekit library distributed under the
      terms of the Apache 2 licence. Original source copyright:
      Copyright 2010 CS Systèmes d'Information
      ===============================================================================

      The HermiteInterpolator class and its corresponding test have been imported from
      the orekit library distributed under the terms of the Apache 2 licence. Original
      source copyright:
      Copyright 2010-2012 CS Systèmes d'Information
      ===============================================================================

      The creation of the package "o.a.c.m.analysis.integration.gauss" was inspired
      by an original code donated by Sébastien Brisard.
      ===============================================================================

  (ASLv2) Apache log4j
    The following NOTICE information applies:
      Apache log4j
      Copyright 2007 The Apache Software Foundation

  (ASLv2) Apache Tika
    The following NOTICE information applies:
      Apache Tika
      Copyright 2015 The Apache Software Foundation

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

      Copyright 1993-2010 University Corporation for Atmospheric Research/Unidata
      This software contains code derived from UCAR/Unidata's NetCDF library.

      Tika-server component uses CDDL-licensed dependencies: jersey (http://jersey.java.net/) and
      Grizzly (http://grizzly.java.net/)

      Tika-parsers component uses CDDL/LGPL dual-licensed dependency: jhighlight (https://github.com/codelibs/jhighlight)

      OpenCSV: Copyright 2005 Bytecode Pty Ltd. Licensed under the Apache License, Version 2.0

      IPTC Photo Metadata descriptions Copyright 2010 International Press Telecommunications Council.

  (ASLv2) Apache Jakarta Commons Digester
    The following NOTICE information applies:
      Apache Jakarta Commons Digester
      Copyright 2001-2006 The Apache Software Foundation

  (ASLv2) Apache Commons BeanUtils
    The following NOTICE information applies:
      Apache Commons BeanUtils
      Copyright 2000-2008 The Apache Software Foundation

  (ASLv2) Apache Avro
    The following NOTICE information applies:
      Apache Avro
      Copyright 2009-2013 The Apache Software Foundation

  (ASLv2) Jasypt
    The following NOTICE information applies:
	  Copyright (c) 2007-2010, The JASYPT team (http://www.jasypt.org)

  (ASLv2) Snappy Java
    The following NOTICE information applies:
      This product includes software developed by Google
       Snappy: http://code.google.com/p/snappy/ (New BSD License)

      This product includes software developed by Apache
       PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
       (Apache 2.0 license)

      This library containd statically linked libstdc++. This inclusion is allowed by
      "GCC RUntime Library Exception"
      http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

  (ASLv2) Apache Lucene
    The following NOTICE information applies:
      Apache Lucene
      Copyright 2014 The Apache Software Foundation

      Includes software from other Apache Software Foundation projects,
      including, but not limited to:
       - Apache Ant
       - Apache Jakarta Regexp
       - Apache Commons
       - Apache Xerces

      ICU4J, (under analysis/icu) is licensed under an MIT styles license
      and Copyright (c) 1995-2008 International Business Machines Corporation and others

      Some data files (under analysis/icu/src/data) are derived from Unicode data such
      as the Unicode Character Database. See http://unicode.org/copyright.html for more
      details.

      Brics Automaton (under core/src/java/org/apache/lucene/util/automaton) is
      BSD-licensed, created by Anders Møller. See http://www.brics.dk/automaton/

      The levenshtein automata tables (under core/src/java/org/apache/lucene/util/automaton) were
      automatically generated with the moman/finenight FSA library, created by
      Jean-Philippe Barrette-LaPierre. This library is available under an MIT license,
      see http://sites.google.com/site/rrettesite/moman and
      http://bitbucket.org/jpbarrette/moman/overview/

      The class org.apache.lucene.util.WeakIdentityMap was derived from
      the Apache CXF project and is Apache License 2.0.

      The Google Code Prettify is Apache License 2.0.
      See http://code.google.com/p/google-code-prettify/

      JUnit (junit-4.10) is licensed under the Common Public License v. 1.0
      See http://junit.sourceforge.net/cpl-v10.html

      This product includes code (JaspellTernarySearchTrie) from Java Spelling Checkin
      g Package (jaspell): http://jaspell.sourceforge.net/
      License: The BSD License (http://www.opensource.org/licenses/bsd-license.php)

      The snowball stemmers in
        analysis/common/src/java/net/sf/snowball
      were developed by Martin Porter and Richard Boulton.
      The snowball stopword lists in
        analysis/common/src/resources/org/apache/lucene/analysis/snowball
      were developed by Martin Porter and Richard Boulton.
      The full snowball package is available from
        http://snowball.tartarus.org/

      The KStem stemmer in
        analysis/common/src/org/apache/lucene/analysis/en
      was developed by Bob Krovetz and Sergio Guzman-Lara (CIIR-UMass Amherst)
      under the BSD-license.

      The Arabic,Persian,Romanian,Bulgarian, and Hindi analyzers (common) come with a default
      stopword list that is BSD-licensed created by Jacques Savoy.  These files reside in:
      analysis/common/src/resources/org/apache/lucene/analysis/ar/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/fa/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/ro/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/bg/stopwords.txt,
      analysis/common/src/resources/org/apache/lucene/analysis/hi/stopwords.txt
      See http://members.unine.ch/jacques.savoy/clef/index.html.

      The German,Spanish,Finnish,French,Hungarian,Italian,Portuguese,Russian and Swedish light stemmers
      (common) are based on BSD-licensed reference implementations created by Jacques Savoy and
      Ljiljana Dolamic. These files reside in:
      analysis/common/src/java/org/apache/lucene/analysis/de/GermanLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/de/GermanMinimalStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/es/SpanishLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fi/FinnishLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchMinimalStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/hu/HungarianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/it/ItalianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/pt/PortugueseLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/ru/RussianLightStemmer.java
      analysis/common/src/java/org/apache/lucene/analysis/sv/SwedishLightStemmer.java

      The Stempel analyzer (stempel) includes BSD-licensed software developed
      by the Egothor project http://egothor.sf.net/, created by Leo Galambos, Martin Kvapil,
      and Edmond Nolan.

      The Polish analyzer (stempel) comes with a default
      stopword list that is BSD-licensed created by the Carrot2 project. The file resides
      in stempel/src/resources/org/apache/lucene/analysis/pl/stopwords.txt.
      See http://project.carrot2.org/license.html.

      The SmartChineseAnalyzer source code (smartcn) was
      provided by Xiaoping Gao and copyright 2009 by www.imdict.net.

      WordBreakTestUnicode_*.java (under modules/analysis/common/src/test/)
      is derived from Unicode data such as the Unicode Character Database.
      See http://unicode.org/copyright.html for more details.

      The Morfologik analyzer (morfologik) includes BSD-licensed software
      developed by Dawid Weiss and Marcin Miłkowski (http://morfologik.blogspot.com/).

      Morfologik uses data from Polish ispell/myspell dictionary
      (http://www.sjp.pl/slownik/en/) licenced on the terms of (inter alia)
      LGPL and Creative Commons ShareAlike.

      Morfologic includes data from BSD-licensed dictionary of Polish (SGJP)
      (http://sgjp.pl/morfeusz/)

      Servlet-api.jar and javax.servlet-*.jar are under the CDDL license, the original
      source code for this can be found at http://www.eclipse.org/jetty/downloads.php

      ===========================================================================
      Kuromoji Japanese Morphological Analyzer - Apache Lucene Integration
      ===========================================================================

      This software includes a binary and/or source version of data from

        mecab-ipadic-2.7.0-20070801

      which can be obtained from

        http://atilika.com/releases/mecab-ipadic/mecab-ipadic-2.7.0-20070801.tar.gz

      or

        http://jaist.dl.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz

      ===========================================================================
      mecab-ipadic-2.7.0-20070801 Notice
      ===========================================================================

      Nara Institute of Science and Technology (NAIST),
      the copyright holders, disclaims all warranties with regard to this
      software, including all implied warranties of merchantability and
      fitness, in no event shall NAIST be liable for
      any special, indirect or consequential damages or any damages
      whatsoever resulting from loss of use, data or profits, whether in an
      action of contract, negligence or other tortuous action, arising out
      of or in connection with the use or performance of this software.

      A large portion of the dictionary entries
      originate from ICOT Free Software.  The following conditions for ICOT
      Free Software applies to the current dictionary as well.

      Each User may also freely distribute the Program, whether in its
      original form or modified, to any third party or parties, PROVIDED
      that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
      on, or be attached to, the Program, which is distributed substantially
      in the same form as set out herein and that such intended
      distribution, if actually made, will neither violate or otherwise
      contravene any of the laws and regulations of the countries having
      jurisdiction over the User or the intended distribution itself.

      NO WARRANTY

      The program was produced on an experimental basis in the course of the
      research and development conducted during the project and is provided
      to users as so produced on an experimental basis.  Accordingly, the
      program is provided without any warranty whatsoever, whether express,
      implied, statutory or otherwise.  The term "warranty" used herein
      includes, but is not limited to, any warranty of the quality,
      performance, merchantability and fitness for a particular purpose of
      the program and the nonexistence of any infringement or violation of
      any right of any third party.

      Each user of the program will agree and understand, and be deemed to
      have agreed and understood, that there is no warranty whatsoever for
      the program and, accordingly, the entire risk arising from or
      otherwise connected with the program is assumed by the user.

      Therefore, neither ICOT, the copyright holder, or any other
      organization that participated in or was otherwise related to the
      development of the program and their respective officials, directors,
      officers and other employees shall be held liable for any and all
      damages, including, without limitation, general, special, incidental
      and consequential damages, arising out of or otherwise in connection
      with the use or inability to use the program or any product, material
      or result produced or otherwise obtained by using the program,
      regardless of whether they have been advised of, or otherwise had
      knowledge of, the possibility of such damages at any time during the
      project or thereafter.  Each user will be deemed to have agreed to the
      foregoing by his or her commencement of use of the program.  The term
      "use" as used herein includes, but is not limited to, the use,
      modification, copying and distribution of the program and the
      production of secondary products from the program.

      In the case where the program, whether in its original form or
      modified, was distributed or delivered to or received by a user from
      any person, organization or entity other than ICOT, unless it makes or
      grants independently of ICOT any specific warranty to the user in
      writing, such person, organization or entity, will also be exempted
      from and not be held liable to the user for any such damages as noted
      above as far as the program is concerned.

  (ASLv2) Joda Time
    The following NOTICE information applies:
      This product includes software developed by
      Joda.org (http://www.joda.org/).

  (ASLv2) Apache ActiveMQ
    The following NOTICE information applies:
      ActiveMQ :: Client
      Copyright 2005-2015 The Apache Software Foundation

  (ASLv2) Apache Geronimo
    The following NOTICE information applies:
      Apache Geronimo
      Copyright 2003-2008 The Apache Software Foundation

  (ASLv2) Google GSON
    The following NOTICE information applies:
      Copyright 2008 Google Inc.

  (ASLv2) JSON-SMART
    The following NOTICE information applies:
      Copyright 2011 JSON-SMART authors

   (ASLv2) JsonPath
     The following NOTICE information applies:
       Copyright 2011 JsonPath authors

   (ASLv2) Apache Commons DBCP
      The following NOTICE information applies:
        Apache Commons DBCP
        Copyright 2001-2015 The Apache Software Foundation.

   (ASLv2) Apache Commons Pool
      The following NOTICE information applies:
        Apache Commons Pool
        Copyright 1999-2009 The Apache Software Foundation.

    (ASLv2) Apache Derby
      The following NOTICE information applies:
        Apache Derby
        Copyright 2004-2014 Apache, Apache DB, Apache Derby, Apache Torque, Apache JDO, Apache DDLUtils,
        the Derby hat logo, the Apache JDO logo, and the Apache feather logo are trademarks of The Apache Software Foundation.

    (ASLv2) The Netty Project
      The following NOTICE information applies:
        The Netty Project
        Copyright 2011 The Netty Project

    (ASLv2) Apache Xerces Java
      The following NOTICE information applies:
        Apache Xerces Java
        Copyright 1999-2007 The Apache Software Foundation

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

        Portions of this software were originally based on the following:
          - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
          - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
          - voluntary contributions made by Paul Eng on behalf of the
            Apache Software Foundation that were originally developed at iClick, Inc.,
            software copyright (c) 1999.

  (ASLv2) Apache ZooKeeper
    The following NOTICE information applies:
      Apache ZooKeeper
      Copyright 2009-2012 The Apache Software Foundation

  (ASLv2) Swagger Core
    The following NOTICE information applies:
      Swagger Core 1.5.3-M1
      Copyright 2015 Reverb Technologies, Inc.


  (ASLv2) HBase Common
    The following NOTICE information applies:
      This product includes portions of the Guava project v14, specifically
      'hbase-common/src/main/java/org/apache/hadoop/hbase/io/LimitInputStream.java'

      Copyright (C) 2007 The Guava Authors

      Licensed under the Apache License, Version 2.0

  (ASLv2) HTrace Core
    The following NOTICE information applies:
      In addition, this product includes software dependencies. See
      the accompanying LICENSE.txt for a listing of dependencies
      that are NOT Apache licensed (with pointers to their licensing)

      Apache HTrace includes an Apache Thrift connector to Zipkin. Zipkin
      is a distributed tracing system that is Apache 2.0 Licensed.
      Copyright 2012 Twitter, Inc.

  (ASLv2) Jettison
    The following NOTICE information applies:
         Copyright 2006 Envoi Solutions LLC

    (ASLv2) Apache Curator
      The following NOTICE information applies:
        Curator Framework
        Copyright 2011-2014 The Apache Software Foundation

        Curator Client
        Copyright 2011-2014 The Apache Software Foundation

        Curator Recipes
        Copyright 2011-2014 The Apache Software Foundation


    (ASLv2) Quartz
      The following NOTICE information applies:
        Copyright Declaration:
        Copyright © 2003-2016 Software AG, Darmstadt, Germany and/or Software AG USA Inc., Reston, VA, USA, and/or its subsidiaries and/or its affiliates and/or their licensors.

        Trademark and Patent declaration
        The name Software AG and all Software AG product names are either trademarks or registered trademarks of Software AG and/or Software AG USA Inc. and/or its subsidiaries and/or its affiliates
        and/or their licensors. Other company and product names mentioned herein may be trademarks of their respective owners.

        Detailed information on trademarks and patents owned by Software AG and/or its subsidiaries is located at http://softwareag.com/licenses.

        Third Party declaration
        This software may include portions of third-party products. For third-party copyright notices, license terms, additional rights or restrictions, please refer to "License Texts, Copyright
        Notices and Disclaimers of Third Party Products". For certain specific third-party license restrictions, please refer to section E of the Legal Notices available under "License Terms and
        Conditions for Use of Software AG Products / Copyright and Trademark Notices of Software AG Products". These documents are part of the product documentation, located at
        http://softwareag.com/licenses and/or in the root installation directory of the licensed product(s).

        Confidentiality Disclaimer:
        Use, reproduction, transfer, publication or disclosure is prohibited except as specifically provided for in your License Agreement with Software AG.
        Contact GitHub API Training Shop Blog About

************************
Common Development and Distribution License 1.1
************************

The following binary components are provided under the Common Development and Distribution License 1.1. See project link for details.

    (CDDL 1.1) (GPL2 w/ CPE) jersey-core-client (org.glassfish.jersey.core:jersey-client:jar:2.19 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (com.sun.jersey:jersey-client:jar:1.19 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-core-common (org.glassfish.jersey.core:jersey-common:jar:2.19 - https://jersey.java.net/jersey-common/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-core (com.sun.jersey:jersey-core:jar:1.19 - https://jersey.java.net/jersey-core/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-spring (com.sun.jersey:jersey-spring:jar:1.19 - https://jersey.java.net/jersey-spring/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-servlet (com.sun.jersey:jersey-servlet:jar:1.19 - https://jersey.java.net/jersey-servlet/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-multipart (com.sun.jersey:jersey-multipart:jar:1.19 - https://jersey.java.net/jersey-multipart/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (com.sun.jersey:jersey-server:jar:1.19 - https://jersey.java.net/jersey-server/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-json (com.sun.jersey:jersey-json:jar:1.19 - https://jersey.java.net/jersey-json/)
    (CDDL 1.1) (GPL2 w/ CPE) Old JAXB Runtime (com.sun.xml.bind:jaxb-impl:jar:2.2.3-1 - http://jaxb.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) Java Architecture For XML Binding (javax.xml.bind:jaxb-api:jar:2.2.2 - https://jaxb.dev.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) MIME Streaming Extension (org.jvnet.mimepull:mimepull:jar:1.9.3 - http://mimepull.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaMail API (compat) (javax.mail:mail:jar:1.4.7 - http://kenai.com/projects/javamail/mail)
    (CDDL 1.1) (GPL2 w/ CPE) JSP Implementation (org.glassfish.web:javax.servlet.jsp:jar:2.3.2 - http://jsp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages (TM) TagLib Implementation (org.glassfish.web:javax.servlet.jsp.jstl:jar:1.2.2 - http://jstl.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Expression Language 3.0 (org.glassfish:javax.el:jar:3.0.0 - http://el-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages(TM) API (javax.servlet.jsp:javax.servlet.jsp-api:jar:2.3.1 - http://jsp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Expression Language 3.0 API  (javax.el:javax.el-api:jar:3.0.0 - http://uel-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages(TM) Standard Tag Library API  (javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:jar:1.2.1 - http://jcp.org/en/jsr/detail?id=52)
    (CDDL 1.1) (GPL2 w/ CPE) Java Servlet API  (javax.servlet:javax.servlet-api:jar:3.1.0 - http://servlet-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) Javax JMS Api (javax.jms:javax.jms-api:jar:2.0.1 - http://java.net/projects/jms-spec/pages/Home)
    (CDDL 1.1) (GPL2 w/ CPE) JSON Processing API (javax.json:javax.json-api:jar:1.0 - http://json-processing-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JSON Processing Default Provider (org.glassfish:javax.json:jar:1.0.4 - https://jsonp.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) OSGi resource locator bundle (org.glassfish.hk2:osgi-resource-locator:jar:1.0.1 - http://glassfish.org/osgi-resource-locator)
    (CDDL 1.1) (GPL2 w/ CPE) javax.annotation API (javax.annotation:javax.annotation-api:jar:1.2 - http://jcp.org/en/jsr/detail?id=250)
    (CDDL 1.1) (GPL2 w/ CPE) HK2 API module (org.glassfish.hk2:hk2-api:jar:2.4.0-b25 - https://hk2.java.net/hk2-api)
    (CDDL 1.1) (GPL2 w/ CPE) ServiceLocator Default Implementation (org.glassfish.hk2:hk2-locator:jar:2.4.0-b25 - https://hk2.java.net/hk2-locator)
    (CDDL 1.1) (GPL2 w/ CPE) HK2 Implementation Utilities (org.glassfish.hk2:hk2-utils:jar:2.4.0-b25 - https://hk2.java.net/hk2-utils)
    (CDDL 1.1) (GPL2 w/ CPE) aopalliance version 1.0 repackaged as a module (org.glassfish.hk2.external:aopalliance-repackaged:jar:2.4.0-b25 - https://hk2.java.net/external/aopalliance-repackaged)
    (CDDL 1.1) (GPL2 w/ CPE) javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:javax.inject:jar:2.4.0-b25 - https://hk2.java.net/external/javax.inject)
    (CDDL 1.1) (GPL2 w/ CPE) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.0.1 - http://jax-rs-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-repackaged-guava (org.glassfish.jersey.bundles.repackaged:jersey-guava:bundle:2.19 - https://jersey.java.net/project/project/jersey-guava/)

************************
Common Development and Distribution License 1.0
************************

The following binary components are provided under the Common Development and Distribution License 1.0. See project link for details.

    (CDDL 1.0) JavaBeans Activation Framework (JAF) (javax.activation:activation:jar:1.1 - http://java.sun.com/products/javabeans/jaf/index.jsp)
    (CDDL 1.0) (GPL3) Streaming API For XML (javax.xml.stream:stax-api:jar:1.0-2 - no url provided)

************************
Eclipse Public License 1.0
************************

The following binary components are provided under the Eclipse Public License 1.0.  See project link for details.

    (EPL 1.0) AspectJ Weaver (org.aspectj:aspectjweaver:jar:1.8.5 - http://www.aspectj.org)
    (EPL 1.0)(MPL 2.0) H2 Database (com.h2database:h2:jar:1.3.176 - http://www.h2database.com/html/license.html)
    (EPL 1.0)(LGPL 2.1) Logback Classic (ch.qos.logback:logback-classic:jar:1.1.8 - http://logback.qos.ch/)
    (EPL 1.0)(LGPL 2.1) Logback Core (ch.qos.logback:logback-core:jar:1.1.8 - http://logback.qos.ch/)

*****************
Mozilla Public License v2.0
*****************

The following binary components are provided under the Mozilla Public License v2.0.  See project link for details.

    (MPL 2.0) Saxon HE (net.sf.saxon:Saxon-HE:jar:9.6.0-5 - http://www.saxonica.com/)

*****************
Mozilla Public License v1.1
*****************

The following binary components are provided under the Mozilla Public License v1.1.  See project link for details.

    (MPL 1.1) HAPI Base (ca.uhn.hapi:hapi-base:2.2 - http://hl7api.sourceforge.net/)
    (MPL 1.1) HAPI Structures (ca.uhn.hapi:hapi-structures-v*:2.2 - http://hl7api.sourceforge.net/)

*****************
Public Domain
*****************

The following binary components are provided to the 'Public Domain'.  See project link for details.

    (Public Domain) XZ for Java (org.tukaani:xz:jar:1.5 - http://tukaani.org/xz/java.html
    (Public Domain) AOP Alliance 1.0 (http://aopalliance.sourceforge.net/)

The following binary components are provided under the Creative Commons Zero license version 1.0.  See project link for details.

    (CC0v1.0) JSR166e for Twitter (com.twitter:jsr166e:jar:1.1.0 - https://github.com/twitter/jsr166e)
