Apache NiFi
Copyright 2014-2021 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 under Apache Software License V2:
  BoundedByteArrayOutputStream.java adapted to SoftLimitBoundedByteArrayOutputStream.java

This product includes derived works from Apache Commons Lang (ASLv2 licensed)
  Copyright 2019 The Apache Software Foundation
  The derived work is adapted from the class StringUtils:
    https://github.com/apache/commons-lang/blob/465e6becd8beda9569fbdc9ff44fac7dc3c5d1c6/src/main/java/org/apache/commons/lang3/StringUtils.java

This product includes derived works from the Apache Software License V2 library python-evtx (https://github.com/williballenthin/python-evtx)
  Copyright 2012, 2013 Willi Ballenthin william.ballenthin@mandiant.com
  while at Mandiant http://www.mandiant.com
  The derived work is adapted from Evtx/Evtx.py, Evtx/BinaryParser.py, Evtx/Nodes.py, Evtx/Views.py
  and can be found in the org.apache.nifi.processors.evtx.parser package.

This includes derived works from the Apache Storm (ASLv2 licensed) project (https://github.com/apache/storm):
  Copyright 2015 The Apache Software Foundation
  The derived work is adapted from
    org/apache/storm/hive/common/HiveWriter.java
    org/apache/storm/hive/common/HiveOptions.java
  and can be found in the org.apache.nifi.util.hive package

This includes derived works from the Apache Hadoop (ASLv2 licensed) project (https://github.com/apache/hadoop):
  Copyright 2014 The Apache Software Foundation
  The derived work is adapted from
    org/apache/hadoop/security/authentication/client/KerberosAuthenticator.java
  and can be found in the org.apache.nifi.hadoop package

This includes derived works from the Apache Hive (ASLv2 licensed) project (https://github.com/apache/hive):
  Copyright 2008-2016 The Apache Software Foundation
  The derived work is adapted from
    release-1.2.1/ql/src/java/org/apache/hadoop/hive/ql/io/orc/WriterImpl.java
  and can be found in the org.apache.hadoop.hive.ql.io.orc package
  The derived work is adapted from
    release-3.0.0/serde/src/java/org/apache/hadoop/hive/serde2/JsonSerDe.java
  and can be found in the org.apache.hive.streaming.NiFiRecordSerDe class

This includes derived works from the Apache Software License V2 library Jolt (https://github.com/bazaarvoice/jolt)
  Copyright 2013-2014 Bazaarvoice, Inc
  The derived work is adapted from com.bazaarvoice.jolt.chainr.ChainrBuilder.java, com.bazaarvoice.jolt.chainr.spec.ChainrSpec.java,
  com.bazaarvoice.jolt.chainr.spec.ChainrEntry.java and can be found in the org.apache.nifi.processors.standard.util.jolt.TransformFactory.java class.

This includes derived works from Elastic Logstash (https://github.com/elastic/logstash/tree/v1.4.0/) and modified by Anthony Corbacho, and contributors
  available under an Apache Software License V2.
  Copyright 2009-2013 Jordan Sissel, Pete Fritchman, and contributors.
  Copyright 2014 Anthony Corbacho, and contributors.
  The derived work consists in modifications from patterns/grok-patterns
  and can be found in the file nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/resources/TestExtractGrok/patterns

This includes derived works from Dropwizard Metrics available under Apache Software License V2 (https://github.com/dropwizard/metrics)
  Copyright 2010-2013 Coda Hale and Yammer, Inc., 2014-2017 Dropwizard Team
  This product includes software developed by Coda Hale and Yammer, Inc.

  This product includes code derived from the JSR-166 project (ThreadLocalRandom, Striped64,
  LongAdder), which was released with the following comments:

      Written by Doug Lea with assistance from members of JCP JSR-166
      Expert Group and released to the public domain, as explained at
      http://creativecommons.org/publicdomain/zero/1.0/

  The derived work in the nifi-metrics module is adapted from
    https://github.com/dropwizard/metrics/blob/v2.2.0/metrics-core/src/main/java/com/yammer/metrics/core/VirtualMachineMetrics.java
  and can be found in
    nifi-commons/nifi-metrics/src/main/java/org/apache/nifi/metrics/jvm/JvmMetrics.java
    nifi-commons/nifi-metrics/src/main/java/org/apache/nifi/metrics/jvm/JmxJvmMetrics.java

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

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

  (ASLv2) Apache Ant
    The following NOTICE information applies:
      Copyright 1999-2018 The Apache Software Foundation

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

      The <sync> task is based on code Copyright (c) 2002, Landmark
      Graphics Corp that has been kindly donated to the Apache Software
      Foundation.

  (ASLv2) Apache BVal Project
    The following NOTICE information applies:
      Apache BVal project
     Copyright 2010-2016 The Apache Software Foundation.

     This product includes software developed by Agimatec GmbH.
     Copyright 2007-2010 Agimatec GmbH. All rights reserved.

  (ASLv2) Apache Commons IO
    The following NOTICE information applies:
      Apache Commons IO
      Copyright 2002-2016 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-2016 The Apache Software Foundation

  (ASLv2) Apache Commons Compress
    The following NOTICE information applies:
      Apache Commons Compress
      Copyright 2002-2017 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 Crypto
    The following NOTICE information applies:
      Apache Commons Crypto
      Copyright 2016-2016 The Apache Software Foundation

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

  (ASLv2) Jets3t
    The following NOTICE information applies:

         This product includes software developed by:

         The Apache Software Foundation (http://www.apache.org/).

         The ExoLab Project (http://www.exolab.org/)

         Sun Microsystems (http://www.sun.com/)

         Codehaus (http://castor.codehaus.org)

         Tatu Saloranta (http://wiki.fasterxml.com/TatuSaloranta)

  (ASLv2) Apache POI
    The following NOTICE information applies:

    This product contains parts that were originally based on software from BEA.
    Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

    This product contains W3C XML Schema documents. Copyright 2001-2003 (c)
    World Wide Web Consortium (Massachusetts Institute of Technology, European
    Research Consortium for Informatics and Mathematics, Keio University)

    This product contains the Piccolo XML Parser for Java
    (http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.

    This product contains the chunks_parse_cmds.tbl file from the vsdump program.
    Copyright (C) 2006-2007 Valek Filippov (frob@df.ru)

    This product contains parts of the eID Applet project
    (http://eid-applet.googlecode.com). Copyright (c) 2009-2014
    FedICT (federal ICT department of Belgium), e-Contract.be BVBA (https://www.e-contract.be),
    Bart Hanssens from FedICT

    CurvesAIP is BSD-licensed software (https://github.com/virtuald/curvesapi/)
    Copyright (c) 2005, Graph Builder

  (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-2016 The Apache Software Foundation

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

    (ASLv2) Apache Commons CSV
      The following NOTICE information applies:
        Apache Commons CSV
        Copyright 2005-2016 The Apache Software Foundation

    (ASLv2) Apache JAMES Mime4j
      The following NOTICE information applies:
       Apache JAMES Mime4j
       Copyright 2004-2010 The Apache Software Foundation

       This product test suite includes data (mimetools-testmsgs folder) developed
       by Eryq and ZeeGee Software Inc as part of the "MIME-tools" Perl5 toolkit
       and licensed under the Artistic License

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

       Based on source code originally developed in the PDFBox, JempBox and
       FontBox projects.
       Copyright (c) 2002-2007, www.pdfbox.org
       Copyright (c) 2006-2007, www.jempbox.org

       Based on source code originally developed in the PaDaF project.
       Copyright (c) 2010 Atos Worldline SAS

    (ASLv2) Apache FontBox
      The following NOTICE information applies:
        Apache FontBox
        Copyright 2008-2017 The Apache Software Foundation

    (ASLv2) Apache SIS
      The following NOTICE information applies:
        Apache SIS
        Copyright 2010-2017 The Apache Software Foundation

    (ASLv2) Apache JempBox
      The following NOTICE information applies:
        Apache JempBox
        Copyright 2008-2017 The Apache Software Foundation

    (ASLv2) Apache XMLBeans
      The following NOTICE information applies:
        Portions of this software were originally based on the following:
        - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

        Aside from contributions to the Apache XMLBeans project, this
        software also includes:

        - one or more source files from the Apache Xerces-J and Apache Axis
        products, Copyright (c) 1999-2003 Apache Software Foundation

        - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
        Consortium (Massachusetts Institute of Technology, European Research
        Consortium for Informatics and Mathematics, Keio University)

        - resolver.jar from Apache Xml Commons project,
        Copyright (c) 2001-2003 Apache Software Foundation

        - Piccolo XML Parser for Java from http://piccolo.sourceforge.net/,
        Copyright 2002 Yuval Oren under the terms of the Apache Software License 2.0

        - JSR-173 Streaming API for XML from http://sourceforge.net/projects/xmlpullparser/,
        Copyright 2005 BEA under the terms of the Apache Software License 2.0

    (ASLv2) Vorbis Java
      The following NOTICE information applies:
        Ogg and Vorbis Tools for Java
        Copyright 2012 Nick Burch

        The Apache Tika Plugin includes developed at
        The Apache Software Foundation (http://www.apache.org/).

    (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

    (ASLv2) JCommander
      The following NOTICE information applies:
        JCommander Copyright Notices
        Copyright 2010 Cedric Beust cedric@beust.com

    (ASLv2) Rome
      The following NOTICE information applies:
        Rome Copyright Notices
        Copyright 2004 Sun Microsystems, Inc.
        Copyright 2011 The ROME Team
  
    (ASLv2) Apache Commons Lang
    The following NOTICE information applies:
      Apache Commons Lang
      Copyright 2001-2017 The Apache Software Foundation

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

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

  (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 5
      Copyright (c) 2002-2021 Pivotal, Inc.

  (ASLv2) Spring Security
    The following NOTICE information applies:
          Spring Security 5
          Copyright (c) 2002-2021 Pivotal, Inc.

  (ASLv2) Apache Flume
    The following NOTICE information applies:
      Apache Flume
      Copyright 2011-2015 Apache Software Foundation

      asynchbase is BSD-licensed software (https://github.com/OpenTSDB/asynchbase)

      async is BSD-licensed software (https://github.com/stumbleupon/async)

      jopt-simple is MIT licensed software (http://pholser.github.io/jopt-simple/license.html)

      scala-library is BSD-like licensed software (http://www.scala-lang.org/license.html)

  (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) IRClib
    The following NOTICE information applies:
      IRClib -- A Java Internet Relay Chat library --
      Copyright (C) 2002 - 2006 Christoph Schwering <schwering@gmail.com>

  (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

      Apache MINA Core 2.0.16
      Copyright 2004-2016 Apache MINA Project

  (ASLv2) opencsv (net.sf.opencsv:opencsv:2.3)

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

  (ASLv2) ZkClient
    The following NOTICE information applies:
      ZkClient
      Copyright 2009 Stefan Groschupf

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

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

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

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

  (ASLv2) Java Native Access Platform
    The following NOTICE information applies:
      Java Native Access Platform
      Copyright 2013 Timothy Wall, Matthias Bläsing

      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 Calcite -- Avatica
    The following NOTICE information applies:
		Apache Calcite -- Avatica
		Copyright 2012-2017 The Apache Software Foundation

  (ASLv2) Apache Calcite
    The following NOTICE information applies:
		Apache Calcite
		Copyright 2012-2017 The Apache Software Foundation
		
		This product is based on source code originally developed
		by DynamoBI Corporation, LucidEra Inc., SQLstream Inc. and others
		under the auspices of the Eigenbase Foundation
		and released as the LucidDB project.

  (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-2014 The Apache Software Foundation

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

  (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) ApacheDS
    The following NOTICE information applies:
      ApacheDS
      Copyright 2003-2013 The Apache Software Foundation

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

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

  (ASLv2) Apache Commons Exec
    The following NOTICE information applies:
      Apache Commons Exec
      Copyright 2005-2016 The Apache Software Foundation

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

      EL-8 patch - Copyright 2004-2007 Jamie Taylor
      http://issues.apache.org/jira/browse/EL-8

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

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

        Java Management Extensions (JMX) support is provided by
        the MX4J package, which is open source software.  The
        original software and related information is available
        at http://mx4j.sourceforge.net.

        Java compilation software for JSP pages is provided by Eclipse,
        which is open source software.  The orginal software and
        related infomation is available at
        http://www.eclipse.org.

  (ASLv2) Apache Kafka
    The following NOTICE information applies:
      Apache Kafka
      Copyright 2012 The Apache Software Foundation.

  (ASLv2) Apache POI
      The following NOTICE information applies:
        Apache POI
        Copyright 2012 The Apache Software Foundation.
        
        This product contains parts that were originally based on software from BEA.
        Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/> (dead link),
        which was acquired by Oracle Corporation in 2008.
        <http://www.oracle.com/us/corporate/Acquisitions/bea/index.html>
        <https://en.wikipedia.org/wiki/BEA_Systems>
        
        This product contains W3C XML Schema documents. Copyright 2001-2003 (c)
        World Wide Web Consortium (Massachusetts Institute of Technology, European
        Research Consortium for Informatics and Mathematics, Keio University)

        This product contains the Piccolo XML Parser for Java
        (http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.

        This product contains the chunks_parse_cmds.tbl file from the vsdump program.
        Copyright (C) 2006-2007 Valek Filippov (frob@df.ru)

        This product contains parts of the eID Applet project 
        <http://eid-applet.googlecode.com> and <https://github.com/e-Contract/eid-applet>.
        Copyright (c) 2009-2014
        FedICT (federal ICT department of Belgium), e-Contract.be BVBA (https://www.e-contract.be),
        Bart Hanssens from FedICT

  (ASLv2) Apache CXF
    The following NOTICE information applies:
      Apache CXF
      Copyright 2008-2017 The Apache Software Foundation

  (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) Apache Solr
    The following NOTICE information applies:
      Apache Solrj
      Copyright 2006-2014 The Apache Software Foundation

  (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-2017 The Apache Software Foundation

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

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

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

  (ASLv2) Google OAuth Client Library
    The following NOTICE information applies:
      Copyright 2012 Google Inc.

  (ASLv2) Google HTTP Client Library for Java
    The following NOTICE information applies:
      Copyright 2011 Google Inc.

  (ASLv2) Google Guice
    The following NOTICE information applies:
      Google Guice - Core Library
      Copyright 2006-2011 Google, Inc.

  (ASLv2) Google Cloud Client Library for Java
    The following NOTICE information applies:
      Google Cloud Client Library for Java
      Copyright 2016 Google Inc. All Rights Reserved.

  (ASLv2) Guava
    The following NOTICE information applies:
      Guava
      Copyright 2015 The Guava Authors

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

  (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) Kite SDK
    The following NOTICE information applies:
      This product includes software developed by Cloudera, Inc.
      (http://www.cloudera.com/).

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

      This product includes software developed by
      Saxonica (http://www.saxonica.com/).

  (ASLv2) MongoDB Java Driver
    The following NOTICE information applies:
      Copyright (C) 2008-2013 10gen, Inc.

  (ASLv2) Parquet MR
    The following NOTICE information applies:
      Parquet MR
      Copyright 2012 Twitter, Inc.

      This project includes code from https://github.com/lemire/JavaFastPFOR
      parquet-column/src/main/java/parquet/column/values/bitpacking/LemireBitPacking.java
      Apache License Version 2.0 http://www.apache.org/licenses/.
      (c) Daniel Lemire, http://lemire.me/en/

  (ASLv2) JOAuth
    The following NOTICE information applies:
      JOAuth
      Copyright 2010-2013 Twitter, Inc

  (ASLv2) Hosebird Client
    The following NOTICE information applies:
      Hosebird Client (hbc)
      Copyright 2013 Twitter, Inc.

  (ASLv2) GeoIP2 Java API
    The following NOTICE information applies:
      GeoIP2 Java API
      This software is Copyright (c) 2013 by MaxMind, Inc.

    (ASLv2) Apache XMLBeans
      The following NOTICE information applies:
        Portions of this software were originally based on the following:
        - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

        Aside from contributions to the Apache XMLBeans project, this
        software also includes:

        - one or more source files from the Apache Xerces-J and Apache Axis
        products, Copyright (c) 1999-2003 Apache Software Foundation

        - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
        Consortium (Massachusetts Institute of Technology, European Research
        Consortium for Informatics and Mathematics, Keio University)

        - resolver.jar from Apache Xml Commons project,
        Copyright (c) 2001-2003 Apache Software Foundation

        - Piccolo XML Parser for Java from http://piccolo.sourceforge.net/,
        Copyright 2002 Yuval Oren under the terms of the Apache Software License 2.0

        - JSR-173 Streaming API for XML from http://sourceforge.net/projects/xmlpullparser/,
        Copyright 2005 BEA under the terms of the Apache Software License 2.0

  (ASLv2) Woodstox Core ASL
    The following NOTICE information applies:
      This product currently only contains code developed by authors
      of specific components, as identified by the source code files.

      Since product implements StAX API, it has dependencies to StAX API
      classes.

  (ASLv2) Amazon Web Services SDK
    The following NOTICE information applies:
      Copyright 2010-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.

      This product includes software developed by
      Amazon Technologies, Inc (http://www.amazon.com/).

      **********************
      THIRD PARTY COMPONENTS
      **********************
      This software includes third party software subject to the following copyrights:
      - XML parsing and utility functions from JetS3t - Copyright 2006-2009 James Murty.
      - PKCS#1 PEM encoded private key parsing and utility functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc.

   (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) Objenesis
      The following NOTICE information applies:
        Objenesis
        Copyright 2006-2013 Joe Walnes, Henri Tremblay, Leonardo Mesquita

   (ASLv2) Apache Maven
      The following NOTICE information applies:
        Apache Maven
        Copyright 2003-2017 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) Apache Directory Server
      The following NOTICE information applies:
        ApacheDS Protocol Kerberos Codec
        Copyright 2003-2013 The Apache Software Foundation

        ApacheDS I18n
        Copyright 2003-2013 The Apache Software Foundation

        Apache Directory API ASN.1 API
        Copyright 2003-2013 The Apache Software Foundation

        Apache Directory LDAP API Utilities
        Copyright 2003-2013 The Apache Software Foundation

    (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) 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) Metadata-Extractor
      The following NOTICE information applies:
        Metadata-Extractor
        Copyright 2002-2015 Drew Noakes

    (ASLv2) Couchbase Java SDK
      The following NOTICE information applies:
        Couchbase Java SDK
        Copyright 2014 Couchbase, Inc.

    (ASLv2) Hazelcast
      The following NOTICE information applies:
        Core Hazelcast Module 4.0.1
        Copyright (c) 2008-2020, Hazelcast, Inc. All Rights Reserved.

    (ASLv2) RxJava
      The following NOTICE information applies:
        Couchbase Java SDK
        Copyright 2012 Netflix, Inc.

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

        Copyright (C) 2007 The Guava Authors

        Licensed under the Apache License, Version 2.0

    (ASLv2) Java Native Access
      The following NOTICE information applies:
         Java Native Access
         Copyright 2015 Java Native Access

    (ASLv2) Apache HTrace Core
      The following NOTICE information applies:
        Copyright 2016 The Apache Software Foundation

        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) Groovy (org.codehaus.groovy:groovy-all:pom:2.5.4 and its submodules included as transitive dependencies - http://www.groovy-lang.org)
        groovy
        groovy-ant
        groovy-cli-commons
        groovy-cli-picocli
        groovy-console
        groovy-datetime
        groovy-docgenerator
        groovy-groovydoc
        groovy-groovysh
        groovy-jmx
        groovy-json
        groovy-jsr223
        groovy-macro
        groovy-nio
        groovy-servlet
        groovy-sql
        groovy-swing
        groovy-templates
        groovy-test
        groovy-test-junit5
        groovy-testng
        groovy-xml
    The following NOTICE information applies:
      Groovy Language
         Copyright 2003-2018 The respective authors and developers
         Developers and Contributors are listed in the project POM file
         and Gradle build file

         This product includes software developed by
         The Groovy community (http://groovy.codehaus.org/).

         This product bundles icons from the famfamfam.com silk icons set
         http://www.famfamfam.com/lab/icons/silk/
         Licensed under the Creative Commons Attribution Licence v2.5
         http://creativecommons.org/licenses/by/2.5/

  (ASLv2) Groovy 2.4.16 (http://www.groovy-lang.org)
        groovy-2.4.16-indy
        groovy-json-2.4.16-indy
        groovy-sql-2.4.16-indy
    The following NOTICE information applies:
        Apache Groovy
        Copyright 2003-2018 The Apache Software Foundation

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

        This product includes/uses ANTLR (http://www.antlr2.org/)
        developed by Terence Parr 1989-2006

  (ASLv2) Groovy (org.codehaus.groovy:groovy-all:jar:2.4.11 - http://www.groovy-lang.org)
     The following NOTICE information applies:
       Apache Groovy
       Copyright 2003-2017 The Apache Software Foundation

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

       This product includes/uses ANTLR (http://www.antlr2.org/)
       developed by Terence Parr 1989-2006

       This product bundles icons from the famfamfam.com silk icons set
       http://www.famfamfam.com/lab/icons/silk/
       Licensed under the Creative Commons Attribution Licence v2.5
       http://creativecommons.org/licenses/by/2.5/

  (ASLv2) Groovy (org.codehaus.groovy:groovy-all:jar:2.1.6 - http://www.groovy-lang.org)
    The following NOTICE information applies:
      Groovy Language
         Copyright 2003-2012 The respective authors and developers
         Developers and Contributors are listed in the project POM file
         and Gradle build file

     This product includes software developed by
     The Groovy community (http://groovy.codehaus.org/).

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

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


        This software includes code from IntelliJ IDEA Community Edition
        Copyright (C) JetBrains s.r.o.
        https://www.jetbrains.com/idea/
        Licensed under Apache License, Version 2.0.
        http://search.maven.org/#artifactdetails%7Corg.jetbrains%7Cannotations%7C13.0%7Cjar

    (ASLv2) Apache Geronimo JSR-107 JCache Spec API
      The following NOTICE information applies:
        Apache Geronimo JSR-107 JCache Spec API
        Copyright 2009-2014 The Apache Software Foundation

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

    (ASLv2) RethinkDB Java Driver
      The following NOTICE information applies:
      RethinkDB Language Drivers

      Copyright 2010-2012 RethinkDB

    (ASLv2) Neo4j Java Driver
      Neo4j
      Copyright © 2002-2018 Neo4j Sweden AB (referred to in this notice as "Neo4j")
      [http://neo4j.com]

    (ASLv2) Carrotsearch HPPC
      The following NOTICE information applies:
      HPPC borrowed code, ideas or both from:

       * Apache Lucene, http://lucene.apache.org/
         (Apache license)
       * Fastutil, http://fastutil.di.unimi.it/
         (Apache license)
       * Koloboke, https://github.com/OpenHFT/Koloboke
         (Apache license)

    (ASLv2) t-digest
       The following NOTICE information applies:
       The code for the t-digest was originally authored by Ted Dunning
       A number of small but very helpful changes have been contributed by Adrien Grand (https://github.com/jpountz)

    (ASLv2) subethasmtp
       The following NOTICE information applies:
       Copyright (C) 2006-2007 SubEthaMail.org

    (ASLv2) Apache OpenNLP Tools
      Apache OpenNLP Tools
      Copyright 2015 The Apache Software Foundation

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

    (ASLv2) Apache Hive
       The following NOTICE information applies:
       Apache Hive
       Copyright 2008-2015 The Apache Software Foundation

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

       This product includes Jersey (https://jersey.java.net/)
       Copyright (c) 2010-2014 Oracle and/or its affiliates.

       This project includes software copyrighted by Microsoft Corporation and
       licensed under the Apache License, Version 2.0.

       This project includes software copyrighted by Dell SecureWorks and
       licensed under the Apache License, Version 2.0.

    (ASLv2) BoneCP
       The following NOTICE information applies:
       BoneCP
       Copyright 2010 Wallace Wadge

  (ASLv2) Apache Hadoop
    The following NOTICE information applies:
      The binary distribution of this product bundles binaries of
      org.iq80.leveldb:leveldb-api (https://github.com/dain/leveldb), which has the
      following notices:
      * Copyright 2011 Dain Sundstrom <dain@iq80.com>
      * Copyright 2011 FuseSource Corp. http://fusesource.com

      The binary distribution of this product bundles binaries of
      org.fusesource.hawtjni:hawtjni-runtime (https://github.com/fusesource/hawtjni),
      which has the following notices:
      * This product includes software developed by FuseSource Corp.
        http://fusesource.com
      * This product includes software developed at
        Progress Software Corporation and/or its  subsidiaries or affiliates.
      * This product includes software developed by IBM Corporation and others.

  (ASLv2) ParCEFone
    The following NOTICE information applies:
      ParCEFone
      Copyright 2016 Fluenda

  (ASLv2) Grok
    The following NOTICE information applies:
      Grok
      Copyright 2014 Anthony Corbacho, and contributors.

  (ASLv2) gRPC-Java
    The following NOTICE information applies:
	Copyright 2014, gRPC Authors All rights reserved.

	Licensed 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.

	-----------------------------------------------------------------------

	This product contains a modified portion of 'OkHttp', an open source
	HTTP & SPDY client for Android and Java applications, which can be obtained
	at:

	  * LICENSE:
	    * okhttp/third_party/okhttp/LICENSE (Apache License 2.0)
	  * HOMEPAGE:
	    * https://github.com/square/okhttp
	  * LOCATION_IN_GRPC:
	    * okhttp/third_party/okhttp

	This product contains a modified portion of 'Netty', an open source
	networking library, which can be obtained at:

	  * LICENSE:
	    * netty/third_party/netty/LICENSE.txt (Apache License 2.0)
	  * HOMEPAGE:
	    * https://netty.io
	  * LOCATION_IN_GRPC:
    * netty/third_party/netty

  (ASLv2) Ehcache 2.x
    The following NOTICE information applies:
      Copyright 2003-2010 Terracotta, Inc.

  (ASLv2) The Netty Project
      The following NOTICE information applies:
  	Copyright 2014 The Netty Project
  	-------------------------------------------------------------------------------
  	This product contains the extensions to Java Collections Framework which has
  	been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene:

  	  * LICENSE:
  	    * license/LICENSE.jsr166y.txt (Public Domain)
  	  * HOMEPAGE:
  	    * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/
  	    * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/

  	This product contains a modified version of Robert Harder's Public Domain
  	Base64 Encoder and Decoder, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.base64.txt (Public Domain)
  	  * HOMEPAGE:
  	    * http://iharder.sourceforge.net/current/java/base64/

  	This product contains a modified portion of 'Webbit', an event based
  	WebSocket and HTTP server, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.webbit.txt (BSD License)
  	  * HOMEPAGE:
  	    * https://github.com/joewalnes/webbit

  	This product contains a modified portion of 'SLF4J', a simple logging
  	facade for Java, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.slf4j.txt (MIT License)
  	  * HOMEPAGE:
  	    * http://www.slf4j.org/

  	This product contains a modified portion of 'Apache Harmony', an open source
  	Java SE, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.harmony.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * http://archive.apache.org/dist/harmony/

  	This product contains a modified portion of 'jbzip2', a Java bzip2 compression
  	and decompression library written by Matthew J. Francis. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jbzip2.txt (MIT License)
  	  * HOMEPAGE:
  	    * https://code.google.com/p/jbzip2/

  	This product contains a modified portion of 'libdivsufsort', a C API library to construct
  	the suffix array and the Burrows-Wheeler transformed string for any input string of
  	a constant-size alphabet written by Yuta Mori. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.libdivsufsort.txt (MIT License)
  	  * HOMEPAGE:
  	    * https://github.com/y-256/libdivsufsort

  	This product contains a modified portion of Nitsan Wakart's 'JCTools', Java Concurrency Tools for the JVM,
  	 which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jctools.txt (ASL2 License)
  	  * HOMEPAGE:
  	    * https://github.com/JCTools/JCTools

  	This product optionally depends on 'JZlib', a re-implementation of zlib in
  	pure Java, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jzlib.txt (BSD style License)
  	  * HOMEPAGE:
  	    * http://www.jcraft.com/jzlib/

  	This product optionally depends on 'Compress-LZF', a Java library for encoding and
  	decoding data in LZF format, written by Tatu Saloranta. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.compress-lzf.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/ning/compress

  	This product optionally depends on 'lz4', a LZ4 Java compression
  	and decompression library written by Adrien Grand. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.lz4.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/jpountz/lz4-java

  	This product optionally depends on 'lzma-java', a LZMA Java compression
  	and decompression library, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.lzma-java.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/jponge/lzma-java

  	This product contains a modified portion of 'jfastlz', a Java port of FastLZ compression
  	and decompression library written by William Kinney. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jfastlz.txt (MIT License)
  	  * HOMEPAGE:
  	    * https://code.google.com/p/jfastlz/

  	This product contains a modified portion of and optionally depends on 'Protocol Buffers', Google's data
  	interchange format, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.protobuf.txt (New BSD License)
  	  * HOMEPAGE:
  	    * https://github.com/google/protobuf

  	This product optionally depends on 'Bouncy Castle Crypto APIs' to generate
  	a temporary self-signed X.509 certificate when the JVM does not provide the
  	equivalent functionality.  It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.bouncycastle.txt (MIT License)
  	  * HOMEPAGE:
  	    * http://www.bouncycastle.org/

  	This product optionally depends on 'Snappy', a compression library produced
  	by Google Inc, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.snappy.txt (New BSD License)
  	  * HOMEPAGE:
  	    * https://github.com/google/snappy

  	This product optionally depends on 'JBoss Marshalling', an alternative Java
  	serialization API, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.jboss-marshalling.txt (GNU LGPL 2.1)
  	  * HOMEPAGE:
  	    * http://www.jboss.org/jbossmarshalling

  	This product optionally depends on 'Caliper', Google's micro-
  	benchmarking framework, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.caliper.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/google/caliper

  	This product optionally depends on 'Apache Commons Logging', a logging
  	framework, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.commons-logging.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * http://commons.apache.org/logging/

  	This product optionally depends on 'Apache Log4J', a logging framework, which
  	can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.log4j.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * http://logging.apache.org/log4j/

  	This product optionally depends on 'Aalto XML', an ultra-high performance
  	non-blocking XML processor, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.aalto-xml.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * http://wiki.fasterxml.com/AaltoHome

  	This product contains a modified version of 'HPACK', a Java implementation of
  	the HTTP/2 HPACK algorithm written by Twitter. It can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.hpack.txt (Apache License 2.0)
  	  * HOMEPAGE:
  	    * https://github.com/twitter/hpack

  	This product contains a modified portion of 'Apache Commons Lang', a Java library
  	provides utilities for the java.lang API, which can be obtained at:

  	  * LICENSE:
  	    * license/LICENSE.commons-lang.txt (Apache License 2.0)
  	  * HOMEPAGE:
      * https://commons.apache.org/proper/commons-lang/

      This product contains a forked and modified version of Tomcat Native

        * LICENSE:
          * ASL2
        * HOMEPAGE:
          * http://tomcat.apache.org/native-doc/
          * https://svn.apache.org/repos/asf/tomcat/native/

  (ASLv2) Error Prone
    The following NOTICE information applies:
      Copyright 2017 Google Inc.

  (ASLv2) Instrumentation
    The following NOTICE information applies:
      Copyright 2016 Google Inc.

  (ASLv2) Google APIs
    The following NOTICE information applies:
      Copyright 2016 Google Inc.

  (ASLv2) Android JSON library
    The following NOTICE information applies:
      Copyright (C) 2010 The Android Open Source Project

  (ASLv2) tlsh
    The following NOTICE information applies:
       Java port of Trend Locality Sensitive Hash (TLSH)
       Copyright 2000-2016 Idealista, S.A

       This product includes software developed at
       Idealista, S.A (http://www.idealista.com/)

       Based on the algorithms described in Trend Micro's TLSH official
       repository, available in:

         https://github.com/trendmicro/tlsh

       Refer to the following publication for more information:

         Jonathan Oliver, Chun Cheng and Yanggui Chen, “TLSH - A Locality
         Sensitive Hash” - 4th Cybercrime and Trustworthy Computing Workshop,
         Sydney, November 2013

         https://drive.google.com/file/d/0B6FS3SVQ1i0GTXk5eDl3Y29QWlk/edit?usp=sharing

       This software is inspired in the previous Java port developed by TripleCheck:

         https://github.com/triplecheck/TLSH

  (ASLv2) Apache Parquet
    The following NOTICE information applies:
      Apache Parquet MR (Incubating)
      Copyright 2014 The Apache Software Foundation

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

  (ASLv2) Hortonworks Schema Registry
    The following NOTICE information applies:
      Hortonworks Schema Registry
      Copyright 2016-2017 Hortonworks, Inc.

  (ASLv2) Aggregate Designer
    The following NOTICE information applies:

        Aggregate Designer

        Copyright 2006 - 2013 Pentaho Corporation.  All rights reserved.
        Copyright 2000-2005, 2014-2016 Julian Hyde

  (ASLv2) Classmate
    The following NOTICE information applies
        Java ClassMate library was originally written by Tatu Saloranta (tatu.saloranta@iki.fi)

        Other developers who have contributed code are:

        * Brian Langel

    (ASLv2) Boilerpipe
      The following NOTICE information applies:
          Copyright (c) 2009-2011 Christian Kohlschütter

    (ASLv2) Apache Ivy
        The following NOTICE information applies:
           Copyright 2007-2017 The Apache Software Foundation

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

           Portions of Ivy were originally developed at
           Jayasoft SARL (http://www.jayasoft.fr/)
           and are licensed to the Apache Software Foundation under the
           "Software Grant License Agreement"

           SSH and SFTP support is provided by the JCraft JSch package,
           which is open source software, available under
           the terms of a BSD style license.
           The original software and related information is available
           at http://www.jcraft.com/jsch/.

    (ASLv2) DataStax Java Driver for Apache Cassandra - Core
        The following NOTICE information applies:
          DataStax Java Driver for Apache Cassandra - Core
          Copyright (C) 2012-2017 DataStax Inc.
    (ASLv2) bytebuffer-collections
        The following NOTICE information applies:
          bytebuffer-collections
          Copyright 2011-2015 Metamarkets Group Inc.

    (ASLv2) Druid
        The following NOTICE information applies:
          Druid - a distributed column store.
          Copyright 2012-2016 Metamarkets Group Inc.
          Copyright 2015-2016 Yahoo! Inc.
          Copyright 2015-2016 Imply Data, Inc.

          -------------------------------------------------------------------------------

          This product contains a modified version of Andrew Duffy's java-alphanum library
            * LICENSE:
              * https://github.com/amjjd/java-alphanum/blob/5c036e2e492cc7f3b7bcdebd46b8f9e2a87927e5/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/amjjd/java-alphanum

          This product contains conjunctive normal form conversion code and a variance aggregator algorithm adapted from Apache Hive
            * LICENSE:
              * https://github.com/apache/hive/blob/branch-2.0/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/apache/hive

          This product contains variable length long deserialization code adapted from Apache Lucene
            * LICENSE:
              * https://github.com/apache/lucene-solr/blob/master/lucene/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/apache/lucene-solr

          This product contains a modified version of Metamarkets java-util library
            * LICENSE:
              * https://github.com/metamx/java-util/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/java-util
            * COMMIT TAG:
              * https://github.com/metamx/java-util/commit/826021f

          This product contains a modified version of TestNG 6.8.7
            * LICENSE:
              * http://testng.org/license/ (Apache License, Version 2.0)
            * HOMEPAGE:
              * http://testng.org/

          This product contains a modified version of Metamarkets bytebuffer-collections library
            * LICENSE:
              * https://github.com/metamx/bytebuffer-collections/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/bytebuffer-collections
            * COMMIT TAG:
              * https://github.com/metamx/bytebuffer-collections/commit/3d1e7c8

          This product contains SQL query planning code adapted from Apache Calcite
            * LICENSE:
              * https://github.com/apache/calcite/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://calcite.apache.org/

          This product contains a modified version of Metamarkets extendedset library
            * LICENSE:
              * https://github.com/metamx/extendedset/blob/master/LICENSE (Apache License, Version 2.0)
            * HOMEPAGE:
              * https://github.com/metamx/extendedset
            * COMMIT TAG:
              * https://github.com/metamx/extendedset/commit/c9d647d

          This product contains a modified version of Alessandro Colantonio's CONCISE
          (COmpressed 'N' Composable Integer SEt) library, extending the functionality of
          ConciseSet to use IntBuffers.
            * (c) 2010 Alessandro Colantonio
            * <mailto:colanton@mat.uniroma3.it>
            * <http://ricerca.mat.uniroma3.it/users/colanton>
            * LICENSE:
              * Apache License, Version 2.0
            * HOMEPAGE:
              * https://sourceforge.net/projects/concise/

          This product contains a modified version of The Guava Authors's Closer class from Guava library:
           * LICENSE:
             * https://github.com/google/guava/blob/c462d69329709f72a17a64cb229d15e76e72199c/COPYING (Apache License, Version 2.0)
           * HOMEPAGE:
             * https://github.com/google/guava
           * COMMIT TAG:
             * https://github.com/google/guava/blob/c462d69329709f72a17a64cb229d15e76e72199c

          This product contains code adapted from Apache Hadoop
            * LICENSE:
              * https://github.com/apache/hadoop/blob/trunk/LICENSE.txt (Apache License, Version 2.0)
            * HOMEPAGE:
              * http://hadoop.apache.org/

      (ASLv2) Emitter
        The following NOTICE information applies:
          emitter
          Copyright 2012-2015 Metamarkets Group Inc.

      (ASLv2) Finagle
        The following NOTICE information applies:
          Copyright 2017, Twitter Inc.
          This software contains portions of code from other open-source projects, including:
          >>>>>>>>>>>>>>
          Apache Thrift
          Copyright 2006-2010 The Apache Software Foundation.

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

  (ASLv2) java-util
    The following NOTICE information applies:
       java-util
       Copyright 2011-2017 Metamarkets Group Inc.

  (ASLv2) jdbi
    The following NOTICE information applies:
      This product includes software developed by Brian McCallister

  (ASLv2) Joda Convert
       The following NOTICE information applies:
         Joda Convert
         Copyright 2010-present Stephen Colebourne

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


         Joda-Convert includes code from Google Guava, which is licensed as follows:

         Copyright (C) 2011 The Guava Authors

         Licensed 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.

  (ASLv2) loglady
    The following NOTICE information applies:
       Copyright (c) 2013 Daniel Lundin

  (ASLv2) scala_util
    The following NOTICE information applies:
      Copyright 2012 Metamarkets Group Inc.

  (ASLv2) server-metrics
    The following NOTICE information applies:
      server-metrics
      Copyright 2011-2015 Metamarkets Group Inc.

  (ASLv2) simple-syslog-5424
    The following NOTICE information applies:

        simple-syslog-5424
        https://github.com/palindromicity/simple-syslog-5424

        Copyright 2018 simple-syslog-5424 authors.

  (ASLv2) Audience Annotations
    The following NOTICE information applies:
      Apache Yetus
      Copyright 2008-2018 The Apache Software Foundation

  (ASLv2) sshj
    The following NOTICE information applies:

      sshj - SSHv2 library for Java
      Copyright 2010-2012 sshj contributors

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

      - Apache MINA SSHD
      - Apache Commons-Net

  (ASLv2) Nimbus Language Tags
      The following NOTICE information applies:
        Nimbus Language Tags
        Copyright 2012-2016, Connect2id Ltd.

  (ASLv2) Nimbus OAuth 2.0 SDK with OpenID Connect extensions
    The following NOTICE information applies:
      Nimbus OAuth 2.0 SDK with OpenID Connect extensions
      Copyright 2012-2020, Connect2id Ltd and contributors.

  (ASLv2) Okio
    The following NOTICE information applies:
      Okio
      Copyright 2013 Square, Inc.

  (ASLv2) Apache Qpid Proton-J
    The following NOTICE information applies:
      Apache Qpid Proton-J
      Copyright 2012-2020 The Apache Software Foundation

  (ASLv2) Retrofit
    The following NOTICE information applies:
      Retrofit
      Copyright 2013 Square, Inc.

  (ASLv2) RxJava
    The following NOTICE information applies:
      RxJava
      Copyright (c) 2016-present, RxJava Contributors.

  (ASLv2) ASM Based Accessors Helper Used By JSON Smart (net.minidev:accessors-smart:jar:1.2 - http://www.minidev.net/)
    The following NOTICE information applies:
      ASM Based Accessors Helper Used By JSON Smart 1.2
      Copyright 2017, Uriel Chemouni

  (ASLv2) Adapter: RxJava (com.squareup.retrofit2:adapter-rxjava:jar:2.6.2)
    The following NOTICE information applies:
      Adapter: RxJava 2.6.2
      Copyright 2019, Jake Wharton

  (ASLv2) BCrypt Password Hashing Function (at.favre.lib:bcrypt:jar:0.9.0 - https://github.com/patrickfav/bcrypt)
    The following NOTICE information applies:
      BCrypt Password Hashing Function 0.9.0
      Copyright 2018 Patrick Favre-Bulle

  (ASLv2) Bytes Utility Library (at.favre.lib:bytes:jar:1.3.0 - https://github.com/patrickfav/bytes-java)
    The following NOTICE information applies:
      Bytes Utility Library 1.3.0
      Copyright 2017 Patrick Favre-Bulle

  (ASLv2) Converter: Jackson (com.squareup.retrofit2:converter-jackson:jar:2.5.0)
    The following NOTICE information applies:
      Converter: Jackson 2.5.0
      Copyright 2018, Jake Wharton

  (ASLv2) Nimbus JOSE+JWT (com.nimbusds:nimbus-jose-jwt:jar:6.0.1 - https://bitbucket.org/connect2id/nimbus-jose-jwt)
    The following NOTICE information applies:
      Nimbus JOSE+JWT 6.0.1
      Copyright 2018, Connect2id Ltd.

  (ASLv2) OkHttp Logging Interceptor (com.squareup.okhttp3:logging-interceptor:jar:3.12.2)
    The following NOTICE information applies:
      OkHttp Logging Interceptor 3.12.2
      Copyright 2019 Square, Inc.

  (ASLv2) OkHttp (com.squareup.okhttp3:okhttp:jar:3.12.6)
    The following NOTICE information applies:
      OkHttp 3.12.6
      Copyright 2019 Square, Inc.

  (ASLv2) OkHttp URLConnection (com.squareup.okhttp3:okhttp-urlconnection:jar:3.12.2)
    The following NOTICE information applies:
      OkHttp 3.12.2
      Copyright 2019 Square, Inc.

  (ASLv2) Woodstox (com.fasterxml.woodstox:woodstox-core:jar:6.1.1 - https://github.com/FasterXML/woodstox)
    The following NOTICE information applies:
      Woodstox Core 6.1.1
      Copyright 2015, FasterXML, LLC

  (ASLv2) Non Blocking Reactive Foundation For The JVM (io.projectreactor:reactor-core:jar:3.3.5.RELEASE - https://github.com/reactor/reactor-core)
    The following NOTICE information applies:
      Non Blocking Reactive Foundation For The JVM
      Copyright 2020, Project Reactor

  (ASLv2) Reactive Streams Netty Driver (io.projectreactor.netty:reactor-netty:jar:0.9.7.RELEASE - https://github.com/reactor/reactor-netty)
    The following NOTICE information applies:
       Reactive Streams Netty Driver
       Copyright 2020, Project Reactor

  (ALSv2) smbj
    The following NOTICE information applies:
      Copyright (C)2016 - SMBJ Contributors

  (ASLv2) asn-one
    The following NOTICE information applies:
      Copyright 2016 Jeroen van Erp <jeroen@hierynomus.com>

  (ASLv2) Apache Ftplet API
    The following NOTICE information applies:
      Apache Ftplet API 1.1.1
      Copyright 2003-2017 The Apache Software Foundation

  (ASLv2) Apache FtpServer Core
    The following NOTICE information applies:
      Apache FtpServer Core 1.1.1
      Copyright 2003-2017 The Apache Software Foundation

  (ASLv2) Zip4j
    The following NOTICE information applies:
      Zip4j 2
      Copyright 2021 Srikanth Reddy Lingala

  (ASLv2) QuestDB (org.questdb:core:core-4.2.1.jar - https://github.com/questdb/questdb)
    The following NOTICE information applies:
      Copyright (c) 2014-2019 Appsicle
      Copyright (c) 2019-2020 QuestDB

************************
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-client (org.glassfish.jersey.core:jersey-client:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-container-servlet-core (org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-entity-filtering (org.glassfish.jersey.ext:jersey-entity-filtering:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-hk2 (org.glassfish.jersey.inject:jersey-hk2:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-jaxb (org.glassfish.jersey.media:jersey-media-jaxb:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-json-jackson (org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (org.glassfish.jersey.core:jersey-server:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2 (org.glassfish.hk2:hk2:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-api (org.glassfish.hk2:hk2-api:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-utils (org.glassfish.hk2:hk2-utils:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-locator (org.glassfish.hk2:hk2-locator:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-config (org.glassfish.hk2:hk2-config:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-core (org.glassfish.hk2:hk2-core:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-runlevel (org.glassfish.hk2:hk2-runlevel:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) config-types (org.glassfish.hk2:config-types:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) class-model (org.glassfish.hk2:class-model:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) asm-all-repackaged (org.glassfish.hk2.external:asm-all-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) aopalliance-repackaged (org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (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) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guava (org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.19 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-multipart (org.glassfish.jersey.media:jersey-media-multipart:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guava (org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.22.1 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (com.sun.jersey:jersey-client:jar:1.9 - https://jersey.java.net/jersey-client/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-core (com.sun.jersey:jersey-core:jar:1.9 - https://jersey.java.net/jersey-core/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-json (com.sun.jersey:jersey-json:jar:1.9 - https://jersey.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (com.sun.jersey:jersey-server:jar:1.9 - https://jersey.java.net/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-guice (com.sun.jersey.contribs:jersey-guice:jar:1.9 - https://jersey.java.net/)


    (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) 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) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.1 - http://jax-rs-spec.java.net)

    (CDDL 1.1) (GPL2 w/ CPE) JavaBeans Activation Framework API (javax.activation:javax.activation-api:jar:1.2.0)
    (CDDL 1.1) (GPL2 w/ CPE) JavaMail API (com.sun.mail:javax.mail:jar:1.6.1)
    (CDDL 1.1) (GPL2 w/ CPE) JAXB API (javax.xml.bind:jaxb-api:jar:2.3.0)
    (CDDL 1.1) (GPL 1.1) Old JAXB Core (com.sun.xml.bind:jaxb-core:jar:2.3.0)
    (CDDL 1.1) (GPL 1.1) Old JAXB Runtime (com.sun.xml.bind:jaxb-impl:jar:2.3.0)

************************
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) JavaServlet(TM) Specification (javax.servlet:servlet-api:jar:2.5 - no url available)
    (CDDL 1.0) (GPL3) Streaming API For XML (javax.xml.stream:stax-api:jar:1.0-2 - no url provided)
    (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) JHighlight (org.codelibs:jhighlight:1.0.2 - https://github.com/codelibs/jhighlight)
    (CDDL 1.0) Javax Transaction API (javax.transaction:transaction-api:jar:1.1 - no url available)

************************
Creative Commons Attribution-ShareAlike 3.0
************************

The following binary components are provided under the Creative Commons Attribution-ShareAlike 3.0.  See project link for details.

	(CCAS 3.0) MaxMind DB (https://github.com/maxmind/MaxMind-DB)

************************
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) Model-Driven Health Tools ( org.openehealth.ipf.oht.mdht ) https://projects.eclipse.org/proposals/model-driven-health-tools
    (EPL 1.0) AspectJ Weaver (org.aspectj:aspectjweaver:jar:1.9.6 - http://www.eclipse.org/aspectj/)
    (EPL 1.0) AspectJ Runtime (org.aspectj:aspectjrt:jar:1.9.6 - http://www.eclipse.org/aspectj/)
    (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.2.3 - http://logback.qos.ch/)
    (EPL 1.0)(LGPL 2.1) Logback Core (ch.qos.logback:logback-core:jar:1.2.3 - http://logback.qos.ch/)
    (EPLv1.0)(GPL 2)(LGPL 2.1) JRuby (org.jruby:jruby-complete:9.1.9.0 - http://jruby.org).
    (EPL 1.0) Eclipse Paho MQTT Client (org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0 - https://github.com/eclipse/paho.mqtt.java)
    (EPL 1.0) Eclipse Link (org.eclipse.persistence:eclipselink:2.5.2 - http://www.eclipse.org/eclipselink/)
    (EPL 1.0) Common Service Data Objects (org.eclipse.persistence:commonj.sdo:2.1.1 - http://www.eclipse.org/eclipselink/)
    (EPL 1.0) Java Persistence API (org.eclipse.persistence:javax.persistence:2.1.0 - http://www.eclipse.org/eclipselink/)
    (EPL 1.0) JaCoCo Java Code Coverage Library ( org.jacoco ) http://www.eclemma.org/jacoco
    (EPLv1.0) Clojure (org.clojure:clojure:1.8.0 - http://clojure.org)

************************
Eclipse Public License 2.0
************************

The following binary components are provided under the Eclipse Public License 2.0.

    (EPL 2.0) Jakarta Mail API (jakarta.mail:jakarta.mail-api:jar:2.0.1)
    (EPL 2.0) Jakarta Mail (com.sun.mail:jakarta.mail:jar:2.0.1)

************************
Eclipse Distribution License 1.0
************************

The following binary components are provided under the Eclipse Distribution License 1.0.

    (EDL 1.0) Jakarta Activation API (jakarta.activation:jakarta.activation-api:jar:2.0.1)
    (EDL 1.0) Jakarta Activation (com.sun.activation:jakarta.activation:jar:2.0.1)
    (EDL 1.0) Jakarta XML Binding API (jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2)

*****************
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/)
    (MPL 2.0) Rhino (org.mozilla:rhino:jar:1.7R5 - https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Download_Rhino)

*****************
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/)
    (MPL 1.1) Java port of universalchardet (com.googlecode.juniversalchardet:juniversalchardet:1.0.3 - https://code.google.com/archive/p/juniversalchardet/)

******************
Python Software Foundation License v2
******************

The following binary components are provided under the Python Software Foundation License v2

  (PSFLv2) Jython (org.python:jython-standalone:2.7.0 - http://www.jython.org/)

*****************
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)
    (CC0v1.0) Reactive Streams (org.reactivestreams:reactive-streams:jar:1.0.3 - http://www.reactive-streams.org/)

******************
SIL OFL 1.1
******************

The following binary components are provided under the SIL Open Font License 1.1
  (SIL OFL 1.1) FontAwesome (4.7.0 - https://fontawesome.com/license/free)
