The Eclipse Foundation makes available all content in this plug-in ("Content").
Unless otherwise indicated below, the Content is provided to you under the
terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy
of the EPL is available at http://www.eclipse.org/legal/epl-v10.html. For
purposes of the EPL, "Program" will mean the Content.

If you did not receive this Content directly from the Eclipse Foundation, the
Content is being redistributed by another party ("Redistributor") and different
terms and conditions may apply to your use of any object code in the Content.
Check the Redistributor's license that was provided with the Content. If no
such license exists, contact the Redistributor. Unless otherwise indicated
below, the terms and conditions of the EPL still apply to any source code in
the Content and such source code may be obtained at http://www.eclipse.org.

Third Party Content

The Content includes items that have been sourced from third parties as set out
below. If you did not receive this Content directly from the Eclipse
Foundation, the following is provided for informational purposes only, and you
should look to the Redistributor’s license for terms and conditions of use.

Jakarta Commons Collections

The plug-in includes software developed by The Apache Software Foundation as
part of the Jakarta Commons Collections project.

The Jakarta Commons Collections binary code can be found in the plug-in JAR in
the following files:

  • org\eclipse\core\internal\registry\ReferenceMap.class

The Jakarta Commons Collections source code can be found in src.zip in the
following files:

  • org\eclipse\core\internal\registry\ReferenceMap.java

Your use of the Jakarta Commons Collections code is subject to the terms and
conditions of the Apache License, Version 2.0. A copy of the license is
contained in the file LICENSE-2.0.txt and is also available at http://
www.apache.org/licenses/LICENSE-2.0.html.

The Apache attribution notice file NOTICE.TXT is included with the Content in
accordance with 4d of the Apache License, Version 2.0

The names "Jakarta" and "Apache Software Foundation" must not be used to
endorse or promote products derived from this software without prior written
permission. For written permission, please contact apache@apache.org.

Java and all Java-based trademarks and logos are trademarks or registered
trademarks of Sun Microsystems, Inc. in the United States and other countries.
