<!--

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 2017 The Apache Software Foundation

Apache Flex SDK Installer 3.3

Installer Issues Resolved:
FLEX-35295: Unable to download 4.16.0 with Air 25

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.
