<!--

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.

-->

Apache Flex
Copyright 2015 The Apache Software Foundation

Apache Flex SDK Installer 3.2

Ant_On_AIR improvements:
1. add en_AU locale.
2. check free disk space.
3. istrue and isfalse conditions
4. workaround for Get task on SourceForge mirrors
5. use flash.globalization.DateTimeFormatter to remove dependency on Flex SDK
6. replacetoken and replacevalue tags
7. fix failure message propagation from child ant scripts

Installer Issues Resolved:
FLEX-34851: Flex SDK Installer Fails on swfobject for flex versions 4.13.0 and below
FLEX-34762: OSMF download failed - Apache Flex Installer
FLEX-34687: Error #1009 encountered when changing languages on License Screen
FLEX-34638: adt.bat missing from SDK
FLEX-34624: Additional Logging for installer
FLEX-34623: Russian translation
FLEX-34606: Redundant variable
FLEX-34605: Code formatting and cleanup
FLEX-34591: Don't log FP and AIR versions for products that don't use them
FLEX-34590: Don't assume installer.xml exists
FLEX-34589: Set install XML file via command line option
FLEX-34559: Apache Flex SDK Installer - OSMF download failed
FLEX-34534: Installer breaks on afe.jar when using a cached install (but proceeds correctly with cache switched off)
FLEX-34533: Installer install font jar even when not ticked
FLEX-34446: Common windows installer error
FLEX-34445: some errors in installer are missing info=
FLEX-34425: Make MD5 change non fatal
FLEX-34408: Installer log does't contain version of Flex SDK installed
FLEX-34398: log not saved when installer close button clicked
FLEX-34394: some localization strings mention Adobe Flash Builder in the installer title
FLEX-34393: installer should remember language
FLEX-34392: Missing localization strings in the installer
FLEX-34310: Add button "back" to installer

Other Installer Improvements:
1. Fine-tuned some Chinese Translations
2. Added step/install override config option. Remove horizontal scrollbar on license list
3. add user abort message to en_US
4. make clear the version logged is the installer version
5. no need to log error twice + stop RTE when no internet connection
6. Russian translation
7. Updated README in installer doc to include JetBrains IntelliJ IDEA instructions.
8. dded ApacheURLLoader component that extends URLLoader.  This new component is only different from URLLoader in that it looks for https connections and uses as3httpclient for these connections.


Apache Flex SDK Installer 3.1
1. Fixed bugs in ant_on_air library to support more checksums in installer scripts.
2. Reports more information when an install fails or is aborted.
3. Caching is now implemented in the ant scripts.  This means that Apache Flex SDK
   4.12.1 and earlier will not use the download cache and may install more slowly.
4. Minor UI/usability improvements
5. Installer log now saved to disk in installation directory

Apache Flex SDK Installer 3.0
1. Now uses external localized strings
2. Added support for install scripts based on Apache Ant

Apache Flex SDK Installer 2.7
1. Added support for OSMF2.0 [http://blogs.adobe.com/osmf/2012/03/osmf-2-0-now-available.html]
   From Apache Flex 4.11.0 onwards, support for OSMF2.0 has been added.  
2. The osmf.swf RSL now gets generated by the Installer.  

Apache Flex SDK Installer 2.6
Here is a list of significant issues that were fixed with this release:
1. Able to select which version of AIR and Flash Player to use.

Apache Flex SDK Installer 2.5

Issues addressed in this release:
Here is a list of significant issues that were fixed with this release:
1.  Enable Flex SDK download stats tracking
2.  https://issues.apache.org/jira/browse/FLEX-33426 (UI fix for license screen (show regular checkboxes))
3.  https://issues.apache.org/jira/browse/FLEX-33151 (Auto-update logic fix)
4.  French and Dutch language locale fixes.
5.  Added the SDK version number to be downloaded in the window title.
6.  https://issues.apache.org/jira/browse/FLEX-33202 (more issues).
7.  https://issues.apache.org/jira/browse/FLEX-33419 (added german language).


Apache Flex SDK Installer 2.0
1.  If you have previously installed a release candidate (RC) version of
    Apache Flex SDK Installer, you need to uninstall it first.  
    And then run the downloaded installer file.
2.  From Flex 4.9 onwards, the Text Layout Framework (TLF) is part of the Flex SDK.  
    So the installer does not download it separately anymore.
3.  By default, Apache Flex SDK Installer 2.0 downloads Adobe Flash Player 11.1 
    and Adobe AIR SDK 3.4.  If you want to change it to any other supported 
    combination, save a copy of the config file found at: 
       http://incubator.apache.org/flex/sdk-installer-config-2.0.xml, 
    modify the download urls to point to the required versions.  Then run the app 
    from command line mode with the optional command line parameter:
	 -config=<path to config file>.  
    The new urls will be used to download the required dependencies.

Issues addressed in this release:
Here is a list of significant issues that were fixed with this release:
1.  https://issues.apache.org/jira/browse/FLEX-33214 (Fix UI of license screen)
2.  https://issues.apache.org/jira/browse/FLEX-33122 (Enable language switching)
    Available languages: English(US), English(AU), English(GB), Español (ES), 
                         Français, Greek, Nederlands and Português

Apache Flex Installer SDK 1.0

1.  If you have previously installed a pre-release version of  Apache Flex SDK Installer, you need to uninstall it first.  And then run the downloaded installer file.
