Apache Baremaps (incubating)
Copyright 2022-2025 The Apache Software Foundation.

Baremaps development team
Copyright 2020-2022.

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

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

This product contains code from Planetiler project

## Licenses

Planetiler licensed under the Apache license, Version 2.0

Copyright 2021 Michael Barry and Planetiler Contributors.

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

Apache Calcite
Copyright 2012-2024 The Apache Software Foundation

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

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.

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

Apache Commons Compress
Copyright 2002-2024 The Apache Software Foundation

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

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

Apache Lucene
Copyright 2001-2024 The Apache Software Foundation

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

Includes software from other Apache Software Foundation projects,
including, but not limited to:
 - 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 class org.apache.lucene.util.compress.LZ4 is a Java rewrite of the LZ4
compression library (https://github.com/lz4/lz4/tree/dev/lib) that is licensed
under the 2-clause BSD license.
(https://opensource.org/licenses/bsd-license.php)

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

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
  https://snowballstem.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, Hindi and Bengali 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,
analysis/common/src/resources/org/apache/lucene/analysis/bn/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 https://github.com/carrot2/carrot2.

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
(https://github.com/morfologik/morfologik-stemming) and uses
data from the BSD-licensed dictionary of Polish (SGJP, http://sgjp.pl/morfeusz/).

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

===========================================================================
Nori Korean Morphological Analyzer - Apache Lucene Integration
===========================================================================

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

  mecab-ko-dic-2.1.1-20180720

which can be obtained from

  https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.1.1-20180720.tar.gz

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

## Eclipse Foundation Software User Agreement

April 9, 2014

### Usage Of Content

THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE
PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR
THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE
THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE
AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT
AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY
NOT USE THE CONTENT.

### Applicable Licenses

Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and
conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is
also available at [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html). For purposes
of the EPL, "Program" will mean the Content.

Content includes, but is not limited to, source code, object code, documentation and other files maintained in the
Eclipse Foundation source code repository ("Repository") in software modules ("Modules") and made available as
downloadable archives ("Downloads").

*   Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.
    Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").
*   Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".
*   A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged
    as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list
    of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.
*   Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may
    contain a list of the names and version numbers of Included Features.

The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts").
The terms and conditions governing Features and Included Features should be contained in files named "license.html"
("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but
not limited to the following locations:

*   The top-level (root) directory
*   Plug-in and Fragment directories
*   Inside Plug-ins and Fragments packaged as JARs
*   Sub-directories of the directory named "src" of certain Plug-ins
*   Feature directories

Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined
below), you must agree to a license ("Feature Update License") during the installation process. If the Feature contains
Included Features, the Feature Update License should either provide you with the terms and conditions governing the
Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license"
property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update
Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the
associated Content in that directory.

THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR
TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):

*   Eclipse Distribution License Version 1.0 (available at
    [http://www.eclipse.org/licenses/edl-v1.0.html](http://www.eclipse.org/licenses/edl-v10.html))
*   Common Public License Version 1.0 (available at
    [http://www.eclipse.org/legal/cpl-v10.html](http://www.eclipse.org/legal/cpl-v10.html))
*   Apache Software License 1.1 (available at
    [http://www.apache.org/licenses/LICENSE](http://www.apache.org/licenses/LICENSE))
*   Apache Software License 2.0 (available at
    [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0))
*   Mozilla Public License Version 1.1 (available at
    [http://www.mozilla.org/MPL/MPL-1.1.html](http://www.mozilla.org/MPL/MPL-1.1.html))

IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature
License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and
conditions govern that particular Content.

### Use of Provisioning Technology

The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and
the Eclipse Update Manager ("Provisioning Technology") for the purpose of allowing users to install software,
documentation, information and/or other materials (collectively "Installable Software"). This capability is provided
with the intent of allowing such users to install, extend and update Eclipse-based products. Information about packaging
Installable Software is available at
[http://eclipse.org/equinox/p2/repository_packaging.html](http://eclipse.org/equinox/p2/repository_packaging.html)
("Specification").

You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for
enabling the applicable license agreements relating to the Installable Software to be presented to, and accepted by, the
users of the Provisioning Technology in accordance with the Specification. By using Provisioning Technology in such a
manner and making it available in accordance with the Specification, you further acknowledge your agreement to, and the
acquisition of all necessary rights to permit the following:

1.  A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology on a
    machine ("Target Machine") with the intent of installing, extending or updating the functionality of an
    Eclipse-based product.
2.  During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion
    thereof to be accessed and copied to the Target Machine.
3.  Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the
    Installable Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed
    from the Target Machine in accordance with the Specification. Such Installable Software Agreement must inform the
    user of the terms and conditions that govern the Installable Software and must solicit acceptance by the end user in
    the manner prescribed in such Installable Software Agreement. Upon such indication of agreement by the user, the
    provisioning Technology will complete installation of the Installable Software.

### Cryptography

Content may contain encryption software. The country in which you are currently may have restrictions on the import,
possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software,
please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of
encryption software, to see if this is permitted.

<small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries,
or both.</small>

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

Apache Spatial Information System (SIS)
Copyright 2010-2024 The Apache Software Foundation

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

The Javadoc contains documentation from the Open Geospatial Consortium (OGC®)
specifications (https://www.ogc.org/standards/), also known as OpenGIS®.

Apache SIS depends on GeoAPI published by OGC under BSD-style license.
https://www.ogc.org/about-ogc/policies/software-licenses/

Apache SIS depends on JSR-385 (API only) published under BSD license.
https://jcp.org/en/jsr/detail?id=385

Apache SIS depends on JAXB (API only) published under Eclipse Distribution License 1.0.
http://www.eclipse.org/org/documents/edl-v10.php

The `org.apache.sis.referencing.operation.matrix` package contains code
adapted from JAMA Java Matrix Package in public domain.
http://math.nist.gov/javanumerics/jama/

The `org.apache.sis.feature` module can optionally use the Esri Geometry API
developed by ESRI under Apache license 2, or the Java Topology Suite (JTS)
library under Eclipse Distribution License 1.0.
https://github.com/Esri/geometry-api-java/
https://github.com/locationtech/jts

The `org.apache.sis.storage.netcdf` module can optionally use the UCAR netCDF library
developed by Unidata under MIT-style license.
https://www.unidata.ucar.edu/software/netcdf-java/

The `org.apache.sis.cloud.aws` module depends on the Amazon SDK library
developed by Amazon under Apache 2 license.
https://github.com/aws/aws-sdk-java-v2

The test suite uses software developed by the JUnit community
under Eclipse public license version 2.
https://junit.org/junit5/


-------------------------------------------------------------
  Optional modules NOT included unless explicitly requested
-------------------------------------------------------------
The optional `non-free` group of modules contain geodetic data
collected by the International Association of Oil and Gas Producers.
https://epsg.org/terms-of-use.html

The optional `org.apache.sis.gui` module depends on JavaFX
published under GPL 2 with classpath exception.
https://github.com/openjdk/jfx/blob/master/LICENSE

The optional `org.apache.sis.gui` module downloads Font-GIS at build time.
Font-GIS is published under SIL Open Font License (OFL) version 1.1.

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

This project includes one or more documentation files from OpenJDK, licensed under GPL v2 with Classpath Exception.

These files are included in the source distributions, not in the binary distributions of this project.

The GNU General Public License (GPL)

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Everyone is permitted to copy and distribute verbatim copies of this license
document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share
and change it.  By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change free software--to make sure the
software is free for all its users.  This General Public License applies to
most of the Free Software Foundation's software and to any other program whose
authors commit to using it.  (Some other Free Software Foundation software is
covered by the GNU Library General Public License instead.) You can apply it to
your programs, too.

When we speak of free software, we are referring to freedom, not price.  Our
General Public Licenses are designed to make sure that you have the freedom to
distribute copies of free software (and charge for this service if you wish),
that you receive source code or can get it if you want it, that you can change
the software or use pieces of it in new free programs; and that you know you
can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny
you these rights or to ask you to surrender the rights.  These restrictions
translate to certain responsibilities for you if you distribute copies of the
software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for
a fee, you must give the recipients all the rights that you have.  You must
make sure that they, too, receive or can get the source code.  And you must
show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2)
offer you this license which gives you legal permission to copy, distribute
and/or modify the software.

Also, for each author's protection and ours, we want to make certain that
everyone understands that there is no warranty for this free software.  If the
software is modified by someone else and passed on, we want its recipients to
know that what they have is not the original, so that any problems introduced
by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents.  We
wish to avoid the danger that redistributors of a free program will
individually obtain patent licenses, in effect making the program proprietary.
To prevent this, we have made it clear that any patent must be licensed for
everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification
follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice
placed by the copyright holder saying it may be distributed under the terms of
this General Public License.  The "Program", below, refers to any such program
or work, and a "work based on the Program" means either the Program or any
derivative work under copyright law: that is to say, a work containing the
Program or a portion of it, either verbatim or with modifications and/or
translated into another language.  (Hereinafter, translation is included
without limitation in the term "modification".) Each licensee is addressed as
"you".

Activities other than copying, distribution and modification are not covered by
this License; they are outside its scope.  The act of running the Program is
not restricted, and the output from the Program is covered only if its contents
constitute a work based on the Program (independent of having been made by
running the Program).  Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as
you receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice and
disclaimer of warranty; keep intact all the notices that refer to this License
and to the absence of any warranty; and give any other recipients of the
Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may
at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus
forming a work based on the Program, and copy and distribute such modifications
or work under the terms of Section 1 above, provided that you also meet all of
these conditions:

    a) You must cause the modified files to carry prominent notices stating
    that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in whole or
    in part contains or is derived from the Program or any part thereof, to be
    licensed as a whole at no charge to all third parties under the terms of
    this License.

    c) If the modified program normally reads commands interactively when run,
    you must cause it, when started running for such interactive use in the
    most ordinary way, to print or display an announcement including an
    appropriate copyright notice and a notice that there is no warranty (or
    else, saying that you provide a warranty) and that users may redistribute
    the program under these conditions, and telling the user how to view a copy
    of this License.  (Exception: if the Program itself is interactive but does
    not normally print such an announcement, your work based on the Program is
    not required to print an announcement.)

These requirements apply to the modified work as a whole.  If identifiable
sections of that work are not derived from the Program, and can be reasonably
considered independent and separate works in themselves, then this License, and
its terms, do not apply to those sections when you distribute them as separate
works.  But when you distribute the same sections as part of a whole which is a
work based on the Program, the distribution of the whole must be on the terms
of this License, whose permissions for other licensees extend to the entire
whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your
rights to work written entirely by you; rather, the intent is to exercise the
right to control the distribution of derivative or collective works based on
the Program.

In addition, mere aggregation of another work not based on the Program with the
Program (or with a work based on the Program) on a volume of a storage or
distribution medium does not bring the other work under the scope of this
License.

3. You may copy and distribute the Program (or a work based on it, under
Section 2) in object code or executable form under the terms of Sections 1 and
2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable source
    code, which must be distributed under the terms of Sections 1 and 2 above
    on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three years, to
    give any third party, for a charge no more than your cost of physically
    performing source distribution, a complete machine-readable copy of the
    corresponding source code, to be distributed under the terms of Sections 1
    and 2 above on a medium customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer to
    distribute corresponding source code.  (This alternative is allowed only
    for noncommercial distribution and only if you received the program in
    object code or executable form with such an offer, in accord with
    Subsection b above.)

The source code for a work means the preferred form of the work for making
modifications to it.  For an executable work, complete source code means all
the source code for all modules it contains, plus any associated interface
definition files, plus the scripts used to control compilation and installation
of the executable.  However, as a special exception, the source code
distributed need not include anything that is normally distributed (in either
source or binary form) with the major components (compiler, kernel, and so on)
of the operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the source
code from the same place counts as distribution of the source code, even though
third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as
expressly provided under this License.  Any attempt otherwise to copy, modify,
sublicense or distribute the Program is void, and will automatically terminate
your rights under this License.  However, parties who have received copies, or
rights, from you under this License will not have their licenses terminated so
long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it.
However, nothing else grants you permission to modify or distribute the Program
or its derivative works.  These actions are prohibited by law if you do not
accept this License.  Therefore, by modifying or distributing the Program (or
any work based on the Program), you indicate your acceptance of this License to
do so, and all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program),
the recipient automatically receives a license from the original licensor to
copy, distribute or modify the Program subject to these terms and conditions.
You may not impose any further restrictions on the recipients' exercise of the
rights granted herein.  You are not responsible for enforcing compliance by
third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues), conditions
are imposed on you (whether by court order, agreement or otherwise) that
contradict the conditions of this License, they do not excuse you from the
conditions of this License.  If you cannot distribute so as to satisfy
simultaneously your obligations under this License and any other pertinent
obligations, then as a consequence you may not distribute the Program at all.
For example, if a patent license would not permit royalty-free redistribution
of the Program by all those who receive copies directly or indirectly through
you, then the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply and
the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or
other property right claims or to contest validity of any such claims; this
section has the sole purpose of protecting the integrity of the free software
distribution system, which is implemented by public license practices.  Many
people have made generous contributions to the wide range of software
distributed through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing to
distribute software through any other system and a licensee cannot impose that
choice.

This section is intended to make thoroughly clear what is believed to be a
consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain
countries either by patents or by copyrighted interfaces, the original
copyright holder who places the Program under this License may add an explicit
geographical distribution limitation excluding those countries, so that
distribution is permitted only in or among countries not thus excluded.  In
such case, this License incorporates the limitation as if written in the body
of this License.

9. The Free Software Foundation may publish revised and/or new versions of the
General Public License from time to time.  Such new versions will be similar in
spirit to the present version, but may differ in detail to address new problems
or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any later
version", you have the option of following the terms and conditions either of
that version or of any later version published by the Free Software Foundation.
If the Program does not specify a version number of this License, you may
choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs
whose distribution conditions are different, write to the author to ask for
permission.  For software which is copyrighted by the Free Software Foundation,
write to the Free Software Foundation; we sometimes make exceptions for this.
Our decision will be guided by the two goals of preserving the free status of
all derivatives of our free software and of promoting the sharing and reuse of
software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE,
YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible
use to the public, the best way to achieve this is to make it free software
which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program.  It is safest to attach
them to the start of each source file to most effectively convey the exclusion
of warranty; and each file should have at least the "copyright" line and a
pointer to where the full notice is found.

    One line to give the program's name and a brief idea of what it does.

    Copyright (C) <year> <name of author>

    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the Free
    Software Foundation; either version 2 of the License, or (at your option)
    any later version.

    This program is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
    more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc., 59
    Temple Place, Suite 330, Boston, MA 02111-1307 USA

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it
starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
    with ABSOLUTELY NO WARRANTY; for details type 'show w'.  This is free
    software, and you are welcome to redistribute it under certain conditions;
    type 'show c' for details.

The hypothetical commands 'show w' and 'show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may be
called something other than 'show w' and 'show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school,
if any, to sign a "copyright disclaimer" for the program, if necessary.  Here
is a sample; alter the names:

    Yoyodyne, Inc., hereby disclaims all copyright interest in the program
    'Gnomovision' (which makes passes at compilers) written by James Hacker.

    signature of Ty Coon, 1 April 1989

    Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General Public
License instead of this License.


"CLASSPATH" EXCEPTION TO THE GPL

Certain source files distributed by Oracle America and/or its affiliates are
subject to the following clarification and special exception to the GPL, but
only where Oracle has expressly included in the particular source file's header
the words "Oracle designates this particular file as subject to the "Classpath"
exception as provided by Oracle in the LICENSE file that accompanied this code."

    Linking this library statically or dynamically with other modules is making
    a combined work based on this library.  Thus, the terms and conditions of
    the GNU General Public License cover the whole combination.

    As a special exception, the copyright holders of this library give you
    permission to link this library with independent modules to produce an
    executable, regardless of the license terms of these independent modules,
    and to copy and distribute the resulting executable under terms of your
    choice, provided that you also meet, for each linked independent module,
    the terms and conditions of the license of that module.  An independent
    module is a module which is not derived from or based on this library.  If
    you modify this library, you may extend this exception to your version of
    the library, but you are not obligated to do so.  If you do not wish to do
    so, delete this exception statement from your version.

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

Apache Hadoop
Copyright 2006 and onwards The Apache Software Foundation.

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

Export Control Notice
---------------------

This distribution includes cryptographic software.  The country in
which you currently reside may have restrictions on the import,
possession, use, and/or re-export to another country, of
encryption software.  BEFORE using any encryption software, please
check your country's laws, regulations and policies concerning the
import, possession, or use, and re-export of encryption software, to
see if this is permitted.  See <http://www.wassenaar.org/> for more
information.

The U.S. Government Department of Commerce, Bureau of Industry and
Security (BIS), has classified this software as Export Commodity
Control Number (ECCN) 5D002.C.1, which includes information security
software using or performing cryptographic functions with asymmetric
algorithms.  The form and manner of this Apache Software Foundation
distribution makes it eligible for export under the License Exception
ENC Technology Software Unrestricted (TSU) exception (see the BIS
Export Administration Regulations, Section 740.13) for both object
code and source code.

The following provides more details on the included cryptographic software:

This software uses the SSL libraries from the Jetty project written
by mortbay.org.
Hadoop Yarn Server Web Proxy uses the BouncyCastle Java
cryptography APIs written by the Legion of the Bouncy Castle Inc.

// ------------------------------------------------------------------
// NOTICE file corresponding to the section 4d of The Apache License,
// Version 2.0, in this case for
// ------------------------------------------------------------------


Apache Yetus
Copyright 2008-2017 The Apache Software Foundation

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

---
Additional licenses for the Apache Yetus Source/Website:
---


See LICENSE for terms.



Apache Avro
Copyright 2010 The Apache Software Foundation

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

C JSON parsing provided by Jansson and
written by Petri Lehtinen. The original software is
available from http://www.digip.org/jansson/.


AWS SDK for Java
Copyright 2010-2024 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.

The licenses for these third party components are included in LICENSE.txt


Apache Commons BeanUtils
Copyright 2000-2016 The Apache Software Foundation

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


Apache Commons CLI
Copyright 2001-2009 The Apache Software Foundation

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


Apache Commons Codec
Copyright 2002-2017 The Apache Software Foundation

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

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.


Apache Commons Collections
Copyright 2001-2018 The Apache Software Foundation

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


Apache Commons Compress
Copyright 2002-2018 The Apache Software Foundation

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

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)


Apache Commons Configuration
Copyright 2001-2017 The Apache Software Foundation

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


Apache Commons CSV
Copyright 2005-2014 The Apache Software Foundation

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

src/main/resources/contract.txt
This file was downloaded from http://www.ferc.gov/docs-filing/eqr/soft-tools/sample-csv/contract.txt and contains neither copyright notice nor license.

src/main/resources/transaction.txt
This file was downloaded from http://www.ferc.gov/docs-filing/eqr/soft-tools/sample-csv/transaction.txt and contains neither copyright notice nor license.

src/test/resources/CSVFileParser/bom.csv
src/test/resources/CSVFileParser/test.csv
src/test/resources/CSVFileParser/test_default.txt
src/test/resources/CSVFileParser/test_default_comment.txt
src/test/resources/CSVFileParser/test_rfc4180.txt
src/test/resources/CSVFileParser/test_rfc4180_trim.txt
src/test/resources/CSVFileParser/testCSV85.csv
src/test/resources/CSVFileParser/testCSV85_default.txt
src/test/resources/CSVFileParser/testCSV85_ignoreEmpty.txt
These files are used as test data and test result specifications.


Apache Commons Daemon
Copyright 1999-2013 The Apache Software Foundation

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


Apache Commons Digester
Copyright 2001-2008 The Apache Software Foundation

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


Apache Commons IO
Copyright 2002-2016 The Apache Software Foundation

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


Apache Commons Lang
Copyright 2001-2017 The Apache Software Foundation

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

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


Apache Commons Logging
Copyright 2003-2013 The Apache Software Foundation

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


Apache Commons Math
Copyright 2001-2012 The Apache Software Foundation

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

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

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

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

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

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

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

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

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

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

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


The complete text of licenses and disclaimers associated with the the original
sources enumerated above at the time of code translation are in the LICENSE.txt
file.


Apache Commons Net
Copyright 2001-2017 The Apache Software Foundation

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


Apache Commons Text
Copyright 2014-2018 The Apache Software Foundation

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


Apache Commons Validator
Copyright 2001-2017 The Apache Software Foundation

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


Apache Curator
Copyright 2013-2014 The Apache Software Foundation

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


Ehcache V3
Copyright 2014-2016 Terracotta, Inc.

The product includes software from the Apache Commons Lang project,
under the Apache License 2.0 (see: org.ehcache.impl.internal.classes.commonslang)


Apache Geronimo
Copyright 2003-2018 The Apache Software Foundation

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


Copyright 2014 The gRPC 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.

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


Apache HBase
Copyright 2007-2018 The Apache Software Foundation

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

--
This product incorporates portions of the 'Hadoop' project

Copyright 2007-2009 The Apache Software Foundation

Licensed under the Apache License v2.0
--
Our Orca logo we got here: http://www.vectorfree.com/jumping-orca
It is licensed Creative Commons Attribution 3.0.
See https://creativecommons.org/licenses/by/3.0/us/
We changed the logo by stripping the colored background, inverting
it and then rotating it some.

Later we found that vectorfree.com image is not properly licensed.
The original is owned by vectorportal.com. The original was
relicensed so we could use it as Creative Commons Attribution 3.0.
The license is bundled with the download available here:
http://www.vectorportal.com/subcategory/205/KILLER-WHALE-FREE-VECTOR.eps/ifile/9136/detailtest.asp
--
This product includes portions of the Bootstrap project v3.0.0

Copyright 2013 Twitter, Inc.

Licensed under the Apache License v2.0

This product uses the Glyphicons Halflings icon set.

http://glyphicons.com/

Copyright Jan Kovařík

Licensed under the Apache License v2.0 as a part of the Bootstrap project.

--
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'

Copyright (C) 2007 The Guava Authors

Licensed under the Apache License, Version 2.0


Apache HTrace
Copyright 2016 The Apache Software Foundation

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

In addition, this product includes software dependencies. See
the accompanying LICENSE.txt for a listing of dependencies
that are NOT Apache licensed (with pointers to their licensing)

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


Apache HttpComponents Client
Copyright 1999-2018 The Apache Software Foundation

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


Apache HttpComponents Core
Copyright 2005-2018 The Apache Software Foundation

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


==============================================================
 Jetty Web Container
 Copyright 1995-2017 Mort Bay Consulting Pty Ltd.
==============================================================

The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
unless otherwise noted.

Jetty is dual licensed under both

  * The Apache 2.0 License
    http://www.apache.org/licenses/LICENSE-2.0.html

      and

  * The Eclipse Public 1.0 License
    http://www.eclipse.org/legal/epl-v10.html

Jetty may be distributed under either license.

------
Eclipse

The following artifacts are EPL.
 * org.eclipse.jetty.orbit:org.eclipse.jdt.core

The following artifacts are EPL and ASL2.
 * org.eclipse.jetty.orbit:javax.security.auth.message


The following artifacts are EPL and CDDL 1.0.
 * org.eclipse.jetty.orbit:javax.mail.glassfish


------
Oracle

The following artifacts are CDDL + GPLv2 with classpath exception.
https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

 * javax.servlet:javax.servlet-api
 * javax.annotation:javax.annotation-api
 * javax.transaction:javax.transaction-api
 * javax.websocket:javax.websocket-api

------
Oracle OpenJDK

If ALPN is used to negotiate HTTP/2 connections, then the following
artifacts may be included in the distribution or downloaded when ALPN
module is selected.

 * java.sun.security.ssl

These artifacts replace/modify OpenJDK classes.  The modififications
are hosted at github and both modified and original are under GPL v2 with
classpath exceptions.
http://openjdk.java.net/legal/gplv2+ce.html


------
OW2

The following artifacts are licensed by the OW2 Foundation according to the
terms of http://asm.ow2.org/license.html

org.ow2.asm:asm-commons
org.ow2.asm:asm


------
Apache

The following artifacts are ASL2 licensed.

org.apache.taglibs:taglibs-standard-spec
org.apache.taglibs:taglibs-standard-impl


------
MortBay

The following artifacts are ASL2 licensed.  Based on selected classes from
following Apache Tomcat jars, all ASL2 licensed.

org.mortbay.jasper:apache-jsp
  org.apache.tomcat:tomcat-jasper
  org.apache.tomcat:tomcat-juli
  org.apache.tomcat:tomcat-jsp-api
  org.apache.tomcat:tomcat-el-api
  org.apache.tomcat:tomcat-jasper-el
  org.apache.tomcat:tomcat-api
  org.apache.tomcat:tomcat-util-scan
  org.apache.tomcat:tomcat-util

org.mortbay.jasper:apache-el
  org.apache.tomcat:tomcat-jasper-el
  org.apache.tomcat:tomcat-el-api


------
Mortbay

The following artifacts are CDDL + GPLv2 with classpath exception.

https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

org.eclipse.jetty.toolchain:jetty-schemas

------
Assorted

The UnixCrypt.java code implements the one way cryptography used by
Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
modified April 2001  by Iris Van den Broeke, Daniel Deville.
Permission to use, copy, modify and distribute UnixCrypt
for non-commercial or commercial purposes and without fee is
granted provided that the copyright notice appears in all copies.


Apache Kafka
Copyright 2012 The Apache Software Foundation.

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


Apache Kerby
Copyright 2015-2017 The Apache Software Foundation

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


Apache log4j
Copyright 2010 The Apache Software Foundation

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


Metrics
Copyright 2010-2013 Coda Hale and Yammer, Inc.

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 Netty Project
                            =================

Please visit the Netty web site for more information:

  * http://netty.io/

Copyright 2014 The Netty Project

The Netty Project licenses this file to you 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.

Also, please refer to each LICENSE.<component>.txt file, which is located in
the 'license' directory of the distribution file, for the license terms of the
components that this product depends on.

-------------------------------------------------------------------------------
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:

  * NOTICE:
    * license/NOTICE.harmony.txt
  * 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 the Maven wrapper scripts from 'Maven Wrapper', that provides an easy way to ensure a user has everything necessary to run the Maven build.

  * LICENSE:
    * license/LICENSE.mvn-wrapper.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/takari/maven-wrapper


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

== Contributors ==
  * Tatu Saloranta
    * Providing benchmark suite
  * Alec Wysoker
    * Performance and memory usage improvement


Apache ZooKeeper
Copyright 2009-2018 The Apache Software Foundation

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

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

AWS SDK for Java 2.0
Copyright 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.
- Apache Commons Lang - https://github.com/apache/commons-lang
- Netty Reactive Streams - https://github.com/playframework/netty-reactive-streams
- Jackson-core - https://github.com/FasterXML/jackson-core
- Jackson-dataformat-cbor - https://github.com/FasterXML/jackson-dataformats-binary

The licenses for these third party components are included in LICENSE.txt

- For Apache Commons Lang see also this required NOTICE:
  Apache Commons Lang
  Copyright 2001-2020 The Apache Software Foundation

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

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

This product includes the following softwares developed by David Crawshaw.
See LICENSE.zentus file.

And also, NestedVM (Apache License Version 2.0) is used inside sqlite-

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


Apache Parquet Format
Copyright 2014 The Apache Software Foundation

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

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

Apache Log4j
Copyright 1999-2024 Apache Software Foundation

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

ResolverUtil.java
Copyright 2005-2006 Tim Fennell

Dumbster SMTP test server
Copyright 2004 Jason Paul Kitchen

TypeUtil.java
Copyright 2002-2012 Ramnivas Laddad, Juergen Hoeller, Chris Beams

picocli (http://picocli.info)
Copyright 2017 Remko Popma

TimeoutBlockingWaitStrategy.java and parts of Util.java
Copyright 2011 LMAX Ltd.

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

Armeria
=======

Please visit the official web site for more information:

  * https://armeria.dev/

Copyright 2015 LINE Corporation

LINE Corporation licenses this file to you 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:

  https://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.

Also, please refer to each LICENSE.<component>.<licenseType>.txt file, which
is located in the 'licenses' directory of the distribution file, for the
license terms of the components that this product depends on.


Redistributed binaries
======================

This product contains Bootstrap, distributed by Twitter, Inc:

  * License: license/LICENSE.bootstrap.mit.txt (MIT License)
  * Homepage: https://getbootstrap.com/

This product contains Font Awesome, distributed by Dave Gandy:

  * License: license/LICENSE.fontawesome.ofl11.txt (SIL Open Font License v1.1)
             license/LICENSE.fontawesome.mit.txt (MIT License)
  * Homepage: http://fontawesome.io/

This product contains GraphiQL, distributed by graphql:

  * License: license/LICENSE.bootstrap.mit.txt (MIT License)
  * Homepage: https://graphiql-test.netlify.app/typedoc/

This product contains Handlebars, distributed by Yehuda Katz:

  * License: license/LICENSE.handlebars.mit.txt (MIT License)
  * Homepage: http://handlebarsjs.com/

This product contains jQuery, distributed by jQuery Foundation and other contributors:

  * License: licenses/LICENSE.jquery.mit.txt (MIT License)
  * Homepage: https://jquery.org/

This product contains ReadTheDocs.org Sphinx Theme, distributed by Dave Snider:

  * License: license/LICENSE.rtdtheme.mit.txt (MIT License)
  * Homepage: https://github.com/snide/sphinx_rtd_theme

This product contains Source Sans Pro and Source Code Pro fonts, distributed by Adobe Systems Incorporated:

  * License: licenses/LICENSE.source.ofl11.txt (SIL Open Font License v1.1)
  * Homepage: https://adobe-fonts.github.io/source-sans-pro/
              https://adobe-fonts.github.io/source-code-pro/


Modified redistributions
========================

This product contains a modified part of Brave, distributed by Zipkin.io:

  * License: licenses/LICENSE.brave.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/openzipkin/brave

This product contains a modified part of Eureka, distributed by Netflix:

  * License: licenses/LICENSE.eureka.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/netflix/eureka

This product contains a modified part of Finagle, distributed by Twitter:

  * License: licenses/LICENSE.finagle.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/twitter/finagle

This product contains a modified part of gRPC, distributed by Google:

  * License: licenses/LICENSE.grpc.bsd.txt (New BSD License)
  * Homepage: https://grpc.io/

This product contains a modified part of Guava, distributed by Google:

  * License: licenses/LICENSE.guava.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/google/guava

This product contains a modified part of Helidon Multipart, distributed by Oracle, Inc:

  * License: license/LICENSE.helidon.al20.txt (Apache License v2.0)
  * Homepage: https://helidon.io/

This product contains a modified part of json-minify, distributed by Kyle Simpson:

  * License: licenses/LICENSE.json-minify.mit.txt (MIT License)
  * Homepage: https://github.com/getify/JSON.minify

This product contains a modified part of Netty, distributed by Netty.io:

  * License: licenses/LICENSE.netty.al20.txt (Apache License v2.0)
  * Homepage: https://netty.io/

This product contains a modified part of RxJava, distributed by RxJava Contributors:

  * License: licenses/LICENSE.rxjava.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/ReactiveX/RxJava

This product contains a modified part of Sangria Jackson, distributed by Sangria Contributors:

  * License: licenses/LICENSE.sangria.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/sangria-graphql/sangria-jackson

This product contains a modified part of Spring Boot, distributed by Pivotal Software, Inc:

  * License: licenses/LICENSE.spring.al20.txt (Apache License v2.0)
  * Homepage: https://spring.io/

This product contains a modified part of Twitter Commons, distributed by Twitter, Inc:

  * License: license/LICENSE.twitter.al20.txt (Apache License v2.0)
  * Homepage: https://twitter.github.io/commons/

This product contains a modified part of OkHttp, distributed by Square, Inc:

  * License: license/LICENSE.okhttp.al20.txt (Apache License v2.0)
  * Homepage: https://square.github.io/okhttp

This product contains a modified part of Logback, distributed by QOS.ch, Inc:

  * License: license/LICENSE.logback.lgpl.txt (GNU Lesser General Public License v2.1)
  * Homepage: https://logback.qos.ch/


Dependencies
============

This product depends on AssertJ, distributed by the AssertJ authors:

  * License: licenses/LICENSE.assertj.al20.txt (Apache License v2.0)
  * Homepage: https://joel-costigliola.github.io/assertj/

This product depends on Awaitility, distributed by the Awaitility authors:

  * License: licenses/LICENSE.awaitility.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/awaitility/awaitility

This product depends on Bouncy Castle, distributed by the Legion of the Bouncy Castle:

  * License: licenses/LICENSE.bouncycastle.mit.html (MIT License)
  * Homepage: http://www.bouncycastle.org/

This product depends on Brave, distributed by Zipkin.io:

  * License: licenses/LICENSE.brave.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/openzipkin/brave

This product depends on Brotli4j, distributed by the Brotli4j authors:

  * License: licenses/LICENSE.brotli4j.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/hyperxpro/Brotli4j

This product depends on Caffeine, distributed by Ben Manes:

  * License: licenses/LICENSE.caffeine.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/ben-manes/caffeine

This product depends on cglib, distributed by the cglib authors:

  * License: licenses/LICENSE.cglib.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/cglib/cglib

This product depends on completable-futures, distributed by Spotify AB:

  * License: license/LICENSE.completable-futures.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/spotify/completable-futures

This product depends on dgs-framework, distributed by Netflix:

  * License: licenses/LICENSE.dgs.al20.txt (Apache License v2.0)
  * Homepage: https://netflix.github.io/dgs/

This product depends on Dropwizard Metrics, distributed by Coda Hale:

  * License: licenses/LICENSE.dropwizard.al20.txt (Apache License v2.0)
  * Homepage: http://metrics.dropwizard.io/

This product depends on FastUtil, distributed by Sebastiano Vigna:

  * License: licenses/LICENSE.fastutil.al20.txt (Apache License v2.0)
  * Homepage: http://fastutil.di.unimi.it/

This product depends on JCTools, distributed by Nitsan Wakart and contributors:

  * License: licenses/LICENSE.jctools.al20.txt (Apache License v2.0)
  * Homepage: http://jctools.github.io/JCTools/

This product depends on JUnit Pioneer, distributed by JUnit Pioneer Contributors:

  * License: licenses/LICENSE.junit-pioneer.epl20.txt (Eclipse Public License v2.0)
  * Homepage: https://junit-pioneer.org

This product depends on FindBugs-JSR305, distributed by

  * License: licenses/LICENSE.jsr305.bsd.txt (New BSD License)
  * Homepage: http://findbugs.sourceforge.net/

This product depends on graphql-java, distributed by Andreas Marek:

  * License: licenses/LICENSE.graphql-java.mit.txt (MIT License)
  * Homepage: https://www.graphql-java.com/

This product depends on graphql-kotlin, distributed by ExpediaGroup:

  * License: licenses/LICENSE.graphql-kotlin.al20.txt (Apache License v2.0)
  * Homepage: https://opensource.expediagroup.com/graphql-kotlin/

This product depends on gRPC, distributed by Google:

  * License: licenses/LICENSE.grpc.bsd.txt (New BSD License)
  * Homepage: https://grpc.io/

This product depends on Guava, distributed by Google:

  * License: licenses/LICENSE.guava.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/google/guava

This product depends on Hibernate Validator, distributed by Red Hat, Inc:

  * License: licenses/LICENSE.hibernate-validator.al20.txt (Apache License v2.0)
  * Homepage: http://hibernate.org/validator/

This product depends on Apache HttpComponents, distributed by Apache Software Foundation:

  * License: licenses/LICENSE.httpcomponents.al20.txt (Apache License v2.0)
  * Homepage: https://hc.apache.org/

This product depends on Jackson, distributed by FasterXML, LLC:

  * License: licenses/LICENSE.jackson.al20.txt (Apache License v2.0)
  * Homepage: http://wiki.fasterxml.com/JacksonHome

This product depends on javax.annotation API, distributed by GlassFish Community:

  * License: licenses/LICENSE.javax-annotation.cddl11.txt (CDDL + GPLv2 with classpath exception)
  * Homepage: https://github.com/javaee/javax.annotation/

This product depends on javax.inject API, distributed by the JSR-330 Expert Group:

  * License: licenses/LICENSE.javax-inject.al20.txt (Apache License v2.0)
  * Homepage: https://javax-inject.github.io/javax-inject/

This product depends on javax.validation API, distributed by Red Hat, Inc:

  * License: licenses/LICENSE.javax-validation.al20.txt (Apache License v2.0)
  * Homepage: http://beanvalidation.org/

This product depends on Jetty, distributed by Eclipse Foundation:

  * License: licenses/LICENSE.jetty.al20.txt (Apache License v2.0)
  * Homepage: https://www.eclipse.org/jetty/

This product depends on JsonUnit, distributed by Lukáš Křečan:

  * License: licenses/LICENSE.jsonunit.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/lukas-krecan/JsonUnit

This product depends on jUnit, distributed by jUnit.org:

  * License: licenses/LICENSE.junit.epl10.html (Eclipse Public License v1.0)
  * Homepage: http://junit.org/

This product depends on Apache Kafka, distributed by Apache Software Foundation:

  * License: licenses/LICENSE.kafka.al20.txt (Apache License v2.0)
  * Homepage: https://kafka.apache.org/

This product depends on Logback, distributed by QOS.ch:

  * License: licenses/LICENSE.logback.epl10.html (Eclipse Public License v1.0)
  * Homepage: https://logback.qos.ch/

This product depends on Micrometer, distributed by Pivotal Software, Inc:

  * License: licenses/LICENSE.micrometer.al20.txt (Apache License v2.0)
  * Homepage: https://micrometer.io/

This product depends on Mockito, distributed by Mockito contributors:

  * License: licenses/LICENSE.mockito.mit.txt (MIT License)
  * Homepage: http://mockito.org/

This product depends on Netty, distributed by Netty.io:

  * License: licenses/LICENSE.netty.al20.txt (Apache License v2.0)
  * Homepage: https://netty.io/

This product depends on OpenSAML, distributed by Shibboleth Project:

  * License: licenses/LICENSE.opensaml.al20.txt (Apache License v2.0)
  * Homepage: https://wiki.shibboleth.net/confluence/display/OS30/Home

This product depends on Project Reactor, distributed by projectreactor.io:

  * License: licenses/LICENSE.projectreactor.al20.txt (Apache License v2.0)
  * Homepage: https://projectreactor.io/

This product depends on protobuf-jackson, distributed by Choko:

  * License: licenses/LICENSE.protobuf-jackson.mit.txt (MIT License)
  * Homepage: https://github.com/curioswitch/curiostack

This product depends on Prometheus, distributed by the Prometheus authors:

  * License: licenses/LICENSE.prometheus.al20.txt (Apache License v2.0)
  * Homepage: https://prometheus.io/

This product depends on reactive-grpc, distributed by Salesforce.com, Inc:

  * License: licenses/LICENSE.reactive-grpc.bsd.txt (BSD License)
  * Homepage: https://github.com/salesforce/reactive-grpc

This product depends on Reactive Streams API, distributed by Reactive-Streams.org:

  * License: licenses/LICENSE.reactivestreams.cc0.txt
  * Homepage: http://www.reactive-streams.org/

This product depends on Reflections, distributed by ronmamo:

  * License: licenses/LICENSE.reflections.wtfpl.txt (WTFPL)
  * Homepage: https://github.com/ronmamo/reflections

This product depends on Retrofit, distributed by Square:

  * License: licenses/LICENSE.retrofit.al20.txt (Apache License v2.0)
  * Homepage: https://square.github.io/retrofit/

This product depends on RxJava, distributed by RxJava Contributors:

  * License: licenses/LICENSE.rxjava.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/ReactiveX/RxJava

This product depends on SLF4J, distributed by QOS.ch:

  * License: licenses/LICENSE.slf4j.mit.txt (MIT License)
  * Homepage: https://www.slf4j.org/

This product depends on Sangria GraphQL, distributed by Sangria Contributors:

  * License: licenses/LICENSE.sangria.al20.txt (Apache License v2.0)
  * Homepage: https://sangria-graphql.github.io/

This product depends on Spring Boot, distributed by Pivotal Software, Inc:

  * License: licenses/LICENSE.spring.al20.txt (Apache License v2.0)
  * Homepage: https://spring.io/

This product depends on Apache Thrift, distributed by Apache Software Foundation:

  * License: licenses/LICENSE.thrift.al20.txt (Apache License v2.0)
  * Homepage: https://thrift.apache.org/

This product depends on Apache Tomcat, distributed by Apache Software Foundation:

  * License: licenses/LICENSE.tomcat.al20.txt (Apache License v2.0)
  * Homepage: https://tomcat.apache.org/

This product depends on Apache ZooKeeper, distributed by Apache Software Foundation:

  * License: licenses/LICENSE.zookeeper.al20.txt (Apache License v2.0)
  * Homepage: https://zookeeper.apache.org/

This product depends on ZooKeeper JUnit, distributed by Peter Nerg:

  * License: licenses/LICENSE.zookeeper-junit.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/pnerg/zookeeper-junit

This product depends on Bucket4j, distributed by Vladimir Bukhtoyarov:

  * License: licenses/LICENSE.bucket4j.al20.txt (Apache License v2.0)
  * Homepage: https://github.com/vladimir-bukhtoyarov/bucket4j

DocService Client Web Dependencies
==================================

This product depends on the work of many library authors for its DocService webapp client.
The full list of libraries and their licenses can be found at licenses/web-licenses.txt

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

=============== Brotli4j ===============

Copyright 2021, Aayush Atharva

  Brotli4j licenses this file to you 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.

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

Also, please refer to each LICENSE.<component>.txt file, which is located in
the 'LICENSES' directory of the distribution file, for the license terms of the
components that this product depends on.

---------------------------------
This product depends on 'Google Brotli'. License for the same can be obtained at:

  * LICENSE:
    * LICENSES/LICENSE.googlebrotli.txt (MIT License)

---------------------------------
This product depends on 'Netty ByteBuf'. License for the same can be obtained at:

  * LICENSE:
    * LICENSES/LICENSE.netty.txt (Apache License 2.0)

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