Apache Flink
Copyright 2014-2019 The Apache Software Foundation

This product 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. (http://www.apache.org/licenses/LICENSE-2.0.txt)

- nvd3#1.8.4

This project bundles the following dependencies under the MIT license. (https://opensource.org/licenses/MIT)
See bundled license files for details.

- angular:1.4.8
- angular-drag-and-drop-list:1.4.0
- angular-moment:0.10.3
- angular-ui-router:0.2.15
- bootstrap:3.3.6
- dagre:0.7.5
- dagre-d3:0.4.17
- ev-emitter:1.1.1
- font-awesome:4.5.0 (CSS)
- graphlib:1.0.7
- imagesloaded:4.1.4
- jquery:2.2.0
- lodash:3.10.1
- moment:2.10.6
- moment-duration-format:1.3.0
- qtip2:2.2.1
- Split.js:1.0.6

This project bundles the following dependencies under the BSD license.
See bundled license files for details.

- d3:3.5.12
- net.sf.py4j:py4j:0.10.8.1

This project bundles the following dependencies under SIL OFL 1.1 license (https://opensource.org/licenses/OFL-1.1).
See bundled license files for details.

- font-awesome:4.5.0 (Font) (http://fortawesome.github.io/Font-Awesome/) - Created by Dave Gandy
    -> fonts in "flink-runtime-web/web-dashboard/web/fonts"
    -> fonts in "docs/page/font-awesome/fonts"

The Apache Flink project contains or reuses code that is licensed under the ISC license from the following projects.

- simplejmx (http://256stuff.com/sources/simplejmx/) Copyright (c) - Gray Watson

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby
granted, provided that this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
USE OR PERFORMANCE OF THIS SOFTWARE.
