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

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

This project bundles the following dependencies under
the Apache Software License 2.0

  - com.facebook.presto : presto-hive version 0.185
  - com.facebook.presto.hadoop : hadoop-apache2 version 2.7.3-1
  - com.amazonaws : aws-java-sdk-core version 1.11.165
  - com.amazonaws : aws-java-sdk-s3 version 1.11.165
  - com.amazonaws : aws-java-sdk-kms version 1.11.165
  - com.amazonaws : jmespath-java version 1.11.165
  - software.amazon.ion : ion-java version 1.0.2
  - io.airlift : stats version 0.148
  - io.airlift : log version 0.148
  - io.airlift : configuration version 0.148
  - io.airlift : slice version 0.31
  - io.airlift : units version 1.0
  - com.google.guava : guava version 21.0
  - com.google.code.findbugs : annotations version 2.0.3
  - org.weakref : jmxutils version 1.19
  - joda-time : joda-time version 2.5
  - commons-logging : commons-logging version 1.1.3
  - org.apache.httpcomponents : httpclient version 4.5.3
  - org.apache.httpcomponents : httpcore version 4.4.6
  - commons-codec : commons-codec version 1.10
  - com.fasterxml.jackson.core : jackson-core version 2.7.4
  - com.fasterxml.jackson.core : jackson-databind version 2.7.4
  - com.fasterxml.jackson.core : jackson-annotations version 2.7.4
  - com.fasterxml.jackson.dataformat : jackson-dataformat-cbor version 2.6.7  

===================================
       Notice for HdrHistogram
===================================

This project bundles HdrHistogram (v. 2.1.9) under the BSD 2-Clause License 

Original source repository: https://github.com/HdrHistogram/HdrHistogram

The code in this repository code was Written by Gil Tene, Michael Barker,
and Matt Warren, and released to the public domain, as explained at
http://creativecommons.org/publicdomain/zero/1.0/

For users of this code who wish to consume it under the "BSD" license
rather than under the public domain or CC0 contribution text mentioned
above, the code found under this directory is *also* provided under the
following license (commonly referred to as the BSD 2-Clause License). This
license does not detract from the above stated release of the code into
the public domain, and simply represents an additional license granted by
the Author.

-----------------------------------------------------------------------------
** Beginning of "BSD 2-Clause License" text. **

 Copyright (c) 2012, 2013, 2014, 2015, 2016 Gil Tene
 Copyright (c) 2014 Michael Barker
 Copyright (c) 2014 Matt Warren
 All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:

 1. Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

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

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