nifi-avro-nar
Copyright 2014-2021 The Apache Software Foundation

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

******************
Apache Software License v2
******************

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

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

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

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

      The files in the package org.apache.commons.compress.archivers.sevenz
      were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/),
      which has been placed in the public domain:

      "LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html)

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

  (ASLv2) Snappy Java
    The following NOTICE information applies:
      This product includes software developed by Google
       Snappy: http://code.google.com/p/snappy/ (New BSD License)
      
      This product includes software developed by Apache
       PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
       (Apache 2.0 license)

      This library containd statically linked libstdc++. This inclusion is allowed by 
      "GCC RUntime Library Exception" 
      http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

  (ASLv2) Jackson JSON processor
    The following NOTICE information applies:
      # Jackson JSON processor

      Jackson is a high-performance, Free/Open Source JSON processing library.
      It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
      been in development since 2007.
      It is currently developed by a community of developers, as well as supported
      commercially by FasterXML.com.

      ## Licensing

      Jackson core and extension components may licensed under different licenses.
      To find the details that apply to this artifact see the accompanying LICENSE file.
      For more information, including possible other licensing options, contact
      FasterXML.com (http://fasterxml.com).

      ## Credits

      A list of contributors may be found from CREDITS file, which is included
      in some artifacts (usually source distributions); but is always available
      from the source code management (SCM) system project uses.
