<?php
/**
 * Copyright (c) 2005, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 * Denis Roy (Eclipse Foundation) - Initial implementation
 * Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>
<div id="maincontent">
  <div id="midcolumn">
    <h1><?php print $pageTitle; ?></h1>
    <p>Last updated September 8th, 2004</p>
    <p>
      With the Eclipse Foundation transitioning from the CPL to the EPL (for
      further information see the <a href="CPL2EPLTransitionPlan.pdf">CPL to EPL
        Transition Plan</a> (.pdf) and matching <a href="cpl2eplfaq.php">FAQ</a>),
      the default license for a project will either be the CPL or the EPL. For
      CPL projects, the notice template is:
    </p>
    <p>
      /*******************************************************************************<br>
      &nbsp;* Copyright (c) {DATE} {INITIAL COPYRIGHT OWNER} {OTHER COPYRIGHT
      OWNERS}.<br> &nbsp;* All rights reserved. This program and the
      accompanying materials<br> &nbsp;* are made available under the terms of
      the Common Public License v1.0<br> &nbsp;* which accompanies this
      distribution, and is available at<br> &nbsp;*
      http://www.eclipse.org/legal/cpl-v10.html<br> &nbsp;*<br> &nbsp;*
      Contributors:<br> &nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;{INITIAL AUTHOR} -
      initial API and implementation<br>
      &nbsp;*******************************************************************************/
    </p>
    <p>For EPL projects, the notice template is:</p>
    <p>
      /*******************************************************************************<br>
      &nbsp;* Copyright (c) {DATE} {INITIAL COPYRIGHT OWNER} {OTHER COPYRIGHT
      OWNERS}.<br> &nbsp;* All rights reserved. This program and the
      accompanying materials<br> &nbsp;* are made available under the terms of
      the Eclipse Public License v1.0<br> &nbsp;* which accompanies this
      distribution, and is available at<br> &nbsp;*
      http://www.eclipse.org/legal/epl-v10.html<br> &nbsp;*<br> &nbsp;*
      Contributors:<br> &nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;{INITIAL AUTHOR} -
      initial API and implementation<br>
      &nbsp;*******************************************************************************/
    </p>
    <p>NOTE: While the CPL to EPL Transition Plan is in effect, do NOT use the
      EPL notice unless you know for certain that your project has transitioned
      fully to the EPL.</p>
    <p>If the contents of the file are to be governed by another license,
      different text will be required. Contact the relevant PMC for assistance
      with this.</p>
    <p>
      <strong>{DATE}</strong> is either a year or a range of years with the
      first and last years of the range separated by a comma. So for example:
      &quot;2004&quot; or &quot;2000, 2004&quot;. The first year is when the
      contents of the file were first created and the last year is the last year
      is when the contents were last modified.
    </p>
    <p>
      <strong>{INITIAL COPYRIGHT OWNER}</strong> is the copyright owner that
      created the initial content. If the content is subsequently modified and
      appended to by other copyright owners, the words &quot;and others&quot;
      are typically appended. So for example: &quot;XYZ Corp.&quot; or &quot;XYZ
      Corp. and others&quot;. The words &quot;and others&quot; are used to avoid
      having to list every copyright owner and because often, most of the
      content in the file was contributed the by initial copyright owner with
      subsequent modifications by others being smaller. However especially if
      the number of copyright owners is small (e.g. two), there is nothing wrong
      with listing all of them especially if their contributions are more
      proportionately equal. For example: &quot;XYZ Corp., John Smith, and ABC
      Enterprises.&quot;
    </p>
    <p>NOTE: Do not confuse copyright owners with authors (which is explained
      below). A copyright owner may be either an individual or an entity. If a
      person is making their contributions on behalf of their employer, then the
      copyright owner is usually the employer (i.e. &quot;XYZ Corp.&quot; and
      not &quot;John Smith&quot;).</p>
    <p>
      <strong>{INITIAL AUTHOR}</strong> is the name of the person that wrote the
      initial content. Subsequent authors are listed on proceding lines with a
      short description of the contribution. If there is an associated Bugzilla
      report number, then it is good practice to include it here. Over time,
      this section actually becomes a log of the contributions. Although it
      could become quite lengthy in some cases, it should be maintained for two
      important reasons - to acknowledge the contributions of individuals
      (especially when their contribution is owned by their employer), and to
      assist with tracking the pedigree of the code (who wrote what). It is good
      practice to list the name of the author with their employer if the latter
      owns the copyright. For example: &quot;John Smith (XYZ Corp.)&quot;.
    </p>
  </div>
</div>