<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

	  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<flex-config>

  <compiler>

    <accessible>false</accessible>
    <debug>$debug</debug>

    <library-path>
#foreach($artifact in $libraries)           <path-element>$artifact.file</path-element>
#end
    </library-path>

    <external-library-path>
#foreach($artifact in $externalLibraries)           <path-element>$artifact.file</path-element>
#end
    </external-library-path>

    <source-path>
#foreach($sourcePath in $sourcePaths)           <path-element>$sourcePath</path-element>
#end
    </source-path>

    <namespaces>
#foreach($namespace in $namespaces)            <namespace>
      <uri>$namespace.uri</uri>
      <manifest>$namespace.manifest</manifest>
    </namespace>
#end
    </namespaces>

    <warn-no-constructor>false</warn-no-constructor>

    <keep-as3-metadata>
#foreach($metadata in $keepAs3Metadata)            <name>$metadata</name>
#end
    </keep-as3-metadata>

    <allow-subclass-overrides>$allowSubclassOverrides</allow-subclass-overrides>

    <mxml>
      <children-as-data>true</children-as-data>
    </mxml>

    <binding-value-change-event>org.apache.flex.events.ValueChangeEvent</binding-value-change-event>
    <binding-value-change-event-kind>org.apache.flex.events.ValueChangeEvent</binding-value-change-event-kind>
    <binding-value-change-event-type>valueChange</binding-value-change-event-type>

    <show-deprecation-warnings>false</show-deprecation-warnings>

#foreach($define in $defines)        <define>
    <name>$define.name</name>
    <value>$define.value</value>
  </define>
#end
  </compiler>

#if($includeSources)
  <include-sources>
#foreach($sourcePath in $sourcePaths)        <path-element>$sourcePath</path-element>
#end
  </include-sources>
#end

#if($includeClasses)
  <include-classes>
#foreach($includeClass in $includeClasses)        <class>$includeClass</class>
#end
  </include-classes>
#end

#if($namespaceUris)
  <include-namespaces>
#foreach($namespaceUri in $namespaceUris)        <uri>$namespaceUri</uri>
#end
  </include-namespaces>
#end

  <js-output-type>FLEXJS</js-output-type>

  <keep-asdoc>true</keep-asdoc>

  <output>${output}</output>

  <doc-namespaces>
#foreach($namespace in $namespaces)    <uri>$namespace.uri</uri>
#end
  </doc-namespaces>

  <doc-sources>
#foreach($sourcePath in $sourcePaths)    <path-element>$sourcePath</path-element>
#end
  </doc-sources>

</flex-config>
