# Notices for Eclipse Parallel Tools Platform

This content is produced and maintained by the Eclipse Parallel Tools Platform
project.

* Project home: https://projects.eclipse.org/projects/tools.ptp

## Trademarks

Eclipse Parallel Tools Platform, Parallel Tools Platform, Eclipse PTP, and PTP
are trademarks of the Eclipse Foundation.

## Copyright

All content is the property of the respective authors or their employers. For
more information regarding authorship of content, please consult the listed
source code repository logs.

## Declared Project Licenses

This program and the accompanying materials are made available under the terms
of the Eclipse Public License v. 1.0 which is available at
http://www.eclipse.org/legal/epl-v10.html.

SPDX-License-Identifier: EPL-1.0

## Source Code

The project maintains the following source code repositories:

* http://git.eclipse.org/c/ptp/org.eclipse.ptp.git
* http://git.eclipse.org/c/ptp/org.eclipse.ptp.doc.git
* http://git.eclipse.org/c/ptp/org.eclipse.remote.git

## Third-party Content

This project leverages the following third party content.

ANTLR (3.0)

* License: New BSD license

ANTLR Runtime (3.1.1)

* License: New BSD license

Apache Commons IO (2.2)

* License: Apache License 2.0

autoconf support, subject to conditions noted in comment22 (n/a)

* License: GNU General Public License (GPL) with an exception clause, MIT
* Project: http://www.gnu.org/software/autoconf
* Source: https://bugs.eclipse.org/bugs/show_bug.cgi?id=279618

ISP formal verification tool for MPI (n/a)

* License: Eclipse Public License

javax.activation (1.1)

* License: Common Development and Distribution License 

javax.servlet (2.4)

* License: Apache License, 2.0

javax.xml.bind (JAXB API) (2.1.7)

* License: Common Development and Distribution License

javax.xml.stream stax-api (1.0.1)

* License: Common Development and Distribution License

JAXB (2.1.9)

* License: Common Development and Distribution License

JAXB (2.1.9)

* License: Common Development and Distribution License

JAXB (2.2)

* License: Common Development and Distribution License 

JAXB (2.2)

* License: Common Development and Distribution License 

Open MPI Man Pages (1.5.3)

* License: BSD Style License

Vaadin Client (8.0.6)

* License: Apache-2.0
* Project: https://vaadin.com/home
* Source: https://github.com/vaadin

Vaadin Server (8.0.6)

* License: Apache-2.0
* Project: https://vaadin.com/home
* Source: https://github.com/vaadin

Vaadin Shared (8.0.6)

* License: Apache-2.0 
* Project: https://vaadin.com/home
* Source: https://github.com/vaadin

Vaadin Themes (8.0.6)

* License: Apache-2.0 AND MIT AND Public-Domain AND OFL-1.1
* Project: https://vaadin.com/home
* Source: https://github.com/vaadin

## Cryptography

Content may contain encryption software. The country in which you are currently
may have restrictions on the import, possession, and use, and/or re-export to
another country, of encryption software. BEFORE using any encryption software,
please check the country's laws, regulations and policies concerning the import,
possession, or use, and re-export of encryption software, to see if this is
permitted.
