Apache NiFi MiNiFi C++
Copyright 2019 The Apache Software Foundation

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

This includes derived works from the Apache NiFi (ALv2 Licensed) project (https://github.com/apache/nifi):
Copyright 2019 The Apache Software Foundation
The derived and original works are listed below:
    JniUnpacker.java is based on NarUnpacker.java.
    JniClassLoader is based, predominately, on NarClassdLoader with major variations.
    JniComponentLogger extends ComponentLog
    JniFlowFile extends and is based on FlowFile
    JniInitializationContext extends and is based on ProcessorInitializationContext
    JniProcessContext extends and is based on ProcessContext and ControllerServiceLookup
    JniProcessSession extends and is based on ProcessSession
    JniProcessSessionFactory extends and is based on ProcessSessionFactory
    JniProvenanceReporter extends and is based on ProvenanceReporter
    SFTPTestServer extends and is based on SSHTestServer

This includes derived works from the cURL (MIT/X-style licensed) project (https://github.com/curl/curl):
Copyright (c) 1996 - 2019, Daniel Stenberg, <daniel@haxx.se>, and many contributors, see the THANKS file.
The derived work is adapted from
  CMake/FindLibSSH2.cmake and can be found in cmake/libssh2/sys/FindLibSSH2.cmake

This includes derived works from the CMake (BSD 3-Clause licensed) project (https://github.com/Kitware/CMake):
Copyright 2000-2019 Kitware, Inc. and Contributors
The derived work is adapted from
  Modules/FindPatch.cmake
and can be found in cmake/FindPatch.cmake

This includes derived works from the 'POCO C++ Libraries' (BSL-1.0 licensed) project (https://github.com/pocoproject/poco):
The derived work is adapted from
  cmake/PocoMacros.cmake and can be found in cmake/FindMessageCompiler.cmake

This bundles the 'AWS SDK for C++' (ALv2 licensed) project (https://github.com/aws/aws-sdk-cpp/), which includes the following NOTICE:
AWS SDK for C++
Copyright 2015 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 TinyXml2 - Lee Thomason.
- JSON parsing and utility functions from JsonCpp - Copyright (c) 2007-2010 Baptiste Lepilleur.
- OpenSSL build files for cmake used for Android Builds - Copyright (C) 2007-2012 LuaDist and Copyright (C) 2013 Brian Sidebotham
- Android tool chain cmake build files - Copyright (c) 2010-2011, Ethan Rublee and Copyright (c) 2011-2014, Andrey Kamaev
- gsl-lite - Copyright (c) 2015 Martin Moene and Copyright (c) 2015 Microsoft Corporation. All rights reserved.
- optional-lite - Copyright (c) 2015-2018 Martin Moene under the Boost Software License

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

