
Apache Iceberg
Copyright 2017-2021 The Apache Software Foundation

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

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

This binary artifact contains code from Kite, developed at Cloudera, Inc. with
the following copyright notice:

| Copyright 2013 Cloudera Inc.
|
| 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 binary artifact includes Apache ORC with the following in its NOTICE file:

| Apache ORC
| Copyright 2013-2019 The Apache Software Foundation
|
| This product includes software developed by The Apache Software
| Foundation (http://www.apache.org/).
|
| This product includes software developed by Hewlett-Packard:
| (c) Copyright [2014-2015] Hewlett-Packard Development Company, L.P

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

This binary artifact includes Airlift Aircompressor with the following in its
NOTICE file:

| Snappy Copyright Notices
| =========================
|
| * Copyright 2011 Dain Sundstrom <dain@iq80.com>
| * Copyright 2011, Google Inc.<opensource@google.com>
|
|
| Snappy License
| ===============
| Copyright 2011, Google Inc.
| All rights reserved.
|
| Redistribution and use in source and binary forms, with or without
| modification, are permitted provided that the following conditions are
| met:
|
|     * Redistributions of source code must retain the above copyright
| notice, this list of conditions and the following disclaimer.
|     * Redistributions in binary form must reproduce the above
| copyright notice, this list of conditions and the following disclaimer
| in the documentation and/or other materials provided with the
| distribution.
|     * Neither the name of Google Inc. nor the names of its
| contributors may be used to endorse or promote products derived from
| this software without specific prior written permission.
|
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

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

This binary artifact includes Carrot Search Labs HPPC with the following in its
NOTICE file:

| ACKNOWLEDGEMENT
| ===============
|
| 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)

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

This binary artifact includes Apache Yetus with the following in its NOTICE
file:

| Apache Yetus
| Copyright 2008-2020 The Apache Software Foundation
|
| This product includes software developed at
| The Apache Software Foundation (https://www.apache.org/).
|
| ---
| Additional licenses for the Apache Yetus Source/Website:
| ---
|
|
| See LICENSE for terms.

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

This binary artifact includes Google Protobuf with the following copyright
notice:

| Copyright 2008 Google Inc.  All rights reserved.
|
| Redistribution and use in source and binary forms, with or without
| modification, are permitted provided that the following conditions are
| met:
|
|     * Redistributions of source code must retain the above copyright
| notice, this list of conditions and the following disclaimer.
|     * Redistributions in binary form must reproduce the above
| copyright notice, this list of conditions and the following disclaimer
| in the documentation and/or other materials provided with the
| distribution.
|     * Neither the name of Google Inc. nor the names of its
| contributors may be used to endorse or promote products derived from
| this software without specific prior written permission.
|
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| Code generated by the Protocol Buffer compiler is owned by the owner
| of the input file used when generating it.  This code is not
| standalone and requires a support library to be linked with it.  This
| support library is itself covered by the above license.

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

This binary artifact includes Apache Arrow with the following in its NOTICE file:

| Apache Arrow
| Copyright 2016-2019 The Apache Software Foundation
|
| This product includes software developed at
| The Apache Software Foundation (http://www.apache.org/).
|
| This product includes software from the SFrame project (BSD, 3-clause).
| * Copyright (C) 2015 Dato, Inc.
| * Copyright (c) 2009 Carnegie Mellon University.
|
| This product includes software from the Feather project (Apache 2.0)
| https://github.com/wesm/feather
|
| This product includes software from the DyND project (BSD 2-clause)
| https://github.com/libdynd
|
| This product includes software from the LLVM project
|  * distributed under the University of Illinois Open Source
|
| This product includes software from the google-lint project
|  * Copyright (c) 2009 Google Inc. All rights reserved.
|
| This product includes software from the mman-win32 project
|  * Copyright https://code.google.com/p/mman-win32/
|  * Licensed under the MIT License;
|
| This product includes software from the LevelDB project
|  * Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|  * Use of this source code is governed by a BSD-style license that can be
|  * Moved from Kudu http://github.com/cloudera/kudu
|
| This product includes software from the CMake project
|  * Copyright 2001-2009 Kitware, Inc.
|  * Copyright 2012-2014 Continuum Analytics, Inc.
|  * All rights reserved.
|
| This product includes software from https://github.com/matthew-brett/multibuild (BSD 2-clause)
|  * Copyright (c) 2013-2016, Matt Terry and Matthew Brett; all rights reserved.
|
| This product includes software from the Ibis project (Apache 2.0)
|  * Copyright (c) 2015 Cloudera, Inc.
|  * https://github.com/cloudera/ibis
|
| This product includes software from Dremio (Apache 2.0)
|   * Copyright (C) 2017-2018 Dremio Corporation
|   * https://github.com/dremio/dremio-oss
|
| This product includes software from Google Guava (Apache 2.0)
|   * Copyright (C) 2007 The Guava Authors
|   * https://github.com/google/guava
|
| This product include software from CMake (BSD 3-Clause)
|   * CMake - Cross Platform Makefile Generator
|   * Copyright 2000-2019 Kitware, Inc. and Contributors
|
| The web site includes files generated by Jekyll.
|
| --------------------------------------------------------------------------------
|
| This product includes code from Apache Kudu, which includes the following in
| its NOTICE file:
|
|   Apache Kudu
|   Copyright 2016 The Apache Software Foundation
|
|   This product includes software developed at
|   The Apache Software Foundation (http://www.apache.org/).
|
|   Portions of this software were developed at
|   Cloudera, Inc (http://www.cloudera.com/).
|
| --------------------------------------------------------------------------------
|
| This product includes code from Apache ORC, which includes the following in
| its NOTICE file:
|
|   Apache ORC
|   Copyright 2013-2019 The Apache Software Foundation
|
|   This product includes software developed by The Apache Software
|   Foundation (http://www.apache.org/).
|
|   This product includes software developed by Hewlett-Packard:
|   (c) Copyright [2014-2015] Hewlett-Packard Development Company, L.P

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

This binary artifact includes Netty buffers with the following in its NOTICE
file:

|                             The Netty Project
|                             =================
|
| Please visit the Netty web site for more information:
|
|   * https://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 (Apache License 2.0)
|   * HOMEPAGE:
|     * https://github.com/jboss-remoting/jboss-marshalling
|
| 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 version of 'HPACK', a Java implementation of
| the HTTP/2 HPACK algorithm written by Cory Benfield. It can be obtained at:
|
|   * LICENSE:
|     * license/LICENSE.hyper-hpack.txt (MIT License)
|   * HOMEPAGE:
|     * https://github.com/python-hyper/hpack/
|
| This product contains a modified version of 'HPACK', a Java implementation of
| the HTTP/2 HPACK algorithm written by Tatsuhiro Tsujikawa. It can be obtained at:
|
|   * LICENSE:
|     * license/LICENSE.nghttp2-hpack.txt (MIT License)
|   * HOMEPAGE:
|     * https://github.com/nghttp2/nghttp2/
|
| 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 contains the dnsinfo.h header file, that provides a way to retrieve the system DNS configuration on MacOS.
| This private header is also used by Apple's open source
|  mDNSResponder (https://opensource.apple.com/tarballs/mDNSResponder/).
|
|  * LICENSE:
|     * license/LICENSE.dnsinfo.txt (Apache License 2.0)
|   * HOMEPAGE:
|     * http://www.opensource.apple.com/source/configd/configd-453.19/dnsinfo/dnsinfo.h

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

This binary artifact includes Project Nessie with the following in its NOTICE
file:

| Dremio
| Copyright 2015-2017 Dremio Corporation
|
| This product includes software developed at
| The Apache Software Foundation (http://www.apache.org/).

