
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 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 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 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/).

