Apache Flex 4.9.0
=================

This is first release after the Apache Flex 4.8.0 parity release.

The official Apache distribution is the source kit which can contain only source.
Because of this, and various licensing constraints, there must be a few differences.  

====> Please see the README, especially the "Install Prerequisites" section. <====
  
  Differences from Apache Flex 4.8.0:
  - New locales for Apache Flex including Australian, British, Canadian, Greek, Switzerland (German) and Portuguese
  - Apache Flex SDK can be compiled for any version of the Flash Player from 10.2 to 11.5
  - New PostCodeFormatter and PostCodeValidator classes for international postcode formatting and validation
  - New VectorList and VectorCollection classes for lists and collections of vectors
  - New version of the TLF (Text Layout Framework), the TLF 3.0.33 source code is now included as it is now part
    of the Apache Flex donation.
  - Can use Java 7 to compile SDK (see README for instructions)
  - Many improvements and updates to Mustella tests
  - An SDK installer has also been created and is the recommended way of installing the Apache Flex SDK in an IDE.
    For more information see http://flex.apache.org/installer.html
  
  Several bug have also been fixed including (but not limited to):
  FLEX-33272 A #1010 error occurred while trying to hide columns of an AdvancedDataGrid having lockedColumnCount
             greater than 0
  FLEX-33263 FocusOut in datagrid causes RTE if target.parent is null
  FLEX-33248 Spark GridItemEditor cannot edit nested properties
  FLEX-33216 Chart initialization performance degradation between Flex 3 and Flex 4
  FLEX-33110 Building the SDK with Java 7
  FLEX-29002 RunTime Error #1009 at mx.managers::PopUpManagerImpl/addModalPopUpAccessibility() when displaying more
             than one modal popup via PopUpManager on top of each other. On Windows 7 running on some PCs
  FLEX-28982 DropDownController - Null Object Reference
  FLEX-27758 Keyboard navigation stops working in mx:DataGrid
  
  For a full list see https://issues.apache.org/jira/browse/FLEX
  
  Differences from Adobe Flex 4.6.0:
  
  - BlazeDS integration is an optional feature (Adobe license)
  - Adobe embedded font support is an optional feature  

  - the lib directory has been restructured
        -- lib  (jars built from source)
           -- external (other Apache jars or ones with compatible licenses)
              -- optional (optional jars with incompatible licenses)

  - the default linkage is -static-link-runtime-shared-libraries=true

  - there are no longer Adobe signed RSLs (swz files) in frameworks/rsls
  - the frameworks/rsls directory contains unsigned RSL for libraries we build
    
  - the frameworks/osmf src is not included which means there is not an osmf RSL.  
  
  - the ASDoc in the asdoc package no longer has active links for Adobe Flash,
    Adobe Air, the Open Source Media Framework (OSMF) or Text Layout Format (TLF).
    We hope to correct this in a future release.

Please report new issues to our bugbase at:

    https://issues.apache.org/jira/browse/FLEX

                                          The Apache Flex Project
                                          <http://flex.apache.org/>
