diff --git a/.gitattributes b/.gitattributes
index 81c042e5c..8e560a161 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,16 +1,47 @@
-# Set the default behavior, in case people don't have core.autocrlf set.
-#* text=auto
+# Text files
+*.txt text
+*.xml text
+*.md text
-# Explicitly declare text files you want to always be normalized and converted
-# to native line endings on checkout.
-*.c text
-*.h text
-*.java text eol=crlf
-*.sh binary
+# Installers:
+*.iss text
+*.nsi text
+*.nsh text
-# Declare files that will always have CRLF line endings on checkout.
-*.sln text eol=crlf
+# Java
+*.java text
+*.mf text
+*.properties text
-# Denote all files that are truly binary and should not be modified.
+# Graphics:
+*.svg text
*.png binary
-*.jpg binary
\ No newline at end of file
+*.jpg binary
+*.bmp binary
+*.ico binary
+*.icns binary
+*.xcf binary
+*.gif binary
+
+# Findbugs:
+*.fbp text
+
+# Batch files
+*.sh text eol=lf
+*.bat text eol=crlf
+
+# Delphi sources
+*.dpr text eol=crlf
+*.dfm text eol=crlf
+*.pas text eol=crlf
+*.dof text eol=crlf
+
+# Executables
+*.dll binary
+*.exe binary
+*.jar binary
+*.res binary
+
+# Fonts
+*.otf binary
+*.ttf binary
diff --git a/.idea/ant.xml b/.idea/ant.xml
index 6ddee46ae..4674eeac9 100644
--- a/.idea/ant.xml
+++ b/.idea/ant.xml
@@ -1,15 +1,15 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index c33f99162..48642b4fc 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,28 +1,28 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
index b385f01fd..3572571ad 100644
--- a/.idea/copyright/profiles_settings.xml
+++ b/.idea/copyright/profiles_settings.xml
@@ -1,5 +1,5 @@
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 7c62b52a1..e206d70d8 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -1,5 +1,5 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/.idea/libraries/lib.xml b/.idea/libraries/lib.xml
index d062ade52..bfe7b7ba7 100644
--- a/.idea/libraries/lib.xml
+++ b/.idea/libraries/lib.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/testlib.xml b/.idea/libraries/testlib.xml
index 24bd8f60a..c5ea87068 100644
--- a/.idea/libraries/testlib.xml
+++ b/.idea/libraries/testlib.xml
@@ -1,11 +1,11 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 13ec7fbc5..dde57ed46 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,37 +1,37 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
index b6f26e5ea..8aa827526 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -1,11 +1,11 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
index 1e7cce4b8..3b0002030 100644
--- a/.idea/uiDesigner.xml
+++ b/.idea/uiDesigner.xml
@@ -1,125 +1,125 @@
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
- -
-
-
- -
-
-
-
-
-
-
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 6d89e2bf8..f6a23c130 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,7 +1,7 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 2f6ddde58..4a622bba7 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,553 +1,553 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- localhost
- 5050
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- C:\Users\JPEXS\AppData\Roaming\Subversion
- false
- 125
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1.6
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ localhost
+ 5050
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C:\Users\JPEXS\AppData\Roaming\Subversion
+ false
+ 125
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/avi.montemedia.license.txt b/lib/avi.montemedia.license.txt
index 80ba1df4b..b10d67604 100644
--- a/lib/avi.montemedia.license.txt
+++ b/lib/avi.montemedia.license.txt
@@ -1,8 +1,8 @@
-Monte Media Library © 2012
-Werner Randelshofer, Hausmatt 10, CH-6405 Goldau Switzerland
-werner.randelshofer@bluewin.ch
-All Rights Reserved.
-
-The Monte Media Library can be licensed under the terms of the Creative Commons BY 3.0 license, and/or under the terms of the Lesser General Public License LGPL Version 3.
-
+Monte Media Library © 2012
+Werner Randelshofer, Hausmatt 10, CH-6405 Goldau Switzerland
+werner.randelshofer@bluewin.ch
+All Rights Reserved.
+
+The Monte Media Library can be licensed under the terms of the Creative Commons BY 3.0 license, and/or under the terms of the Lesser General Public License LGPL Version 3.
+
The license is free for commercial and non-commercial use.
\ No newline at end of file
diff --git a/lib/flamingo.license.txt b/lib/flamingo.license.txt
index 69d06bfe0..d84664dad 100644
--- a/lib/flamingo.license.txt
+++ b/lib/flamingo.license.txt
@@ -1,27 +1,27 @@
-Copyright (c) 2005-2010 Flamingo Kirill Grouchnikov. All Rights Reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- o Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- o Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- o Neither the name of Flamingo Kirill Grouchnikov nor the names of
- its contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+Copyright (c) 2005-2010 Flamingo Kirill Grouchnikov. All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ o Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ o Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ o Neither the name of Flamingo Kirill Grouchnikov nor the names of
+ its contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/lib/gif.license.txt b/lib/gif.license.txt
index ea041f71e..1febc60c3 100644
--- a/lib/gif.license.txt
+++ b/lib/gif.license.txt
@@ -1,6 +1,6 @@
-Created by Elliot Kroo on 2009-04-25.
-
-This work is licensed under the Creative Commons Attribution 3.0 Unported
-License. To view a copy of this license, visit
-http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative
+Created by Elliot Kroo on 2009-04-25.
+
+This work is licensed under the Creative Commons Attribution 3.0 Unported
+License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative
Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
\ No newline at end of file
diff --git a/lib/jl.license.txt b/lib/jl.license.txt
index 247851325..ef8de92a6 100644
--- a/lib/jl.license.txt
+++ b/lib/jl.license.txt
@@ -1,17 +1,17 @@
-Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
-Berlin University of Technology
------------------------------------------------------------------------
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
+Berlin University of Technology
+-----------------------------------------------------------------------
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Library General Public License as published
+by the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
----------------------------------------------------------------------
\ No newline at end of file
diff --git a/lib/jna.license.txt b/lib/jna.license.txt
index 687212f5a..0eb865e1b 100644
--- a/lib/jna.license.txt
+++ b/lib/jna.license.txt
@@ -1,11 +1,11 @@
-Copyright (c) 2007 Timothy Wall, All Rights Reserved
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
+Copyright (c) 2007 Timothy Wall, All Rights Reserved
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
diff --git a/lib/jpacker.license.txt b/lib/jpacker.license.txt
index f8f9604f5..a08669cf8 100644
--- a/lib/jpacker.license.txt
+++ b/lib/jpacker.license.txt
@@ -1,10 +1,10 @@
-Packer version 3.0 (final)
-Copyright 2004-2007, Dean Edwards
-Web: http://dean.edwards.name/
-
-This software is licensed under the MIT license
-Web: http://www.opensource.org/licenses/mit-license
-
-Ported to Java by Pablo Santiago based on C# version by Jesse Hansen,
-Web: http://jpacker.googlecode.com/
-Email: pablo.santiago@gmail.com
+Packer version 3.0 (final)
+Copyright 2004-2007, Dean Edwards
+Web: http://dean.edwards.name/
+
+This software is licensed under the MIT license
+Web: http://www.opensource.org/licenses/mit-license
+
+Ported to Java by Pablo Santiago based on C# version by Jesse Hansen,
+Web: http://jpacker.googlecode.com/
+Email: pablo.santiago@gmail.com
diff --git a/lib/jpproxy.muffin.license.txt b/lib/jpproxy.muffin.license.txt
index 6bf59f369..90f94a078 100644
--- a/lib/jpproxy.muffin.license.txt
+++ b/lib/jpproxy.muffin.license.txt
@@ -1,16 +1,16 @@
-Copyright (C) 1996-2003 Mark R. Boyns
-
-Muffin is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-Muffin is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Muffin; see the file COPYING. If not, write to the
-Free Software Foundation, Inc.,
+Copyright (C) 1996-2003 Mark R. Boyns
+
+Muffin is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+Muffin is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Muffin; see the file COPYING. If not, write to the
+Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
\ No newline at end of file
diff --git a/lib/jsyntaxpane.license.txt b/lib/jsyntaxpane.license.txt
index ad68c7d70..1d2910d6c 100644
--- a/lib/jsyntaxpane.license.txt
+++ b/lib/jsyntaxpane.license.txt
@@ -1,11 +1,11 @@
-Copyright 2008 Ayman Al-Sairafi ayman.alsairafi@gmail.com
-
-Licensed 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
+Copyright 2008 Ayman Al-Sairafi ayman.alsairafi@gmail.com
+
+Licensed 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.
\ No newline at end of file
diff --git a/lib/nellymoser.license.txt b/lib/nellymoser.license.txt
index 5fabd50e4..3ec3f1729 100644
--- a/lib/nellymoser.license.txt
+++ b/lib/nellymoser.license.txt
@@ -1,17 +1,17 @@
-NellyMoser ASAO codec
-Copyright (C) 2007-2008 UAB "DKD"
-Copyright (C) 2007-2008 Joseph Artsimovich
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with FFmpeg; if not, write to the Free Software
+NellyMoser ASAO codec
+Copyright (C) 2007-2008 UAB "DKD"
+Copyright (C) 2007-2008 Joseph Artsimovich
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with FFmpeg; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
\ No newline at end of file
diff --git a/lib/sfntly.license.txt b/lib/sfntly.license.txt
index 6363a8ed5..762937be3 100644
--- a/lib/sfntly.license.txt
+++ b/lib/sfntly.license.txt
@@ -1,13 +1,13 @@
-Copyright 2010 Google Inc. All Rights Reserved.
-
-Licensed 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
+Copyright 2010 Google Inc. All Rights Reserved.
+
+Licensed 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.
\ No newline at end of file
diff --git a/lib/substance-flamingo.license.txt b/lib/substance-flamingo.license.txt
index 4918b1889..f1b0b1d61 100644
--- a/lib/substance-flamingo.license.txt
+++ b/lib/substance-flamingo.license.txt
@@ -1,27 +1,27 @@
-Copyright (c) 2005-2010 Flamingo / Substance Kirill Grouchnikov. All Rights Reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- o Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- o Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- o Neither the name of Flamingo Kirill Grouchnikov nor the names of
- its contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+Copyright (c) 2005-2010 Flamingo / Substance Kirill Grouchnikov. All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ o Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ o Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ o Neither the name of Flamingo Kirill Grouchnikov nor the names of
+ its contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/lib/trident.license.txt b/lib/trident.license.txt
index 8b508f15a..f78d981e6 100644
--- a/lib/trident.license.txt
+++ b/lib/trident.license.txt
@@ -1,27 +1,27 @@
-Copyright (c) 2005-2010 Trident Kirill Grouchnikov. All Rights Reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-o Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-
-o Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-o Neither the name of Trident Kirill Grouchnikov nor the names of
-its contributors may be used to endorse or promote products derived
-from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+Copyright (c) 2005-2010 Trident Kirill Grouchnikov. All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+o Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+o Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+o Neither the name of Trident Kirill Grouchnikov nor the names of
+its contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/lib/ttf.doubletype.license.txt b/lib/ttf.doubletype.license.txt
index 1405e83c5..126b8a2b2 100644
--- a/lib/ttf.doubletype.license.txt
+++ b/lib/ttf.doubletype.license.txt
@@ -1,24 +1,24 @@
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This Program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-In addition, as a special exception, e.e d3si9n gives permission to
-link the code of this program with any Java Platform that is available
-to public with free of charge, including but not limited to
-Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE),
-and distribute linked combinations including the two.
-You must obey the GNU General Public License in all respects for all
-of the code used other than Java Platform. If you modify this file,
-you may extend this exception to your version of the file, but you are not
-obligated to do so. If you do not wish to do so, delete this exception
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This Program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+In addition, as a special exception, e.e d3si9n gives permission to
+link the code of this program with any Java Platform that is available
+to public with free of charge, including but not limited to
+Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE),
+and distribute linked combinations including the two.
+You must obey the GNU General Public License in all respects for all
+of the code used other than Java Platform. If you modify this file,
+you may extend this exception to your version of the file, but you are not
+obligated to do so. If you do not wish to do so, delete this exception
statement from your version.
\ No newline at end of file
diff --git a/lib/ttf.fontastic.license.txt b/lib/ttf.fontastic.license.txt
index 3554af743..79e0b766a 100644
--- a/lib/ttf.fontastic.license.txt
+++ b/lib/ttf.fontastic.license.txt
@@ -1,20 +1,20 @@
-Fontastic
-A font file writer to create TTF and WOFF (Webfonts).
-http://code.andreaskoller.com/libraries/fontastic
-
-Copyright (C) 2013 Andreas Koller http://andreaskoller.com
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General
-Public License along with this library; if not, write to the
-Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Fontastic
+A font file writer to create TTF and WOFF (Webfonts).
+http://code.andreaskoller.com/libraries/fontastic
+
+Copyright (C) 2013 Andreas Koller http://andreaskoller.com
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General
+Public License along with this library; if not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
\ No newline at end of file
diff --git a/libsrc/FlashPlayer/FlashPlayer.dof b/libsrc/FlashPlayer/FlashPlayer.dof
index 6a3c75bbb..20eb0ba86 100644
--- a/libsrc/FlashPlayer/FlashPlayer.dof
+++ b/libsrc/FlashPlayer/FlashPlayer.dof
@@ -1,138 +1,138 @@
-[FileVersion]
-Version=7.0
-[Compiler]
-A=8
-B=0
-C=1
-D=1
-E=0
-F=0
-G=1
-H=1
-I=1
-J=0
-K=0
-L=1
-M=0
-N=1
-O=1
-P=1
-Q=0
-R=0
-S=0
-T=0
-U=0
-V=1
-W=0
-X=1
-Y=1
-Z=1
-ShowHints=1
-ShowWarnings=1
-UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-NamespacePrefix=
-SymbolDeprecated=1
-SymbolLibrary=1
-SymbolPlatform=1
-UnitLibrary=1
-UnitPlatform=1
-UnitDeprecated=1
-HResultCompat=1
-HidingMember=1
-HiddenVirtual=1
-Garbage=1
-BoundsError=1
-ZeroNilCompat=1
-StringConstTruncated=1
-ForLoopVarVarPar=1
-TypedConstVarPar=1
-AsgToTypedConst=1
-CaseLabelRange=1
-ForVariable=1
-ConstructingAbstract=1
-ComparisonFalse=1
-ComparisonTrue=1
-ComparingSignedUnsigned=1
-CombiningSignedUnsigned=1
-UnsupportedConstruct=1
-FileOpen=1
-FileOpenUnitSrc=1
-BadGlobalSymbol=1
-DuplicateConstructorDestructor=1
-InvalidDirective=1
-PackageNoLink=1
-PackageThreadVar=1
-ImplicitImport=1
-HPPEMITIgnored=1
-NoRetVal=1
-UseBeforeDef=1
-ForLoopVarUndef=1
-UnitNameMismatch=1
-NoCFGFileFound=1
-MessageDirective=1
-ImplicitVariants=1
-UnicodeToLocale=1
-LocaleToUnicode=1
-ImagebaseMultiple=1
-SuspiciousTypecast=1
-PrivatePropAccessor=1
-UnsafeType=0
-UnsafeCode=0
-UnsafeCast=0
-[Linker]
-MapFile=0
-OutputObjs=0
-ConsoleApp=1
-DebugInfo=0
-RemoteSymbols=0
-MinStackSize=16384
-MaxStackSize=1048576
-ImageBase=4194304
-ExeDescription=
-[Directories]
-OutputDir=..\..\lib\
-UnitOutputDir=
-PackageDLLOutputDir=
-PackageDCPOutputDir=
-SearchPath=
-Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
-Conditionals=
-DebugSourceDirs=
-UsePackages=0
-[Parameters]
-RunParams=
-HostApplication=
-Launcher=
-UseLauncher=0
-DebugCWD=
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1029
-CodePage=1250
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-[HistoryLists\hlUnitAliases]
-Count=1
-Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-[HistoryLists\hlOutputDirectorry]
-Count=1
-Item0=..\..\lib\
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=..\..\lib\
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1029
+CodePage=1250
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlOutputDirectorry]
+Count=1
+Item0=..\..\lib\
diff --git a/libsrc/FlashPlayer/FlashPlayer.dpr b/libsrc/FlashPlayer/FlashPlayer.dpr
index cb89a93ba..ba8eee704 100644
--- a/libsrc/FlashPlayer/FlashPlayer.dpr
+++ b/libsrc/FlashPlayer/FlashPlayer.dpr
@@ -1,24 +1,24 @@
-program FlashPlayer;
-
-uses
- Forms,
- Windows,
- Dialogs,
- uMain in 'uMain.pas' {frmMain};
-
-{$R *.res}
-
-begin
- Application.Initialize;
- Application.Title := 'FFDec Flash Player';
- if(ParamCount<2) then
- begin
- ShowMessage('Wrong parameter count. This EXE is for FFDec internal use only.');
- Application.Terminate;
- end
- else
- begin
- Application.CreateForm(TfrmMain, frmMain);
- end;
- Application.Run;
-end.
+program FlashPlayer;
+
+uses
+ Forms,
+ Windows,
+ Dialogs,
+ uMain in 'uMain.pas' {frmMain};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'FFDec Flash Player';
+ if(ParamCount<2) then
+ begin
+ ShowMessage('Wrong parameter count. This EXE is for FFDec internal use only.');
+ Application.Terminate;
+ end
+ else
+ begin
+ Application.CreateForm(TfrmMain, frmMain);
+ end;
+ Application.Run;
+end.
diff --git a/libsrc/LZMA/build.xml b/libsrc/LZMA/build.xml
index 39c801a28..28af043d3 100644
--- a/libsrc/LZMA/build.xml
+++ b/libsrc/LZMA/build.xml
@@ -1,73 +1,73 @@
-
-
-
-
-
-
-
-
-
-
- Builds, tests, and runs the project LZMA.
-
-
-
+
+
+
+
+
+
+
+
+
+
+ Builds, tests, and runs the project LZMA.
+
+
+
diff --git a/libsrc/LZMA/manifest.mf b/libsrc/LZMA/manifest.mf
index 1574df4a2..328e8e5bc 100644
--- a/libsrc/LZMA/manifest.mf
+++ b/libsrc/LZMA/manifest.mf
@@ -1,3 +1,3 @@
-Manifest-Version: 1.0
-X-COMMENT: Main-Class will be added automatically by build
-
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
diff --git a/libsrc/LZMA/nbproject/build-impl.xml b/libsrc/LZMA/nbproject/build-impl.xml
index 951bf989a..6b452785c 100644
--- a/libsrc/LZMA/nbproject/build-impl.xml
+++ b/libsrc/LZMA/nbproject/build-impl.xml
@@ -1,1413 +1,1413 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set src.dir
- Must set test.src.dir
- Must set build.dir
- Must set dist.dir
- Must set build.classes.dir
- Must set dist.javadoc.dir
- Must set build.test.classes.dir
- Must set build.test.results.dir
- Must set build.classes.excludes
- Must set dist.jar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- No tests executed.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set JVM to use for profiling in profiler.info.jvm
- Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- To run this application from the command line without Ant, try:
-
- java -jar "${dist.jar.resolved}"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set debug.class
-
-
-
-
- Must select one file in the IDE or set debug.class
-
-
-
-
- Must set fix.includes
-
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set profile.class
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
-
- Must select some files in the IDE or set test.includes
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Some tests failed; see details above.
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set test.includes
-
-
-
- Some tests failed; see details above.
-
-
-
- Must select some files in the IDE or set test.class
- Must select some method in the IDE or set test.method
-
-
-
- Some tests failed; see details above.
-
-
-
-
- Must select one file in the IDE or set test.class
-
-
-
- Must select one file in the IDE or set test.class
- Must select some method in the IDE or set test.method
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set src.dir
+ Must set test.src.dir
+ Must set build.dir
+ Must set dist.dir
+ Must set build.classes.dir
+ Must set dist.javadoc.dir
+ Must set build.test.classes.dir
+ Must set build.test.results.dir
+ Must set build.classes.excludes
+ Must set dist.jar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No tests executed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set JVM to use for profiling in profiler.info.jvm
+ Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+ java -jar "${dist.jar.resolved}"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must set fix.includes
+
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set profile.class
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+ Some tests failed; see details above.
+
+
+
+ Must select some files in the IDE or set test.class
+ Must select some method in the IDE or set test.method
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+ Must select one file in the IDE or set test.class
+
+
+
+ Must select one file in the IDE or set test.class
+ Must select some method in the IDE or set test.method
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libsrc/LZMA/nbproject/genfiles.properties b/libsrc/LZMA/nbproject/genfiles.properties
index ebce23e4c..d3abacb89 100644
--- a/libsrc/LZMA/nbproject/genfiles.properties
+++ b/libsrc/LZMA/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=cf8fb9e4
-build.xml.script.CRC32=0d82b5ac
-build.xml.stylesheet.CRC32=8064a381@1.68.1.46
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=cf8fb9e4
-nbproject/build-impl.xml.script.CRC32=fd6704e6
-nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.74.1.48
+build.xml.data.CRC32=cf8fb9e4
+build.xml.script.CRC32=0d82b5ac
+build.xml.stylesheet.CRC32=8064a381@1.68.1.46
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=cf8fb9e4
+nbproject/build-impl.xml.script.CRC32=fd6704e6
+nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.74.1.48
diff --git a/libsrc/LZMA/nbproject/project.properties b/libsrc/LZMA/nbproject/project.properties
index 01fd54dea..26a929b88 100644
--- a/libsrc/LZMA/nbproject/project.properties
+++ b/libsrc/LZMA/nbproject/project.properties
@@ -1,71 +1,71 @@
-annotation.processing.enabled=true
-annotation.processing.enabled.in.editor=false
-annotation.processing.processor.options=
-annotation.processing.processors.list=
-annotation.processing.run.all.processors=true
-annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-build.generated.sources.dir=${build.dir}/generated-sources
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-# Uncomment to specify the preferred debugger connection transport:
-#debug.transport=dt_socket
-debug.classpath=\
- ${run.classpath}
-debug.test.classpath=\
- ${run.test.classpath}
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=../../lib/LZMA.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-excludes=
-includes=**
-jar.compress=false
-javac.classpath=
-# Space-separated list of extra javac options
-javac.compilerargs=
-javac.deprecation=false
-javac.processorpath=\
- ${javac.classpath}
-javac.source=1.6
-javac.target=1.6
-javac.test.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-javac.test.processorpath=\
- ${javac.test.classpath}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=${source.encoding}
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-main.class=
-manifest.file=manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-mkdist.disabled=false
-platform.active=default_platform
-run.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project
-# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
-# or test-sys-prop.name=value to set system properties for unit tests):
-run.jvmargs=
-run.test.classpath=\
- ${javac.test.classpath}:\
- ${build.test.classes.dir}
-source.encoding=UTF-8
-src.dir=src
-test.src.dir=test
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.processor.options=
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+ ${run.classpath}
+debug.test.classpath=\
+ ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=../../lib/LZMA.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.6
+javac.target=1.6
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+javac.test.processorpath=\
+ ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+main.class=
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=false
+platform.active=default_platform
+run.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+ ${javac.test.classpath}:\
+ ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
diff --git a/libsrc/LZMA/nbproject/project.xml b/libsrc/LZMA/nbproject/project.xml
index d34c5fea1..ca4d9c5d4 100644
--- a/libsrc/LZMA/nbproject/project.xml
+++ b/libsrc/LZMA/nbproject/project.xml
@@ -1,15 +1,15 @@
-
-
- org.netbeans.modules.java.j2seproject
-
-
- LZMA
-
-
-
-
-
-
-
-
-
+
+
+ org.netbeans.modules.java.j2seproject
+
+
+ LZMA
+
+
+
+
+
+
+
+
+
diff --git a/libsrc/Swf2Exe/Swf2Exe.dof b/libsrc/Swf2Exe/Swf2Exe.dof
index 0955e8a7e..d2fdac623 100644
--- a/libsrc/Swf2Exe/Swf2Exe.dof
+++ b/libsrc/Swf2Exe/Swf2Exe.dof
@@ -1,138 +1,138 @@
-[FileVersion]
-Version=7.0
-[Compiler]
-A=8
-B=0
-C=1
-D=1
-E=0
-F=0
-G=1
-H=1
-I=1
-J=0
-K=0
-L=1
-M=0
-N=1
-O=1
-P=1
-Q=0
-R=0
-S=0
-T=0
-U=0
-V=1
-W=0
-X=1
-Y=1
-Z=1
-ShowHints=1
-ShowWarnings=1
-UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-NamespacePrefix=
-SymbolDeprecated=1
-SymbolLibrary=1
-SymbolPlatform=1
-UnitLibrary=1
-UnitPlatform=1
-UnitDeprecated=1
-HResultCompat=1
-HidingMember=1
-HiddenVirtual=1
-Garbage=1
-BoundsError=1
-ZeroNilCompat=1
-StringConstTruncated=1
-ForLoopVarVarPar=1
-TypedConstVarPar=1
-AsgToTypedConst=1
-CaseLabelRange=1
-ForVariable=1
-ConstructingAbstract=1
-ComparisonFalse=1
-ComparisonTrue=1
-ComparingSignedUnsigned=1
-CombiningSignedUnsigned=1
-UnsupportedConstruct=1
-FileOpen=1
-FileOpenUnitSrc=1
-BadGlobalSymbol=1
-DuplicateConstructorDestructor=1
-InvalidDirective=1
-PackageNoLink=1
-PackageThreadVar=1
-ImplicitImport=1
-HPPEMITIgnored=1
-NoRetVal=1
-UseBeforeDef=1
-ForLoopVarUndef=1
-UnitNameMismatch=1
-NoCFGFileFound=1
-MessageDirective=1
-ImplicitVariants=1
-UnicodeToLocale=1
-LocaleToUnicode=1
-ImagebaseMultiple=1
-SuspiciousTypecast=1
-PrivatePropAccessor=1
-UnsafeType=0
-UnsafeCode=0
-UnsafeCast=0
-[Linker]
-MapFile=0
-OutputObjs=0
-ConsoleApp=1
-DebugInfo=0
-RemoteSymbols=0
-MinStackSize=16384
-MaxStackSize=1048576
-ImageBase=4194304
-ExeDescription=
-[Directories]
-OutputDir=.
-UnitOutputDir=
-PackageDLLOutputDir=
-PackageDCPOutputDir=
-SearchPath=
-Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
-Conditionals=
-DebugSourceDirs=
-UsePackages=0
-[Parameters]
-RunParams=
-HostApplication=
-Launcher=
-UseLauncher=0
-DebugCWD=
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1029
-CodePage=1250
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-[HistoryLists\hlUnitAliases]
-Count=1
-Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-[HistoryLists\hlOutputDirectorry]
-Count=1
-Item0=.
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=.
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1029
+CodePage=1250
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlOutputDirectorry]
+Count=1
+Item0=.
diff --git a/libsrc/Swf2Exe/Swf2Exe.dpr b/libsrc/Swf2Exe/Swf2Exe.dpr
index d5aeb1d5b..b7f87ceb7 100644
--- a/libsrc/Swf2Exe/Swf2Exe.dpr
+++ b/libsrc/Swf2Exe/Swf2Exe.dpr
@@ -1,16 +1,16 @@
-program Swf2Exe;
-
-uses
- Forms,
- Windows,
- Dialogs,
- uMain in 'uMain.pas' {frmMain};
-
-{$R *.res}
-
-begin
- Application.Initialize;
- Application.Title := 'FFDec Flash Player';
- Application.CreateForm(TfrmMain, frmMain);
- Application.Run;
-end.
+program Swf2Exe;
+
+uses
+ Forms,
+ Windows,
+ Dialogs,
+ uMain in 'uMain.pas' {frmMain};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'FFDec Flash Player';
+ Application.CreateForm(TfrmMain, frmMain);
+ Application.Run;
+end.
diff --git a/libsrc/Swf2Exe/uMain.dfm b/libsrc/Swf2Exe/uMain.dfm
index 28a944670..225dfff95 100644
--- a/libsrc/Swf2Exe/uMain.dfm
+++ b/libsrc/Swf2Exe/uMain.dfm
@@ -1,651 +1,651 @@
-object frmMain: TfrmMain
- Left = 323
- Top = 163
- Width = 1007
- Height = 661
- Caption = 'FFDec Flash Player'
- Color = clWhite
- Font.Charset = DEFAULT_CHARSET
- Font.Color = clWindowText
- Font.Height = -11
- Font.Name = 'MS Sans Serif'
- Font.Style = []
- Icon.Data = {
- 0000010004000000000001000800EC310000460000003030000001000800A80E
- 0000323200002020000001000800A8080000DA40000010100000010008006805
- 00008249000089504E470D0A1A0A0000000D4948445200000100000001000806
- 0000005C72A866000031B34944415478DAED9D0B7C14D5F5C70F8F3C8090F008
- 041523521031451E159AF8A041FEB4F28F88429428A08912B51A54A80F94FEED
- 940AA258F081CADFA841010D1A10458A1695482B49E15F40298280881435BC02
- 84040328F33FBF95B50177E6DED99DDD99D9BDDFCF673EBBB0B39BBBB373CE3D
- E7DC73CE6D448AA8E4FD8913F5FA8307E9686DADEF38C2CF8F1C3A4447F9F03D
- E2FFF911C4B76C49F149499480473EF0989092E2FB3F1C89FC7CE0E4C98D9CFE
- 4E0AFB513FAA078170EFFDEC33DAC7C7DE2D5BE8787DBD23E3689C9848A95DBB
- 52DB6EDD28950FA524BC87FAC15CCC5B85853F0A7ADDAE5D4E0FC7122DD2D27E
- 540C571417ABFBCCA5A81FC645BC326488BE7DF9729F791E8DC09DE83460005D
- B778B1BAEF5C82FA211CA474D8307D7B7939D557573B3D1447486CD3863A6567
- 53DEC285EA3E740875E123C8EB7979BE19DE6BE67CA480DB000BE1EAD252755F
- 460875A1C3CCCB8306E9DB962D737A189EA4F3A04174FDB265EA1E0D23EAE286
- 8137F2F3F58D656551EBCB471AC40EBAE7E6D255B367ABFBD566D405B5092CCD
- 7D3C670ED5ECD8E1D8185A356942CD1B35A284C68D299E1F7124F21177E27933
- FEFF383E2F911F134E3C07C7F83872FC38D5F381E7DFF2E3515DA7637CD4F371
- F4C481730EF3E381EFBF77EC3B26A7A753CFD1A3D592A34DA88B1822C59999FA
- 57959511FB7BCD5890539B36F51D6D59E053F9687BE27924D9C74A60DF77DFD1
- 5E3CF2B117CFF9F8961544A4382333930A2B2BD53D1C02EAE20501D6E7D7CD9E
- 4DC78F1D0BDBDFC0ACDD312E8E4E83B043D04F083D667437038BC1AF0CA01CBE
- E1C79D7C9D8E85513134E6EBD42B3F5FE51B0481BA601658306A94BE61FEFCB0
- 083E04BE030BF8D9F1F1D4858F347E1EE77261B7C2177CCDBE3C7A94BEE0A38A
- 95423814021441C68811347CEEDCE8B97061465D2809E6E7E6FA827A767326DF
- B0387E9690401DA34CE0CD80F0EF6425F0F99123B49D15C2D7FCDC6E10341C51
- 56161B173404D40532615E4E8EBE65C912DB3E0FFEFBCF1313A90B0B7C2716FC
- 581178115008DBD942D8CA0AE15FF5F5B6C611BAE6E4D0C8254BD48536405D98
- 00CC1E30C097B0630710F27359E07B356B4667C7C585FE813100DC8575DF7E4B
- 9B5821D8E52A20C1287FF97275BF9F82BA200D783E2B4BDF595161CB67C197EF
- C1829FC133BE9AE98303C2BF812D82F5AC08103BB0838E595934A6A242FD2027
- 501782595450A0AF2B2909F973DAB31FDF8305BE271F498D1B3BFDB5A28ADAE3
- C7E96328033E76DB1033E8555040579694C4FCFD1FF317606A9B367A28C53898
- DD7BB1C0F766131F517C45F8C12AC25A7611D6B13208C5454031D284EAEA9896
- 8198FDF2CFF5EBA77FBD6A55D0EF87E0F765A1CF6CDE5CCDF60E01ABA0F2F061
- 5ACDCA201445707ABF7E74F3AA5531290B31F7A5971415E9AB67CE0CFAFD88E4
- F765A187E0BB3D29275640F2914F11F011CA0A42DFA222CA993933A67ED498FA
- B2D3D2D2F4604B7121F817B568E19BF55550CF9DC00A8035F0515D5DD08AA045
- 870E744F5555CCFCC031F1454BB2B3F52FCBCB837A2F0A6CFAF36CAFA2F9DE01
- 8A00F1810AB608822D5C3A2B3B9B0ACACBA3FE078FFA2F382931510FA669A65F
- F0B17EAFF02EC8275811A42240D3D307EBEBA35A46A2F6CB059BBE8B593E8B05
- FF223ED48C1F1DC022F88895002C82608285D19C561C955FEA892E5DF4FD5BB7
- 5A7E1F9277FEBB65CB8897D62A2203CA96FF72E850504945ADBB74A13BB76E8D
- 3A7989BA2F34292E4EB75AAD87001F041F7EBE22FA4176211481D54021AA0D1F
- 3C762CAA64266ABE0C3AEC6E5AB8D0F2FB10D51F80DD6F94B91F53C01578AFB6
- D6B76A609573870D8B9A4EC651F1251EEFDC593FB06D9BA5F7A00C7730CFFA2A
- 7B2FB64156E1DB3535964B925B75EE4C776DDBE679F9F1FC17B06AF223B03798
- 677C15DD573404AB054BD922B012248C0697C0B3830F26CA7F3ACFF6D7A4A450
- B20AF2290250F3FDF7F4DAC18396AD012FAF127872D0C1D4EBC3D787C9AF5088
- 587AE890E5D88057FB0D786EC0B37AF7D6ABD6AE953E1F11FEA1C9C9744E4282
- D343577888CD478ED09B353596560A3AF4EE4DB7AE5DEB2999F2D460ADAEEF2B
- 935F110AC1B8045ECB17F0CC40A775E8A0D75555499F7F61F3E6F45F49494E0F
- 5B110560B970E5E1C3D2E77BA9A0C813839C9294A4CB6EB3A54C7E4538B0EA12
- 603BB3076A6B5D2F5FAE1FA095621EB4E41AD5AA956AD0A138097F1BF24DFCB8
- 95CDFAADFCFCE77CAF145A5C0A864BF00ABB04B22DC9BC504CE4EAC15959E347
- 1EFFD5ECEFAB8CBED8E4C0F1E3B48D8FCF5948716CE763CB89E7DFF071EA5D74
- 330BFFAC205685A04C4A5909C8D613B83D57C0B503D388A4C3AFDDD9DC87F02B
- 6283AF58D03F64015C81F6E13C1B6346AFB698D7FF5B56004F07B92C0C25B088
- DD818DEC16C8A2B954D65C3928CD82F0ABF5FDE807FB047CC8B378F909A1DF6E
- C3EEC4C15A000DB19A2FA0B950DE5C37202B667F768B16D49F0F4574B19167F4
- 0F21F438B09720CFF876138A05D09015757554CE870C6E74075C35182B01BF2B
- F8C753F9FCD10384FE25FEED4BD9ACDE61C30C2FC20E0BC00FEA08DE626B4006
- B705065D3310D9A53E14F3E4B2BFDF353EDEE9212B42640FCFEC10F812F4F80F
- C306A166D86501F8C132E1829A1AA96222372D11BA6210B2493E58E3BFB6552B
- EAA8F6D8F32C68E1BD98CDFAB93CDBBF83BDFF1C1A879D16809F9DECB2BC7AE0
- 8054AE805B92851C1F806C7A2F847F74EBD6AA7EDFA354B070C0C47F958F4336
- EEFEDB90389E183A75EAE43BBA76ED4AEBD6ADA3952B57063CD76E0BC00FFA0B
- CCD9BF5F4A09B8216DD8D13F2E5BD803B37FB49AF93DC7376CE2CF62F37E0E0B
- BD1D91FB86B464E1CDCCCCA45FFDEA57949595455D5898CE3CF34C6AD4200F64
- C28409F4C8238F047C7F382C003FB004E6B02520E30E385D40E4D81FB652D29B
- C73EBF4AEDF50E58A79F525747B359F043D9A9A721EDDAB5F3097A7676365D7C
- F1C5D4B3674F8A17C481CC1440B82C003F880920614806274B891DF9A3569A79
- A868BF77B053F021F003070EA44B2EB9C427F4DDBB773F697697C1290BC08F95
- D501A79A8A38A20034C9441FB5CEEF0DFC82FF3C36E90CE173E0C30F1932846E
- B8E106BAECB2CB8433BC08272D003F56F2043407E431E27F5036D14765F8B91F
- 44F435BEB96760C38D103EA75FBF7E3EA1CFCBCBA3366DDAD8363EA72D003FB2
- 19834EE40844F48FC976EF55B9FDEE6711FBB877D5D6069DB4939E9E4E23478E
- A4FCFC7C3AE79C73C232463758007E5E3F7850AA7620D2DD8623F68764FBF6A3
- AA0F413FB52D973B415E7E11CFFA4B83D85D0791FB2BAFBCD227F403060CB0EC
- D35BC52D16801FAC0CC854114672DF8188499926E1F7A39EFFA6D6AD95F0BB10
- 98FBD3D9D49FCC87D5001F027877DF7DB7CFC46FDEBC79C4C6EC260B00E01ACE
- DEBF5FAA9F801621D98CC81F91F1FB91E8730BFB7FAA7F9FFB409EFE556CC26E
- B668EE43F0274E9C48D75D775DD867FB40B8CD0200682AF2BFD5D542251AA9C2
- A1B0FF01D94C3FA4F8AAFC7EF7F14A7D3D155ADC47CF69C1F7E3360BC0CF1676
- 0390322C2212998261FD70D9F57ED5C0D37D208B6D6C6D2D3D67A1DEFDB4D34E
- A369D3A6392EF87EDC6801F8916D341AEEFC80B0FE4A9A84DF8F3DFA0AD8EF57
- B80704FA86F3AC2F5BA187F5FB5B6FBD951E7AE8214A4E4E767AF83FE2560BC0
- CFF3EC0AC8B41CD7C228A761FB6099DA7EE5F7BB0F2CEFDD5053235DB08335FC
- 679F7D96FAF4E9E3F4D07F829B2D00201D0F08637E40583EB4243B5BFFB2BC5C
- 789ECAF17717C8E6FBBD64D65A6BB6DA205C63C68C7185B91F08B75B0040B666
- E0ACEC6C2A282FB7FD4287E597D3244C7FE5F7BB8B89EC933E2CB9F945FFFEFD
- A9B4B4D4E7F3BB19B75B007E64E3015A18E4D5F60F9C9696A6D7EDDA657A0EB6
- EC1A6363CAA722347EC737E00C49E1BFEFBEFBE8E1871F76EDACDF102F58007E
- 64E2012DD2D2E89E5DBB6CBDF0B67ED892A2227DF5CC99A6E720C9E776E5F7BB
- 863B0F1DA2A72422FD30F9E7CD9B4783070F767AC8D278C5020088073CCD4A40
- D443A06F5111E5CC9C699BDCDAAA003409D35F95F7BA87DB59F89F95107E04FA
- 5E7FFD755FFEBE97F092050064CB87351BE5D6B60F7AAE5F3FFDEB55AB4CCF51
- A6BF7BB8956F349935FEC2C2429AC9565DA8A5B94EE0250BC04FC9FEFDF46F41
- D6ECE9AC906F5EB5CA16D9B54D016812B3FFCD2CFCAAA79FF3C8CEFCE3C68DA3
- E9D3A73B3DDCA0F19A0500D053F0397605446836C9AE2D1F32B54D1BBD5E3068
- 55DFEF0ED09F0FEBFC22EEBFFF7E9A32658AD3C30D092F5A0040A67F40224FA6
- 13AAAB4396DF903F60514181BEAEA4C4F41C24FCDC959AAAAAFC1C660DCF2E97
- 4874AC45461F72F9BD8E172D008040E0E37BF70A7FA75E050574654949484215
- B2446A12A6FFF0E464CA484CB4FB3A292C80DD73FBB0F08BBAF3C2E487E91F0D
- 78D502009B8E1CA1D7241284B4106538A4373F9F95A5EFACA8303D070D3ED0D2
- 5BE12C39070E089B783CF1C41374C71D77383D54DBF0AA05E047A68148C7AC2C
- 1A535111B41C87A40034C1EC0F931F81BFB66ACDDF51FE5057477F12A4F8DE76
- DB6DF4F4D34F3B3D545BF1B20500F6B3B5364B2237400B418E837EA34C5F7F74
- F4CD565D7D1DE56D3625AF109892175E78212DE7DFD28B4B7D6678DD0200E828
- BC42A0BC43D957206805A00966FF563CEBFF96677F15F8730EF8FDDD7806D963
- B2BD36F2F9FFF9CF7FBA3EAF3F18BC6E0100CCFECFF26F784010BBD18294E5A0
- DE342F2747DFB26489E9392AE3CF794439FEA8E3FFF0C30F7D3BEE4423D16001
- 00990CC1AE39393472C912CBF21C9402D02466FF3BDAB68DE435529C02FAF85D
- 2058F283CF0FDF3F1A387AF428FDFDEF7FA7F2F272DAB06103AD5FBF9EB66CD9
- 6278BE572C003F4FEEDB17162BC0F21B64DA7C21E1A7AF9AFD1D4514F52F2828
- A0175F7CD1E96186C461B66EDE7BEF3D5AB46891EFD8CF0A4F162F5900008941
- 4B05564030EDC32C2B004D30FB23E9E79E76ED9CB8468A132C63C1FF8D49D349
- F8FB5BB76E8D688B6EBBD0D9A259BC7831BDF4D24BB46CD9323A24B9F7DEA978
- CD0200D3F6EC112607691665DAD2C90B468DD2D7CF9D6B7A0E9A7C5CE8C11B2B
- 9AF87975357D6A525B3E977F43ECCAE32520F8A848449622CCFB50F19A0500D0
- 3404CD43CCE8316A140D9F3B575AAE2D2900517F7F95F2EB3CA8EDBFD36456C4
- 921F7C652F34F40010FC3973E6D0D4A95369E3C68DB67DAE172D00991461ABFB
- 09489FF85661A1BEA6B8D8F41CB5EEEF2C58F6EBB26F1F551BDC20717C7CB46A
- 15F5EDDBD7E9A14AF1C1071FF8BA0D9B05F382C58B160090C90BE85358485714
- 174BC9B6B40210CDFE98F5C7F1EC9FE89199251A1165FC7925F0575353E3AB46
- 7CE6996742FE2C28BDB39B34A1F39B36A55E7C9CC74737FE77778F96A5637BB1
- 196C051CB3C90A9096564D10FC534D3E9DA713CFFE46BBF562634E04FEDAB76F
- EFF4304DF9EB5FFF4AB7DC720B6DDFBE3DA8F7A7B3700F8D8FA70B58083220F0
- FCEF689B94649A886A92B22D75527166A6FE5565A5E1EB98FDC7B66D4B498D1B
- 3B7D6D62162CF9E59844FE911073EFBDF73A3D4C43E0EB1715150535EB63561F
- 9E904043F9E8E3D199DD0A3256C019999954585929946F2905A009667FD5ECC3
- 79AE397890CA0CF69FC7ECBF73E74E57EDDAD31098FCB9B9B9BE653D5960DA8F
- 4A4CA4BBD9F2F4AA391F0A324D433409F9169EF0FEC489FADF264F363D47B5FA
- 7216E4FA77C48C60F0BA9B7DFF6DDBB6D1E5975F2E1DE187E08FE109E76E16FE
- B3E3E29C1EBE63C8B40EBB64E2441A3879B2A98C0B15C0F4F474BD66C70EC3D7
- DBB3E0DFAA1A7D3ACA34F607EF33591F5EB972A52BF3FD57AF5E4D393939B467
- CF1EA9F30B58E8272525D119CAD5F48152E1DD26F91EC9E9E9347EC78ED01480
- 2630FF07F20F72914AFC719473F7EDA3CD06C1BF1E3D7AD0279F7CE2F4107F02
- 847FE0C08152997C1D58E05F60F7657094952B878A4C6290269071D317DFC8CF
- D73F9E3DDBF40F8C4F4D55C13F07A938768C2E32C9817763971F28A4ECEC6CA9
- DC7DCCFA7FE649A695BAC77E422DBB7ED3D9F533A3677E3E5D357BB6A19C9B2A
- 80294949FA51130DA3DA7D39CF4D35355462B00B7333F69511FC6BE322170D3E
- FFC5175F4CDF7CF38DE979C82A9DCDB3FED56AF35853446DC3E259793E505B1B
- 9C02D004E6BFAAF9779E54F69F8D32FFF2F2F2E8D5575F757A883F02A1472AB2
- 688DBF1DCFF66FA7A450DF180EF2C922D32B40339173C3175E1E3448DF66B22C
- 83B5FFBB55DEBFA3A0E63FC32412FCFEFBEFD3A5975EEAF4307D609D1F3EFF72
- 411BB99F376D4A4BD9AA54813E39900BF0982027A0F3A04174FDB2650105D550
- 7A35C1ECDF837DB3AB5CBAAE1C2B14B3F6BFC540FBB76BD78E76EFDEEDF4107F
- 64C68C19347EFC78D37390D0F321CFFCAA89AC35DE603770BD811BE8473390F5
- A015C0B5ACA5BBAAA8ACA398F9FF575C7105BDF9E69B4E0FD107827E175C7001
- 1D33A925410A6F45EBD6749A9AF92DF3055FD7398280AA664501BC9E97A76F28
- 2D35FC30D5F4C31D982DFFB925F517ADBA20FC6635FCF0F92B79E68FE5C49E50
- 11350BC9C8CBA3AB4B4B7F22EF0115C0B4B434BD6ED72EC30F53A9BFCE83D2DF
- 36264B4068F6D9BF7F7FA787E933FB61FE1B81C6A4157C2FC5420E7F38111508
- B5E8D081EEA9AA9253009AC0FC1FCDA69AD2D6CE6256FC03A13AC0AF39DDF20B
- F5FC08FC998135FE712A912C64B6F0FDF0AA493118D002C87B500AE07E36FF55
- F4DF59CC6AFFFBF4E9E3EBF5EF24D5D5D5D4BB776FDA6192463E283E9EDE5579
- 24B620B31AA0C92880D261C3F44D0B171A7EC8993CBB14B005A0709681ACED97
- 1B24808C1D3B969E7CF24947C777EDB5D752A9491C097EFFBA366D54D0CF464A
- F6EFA77F9B045ACF1D368CF2162E3C49E67FA200A6B669A3D79BAC2DABC61FEE
- A08549D0C7E9A69F6BD6ACA15FFCE217A6E7CC4F4951597E36236A1796C80A77
- 4275B5B902D094FFEF7A4409405F7EF925A5A7A73B36BEA14387D25B6FBD65F8
- 3AF2FB5F503924B613CC72A02505A0B2FFDCC12BF5F534AAA626E06BE8F9FFF5
- D75F3B3636ACF9F7ECD9D3F0F54E4D9AD0273C89A80232FB09260E70D23F5E19
- 3244DFBC78B1E19B95FFEF0E26D4D6D2A3064B3EC3D8CF5BB0608163631B3E7C
- 382D3489217DC8F7CF25CA820C1BA238C0394386D0758B17FF28F727290051F5
- 9F6AFBED0ECC0280D83863E2C4898E8CEBD34F3FA58C8C0CC3D755D43FFC88E2
- 00A756079EA4003481FF7F236BEF8E4A7B3B8E5905E05FFEF2171A3C78B023E3
- 1245FED5EC1F7EACC601A41580F2FFDD017EE09F99FCC0F0FF1107883498FD7B
- F5EA6598EF0FC1FF50B98F11E1619E2064E3003F3E11EDFCA39A7FB88345478E
- D0B0830703BEE66405E0F5D75FEFDBC2CB88F7F9DE19A08AC72282A84948C39D
- 837E54002FF6EFAFEF58B1C2F04D6AFDDF1D986500C2F4870B1069D0D63B95AD
- 43A3D93F8B67FF8FD4EC1F31447180F4FEFDE9C6152B4E5600D33A74D0EBAAAA
- 0CDFA4BAFFB803E4FF2F35D0EED84E6BCA9429111F135A8EDF74D34D86AF2FE1
- D95F35F48C1CA22E412DD2D2E89E5DBB4E56009A0A007A82D3F7EEA5AAE3C703
- BE367FFE7CBAE69A6B223E26741D32EAF483FDF8D6B8A827612C20B367807642
- F6A515C0BDEC5F46DB1E6B5E031B80A49994007FFEF9E7D4B973E7888E09C53E
- 679D7596E1EB4FB0E53856598E11055B873D2AD86B41B3A20054031077605602
- 8CEDBF0E1E3C488D22ACA41F7DF451BAEFBEFB02BE067B717B6AAA2AF8710051
- 8310ADA102106DFFA53200DDC1D4C38791C411F03534FF4013904873FEF9E71B
- 76FB51893FCE21CA08F46F1BE65300F37373F58D65658627F766136E88EA00E4
- 38B93CC32F34D80074DCB871347DFAF4888E4794F9F7627232E5272646744C8A
- 1F587CE810AD35D93CB47B6E2E8D282BFB41013CD3A387BEDBA4671B96FF2E54
- 5D5B1CA7F3BE7DB4DDA007E04B2FBDE45B8B8F24D8CAFBF6DB6F0FF81ADCC65D
- 6ACB78C7106D1BD6BE470FBA6DFDFA1F14C0A4C444FDB8495B61D501D879443D
- 003FFEF8639F391E49468C1841AFBDF65AC0D786252450594A4A44C7A3F80FA2
- 16618DD9327BB0BEFE0705A00956006E674DAE7AB53BCBDFD89FFB95410A30B6
- 00430FC0F8082BE9D34F3FDD708BAF67D865BCD562F41FD1EB437CF8B31C603B
- A0552882895881C21DA852D1E5D8C796E2D36C319AA111C9298007DBB777FAFB
- C43C33D8A4FB9D8149E7440FC0CD9B3753B76EDD0C5F47F61F76F769CEB7D861
- 16EA3A3E0EF081C834FE5DC3079C995A7EFC8E8F63F27F9AFCD9284DF9B3FD2A
- 269E9FE380D2883FF1EFF1ECB6C6720C6292202D5C935100AD78E6BF832D0085
- B3E4D7D4D0CB066E5A6161213DF7DC73111D4F717131DD7CF3CD4E5F1653A624
- 25D184188E5D3DC916C001839811D06414C0E94D9BD21895C9E5384800DA6390
- 01F8F4D34FD36DB7DD16D1F1888A7FDC40AC2B80E7ABABE9EBEFBE337C5D9351
- 00AA0AD0792AD8FFBFC8A40418E63FDC804872F6D9670B77F9759A585700A2AA
- 400D0A409404D42D218146A868AEA34C64DFFF618316604EF40044E00F0140B7
- 13EB0A60FEC183F49941DE08403250A3254545FAEA99330D4F524940CE733E9B
- 72FF3230E59CF0FFE7CD9B47A3468D72FAB20889750520DA35B86F5111357A23
- 3F5FFF78F66CE393D43E808E22EA00841D80B113702441F20F9280DC4EAC2B80
- A5870ED16A936CC09EF9F9D4489406AC1A813ACB53FC03DE6950DB8D02A0AAAA
- AA88EF01880620C83BA8E7D9A596DD131C757575F42D8F15C7617657F088D771
- 24262652120B63C303FF87FC85047631F11CDFA5499326BED7F0FF286AC2CEC2
- DFB1E5E33F8EB0398BA623FE7FE3B3274C98404B972E0D38CE585700A20D4391
- 0EDCE8E54183F46DCB96199E04E1EFAF148063987500C6CC0F0B2096316B441A
- EB0AE02316FEF74DD2813B0F1A448D9ECFCAD2775654189E04F3BFAFAAE77684
- 0327EAFF8D92645E78E105BAF1C61B9D1EA6A398A523C7BA0280F9BFD4A433D0
- 199999D4E8E98C0C7DCF860D8627A95660CE61B6031070AA03B09B501680311B
- F8FE596072FFB4CBC8A046D3D3D3F51A932D9CAF4949A173D5268E8E702DFF78
- F30DA2B8FDFAF5A37FFCE31F4E0FD17194023066D39123F49A410769909C9E4E
- 8D44BB01ABCD409D017DDD53D9FC3F64D0D5C5C91D80DC845200C6883609C16E
- C18D26C5C5E9C74D3A87DCCC277568DAD4E9EF127320F037D0A49CD389F25F37
- A21480313B59AE5F3451008D7962172A00D50DD819B0F4F794C11A6EA74E9DE8
- 8B2FBE707A88AE4029006344DD817D0A40B900EEC4ACFBCFD8B163E9C9279F74
- 7A88AE40AD021823E502A820A0FB40DAEFF9264AF9DD77DFA55FFFFAD74E0FD3
- 15280BC018A920A068197078723265C47053052740E38F1906195CC898DBBB77
- 6FC4BBFFB815A5008C11ED10E45B062CCECCD4BFAAAC343C4925024516B4C54A
- 3389FE63E71FEC00A4F801A5008C914A0412A5020FE48B78510C5FC44853CC3F
- DA2D263F1A36FFC426A08A1F50310063A4528145C5406A57E0C8D2877DFF7506
- A5BF88FE6FDBB62DE2BBFFB81965011823550CA4CA81DD83A8F3CF238F3C42F7
- DE7BAFD3C374154A011823550EAC1A82B887913535F4AA41EA6F5C5C9CAFF4B7
- 8DEACF78124A011823D51044B50473071BD9ECEFC5E6BF514AD6E8D1A3E9E597
- 5F767A98AE43C5008C916A0986279A6A0AEA3866B33F58B97225656565393D4C
- D7A12C0063A49A829E78A2DA823B8868F67762E30FAFA0148031B6B405571B83
- 841FD1EC8F757FACFF2B7E8A5200C6D8B23108505B83850FCCFE192669BF3D7A
- F4F055FEA9A5BFC0280560CCC37BF6F8CACA8DD0641580DA1C347CE4B09FB6D4
- C44F5BB060010D1B36CCE961BA16A5000263697350D1F6E0792929748E2A08B2
- 9D45478ED03093620DE5FB8B510A20309BF9DE2A35B9B74EDA1EFC991E3DF4DD
- EBD71B9E8C4CC00B63F442860BE4FC9FCBA6FF0E131FCD899EFF5E432980C020
- 03F03D9334E0F6EC5ADEB67EFD0F0A40940EAC9281EC6702FF388F9AA469AA9E
- 7F7228051098C5870ED15A932C40A4018F282BFB4101889281CE8C8BA382D6AD
- 9DFE4E518368D90F38B1E1A717510A203025FBF7D3BF4D3A7D210968E0E4C9FF
- 092D6B2681C0667CDA3DEDDA39FD9DA20244652F3970805699FC38D8EA1B5B7E
- 2BC4A84CC0C04CDBB387BE15AC00E0514A01807B590124AAA5A890316BF601D0
- E77FD3A64D949C9CECF4503D81B2007E0AE24B8FB2023043B3AA005477E0D079
- FBC811BAC224320BE6CE9D4B23478E74749C2B56ACF0EDBBF7FDF7DFFBF6EB6B
- F8084EFDBF501EC1A99FDFF06F3424D0FB27B3EB8AF10622561580A81B30D04E
- 5500D3D2D2F4BA5DBB0CDFA076080A8DAF8E1FA79EFBF651B589593660C000FA
- E0830F1C1D2736FE4C4D4DF56DC2E975625501885A81B5484BA37B76ED3A5901
- BCD8BFBFBEC3409302B54B70F0608FBF4BD9EF5F6792978D5E7FEBD6ADA3CE9D
- 3B3B3A56F8D3F0ABA381585500E57575B4820F23D2FBF7A71B57AC385901BC55
- 58A8AF292E367C93AA0A0C8E5A16FEFE02E1076EC9F7C766A32525254E0FC316
- 62550188AA00FB1416D215C5C5272B00A099C401E21A35A2FBD54A802520FCFF
- C53EFF2A81395DC83FC873CF3DE7F4707DB46FDF9EF60802485E211615005699
- 1EC38ED2122B00405A0100B54B903C88C4FE8635F1DF04C28F629FCACA4A6AEE
- 821B75F5EAD5BE04A468211615809500203849018876095271003920FC393CF3
- 2F3731C300FC7E08FF79E79DE7F4907D4C9A3489FEF0873F383D0CDB88450520
- F2FFB11BD084EAEAC00AE0952143F4CD8B171BBE5965048A81E975250BFF5281
- F0376BD68CDE79E71DEADFBFBFD343FE915FFEF297B46AD5AA80AFB5611730B5
- 7163A7876889DFB1F017C6D8CA952803F09C2143E8BAC58B032B00A009E20077
- A7A6FA1E153F05C29F5B53438B4DFAB00108FFDB6FBF4D975E7AA9D343FE91DD
- BB7753C78E1D0D97FFE6A7A4D0D5AA22D4D558F5FF81250500D466A181C152DF
- 0D870E4909FFA2458B5CB7B71F1A8EDE70C30D015FC3AFBD8B157F2B8F5900B1
- 86683350A08914808A035807FDFCAFE599DFACB417A0B5775959992B4B7CCD52
- 6A07C4C7D3FB6A09D8F588360239D5FF073F5100A5C386E99B162E34FC101507
- 3899297575F4473E447973107E08981BBBFB1CE69B06E6FF7E83D9E391A424BA
- 27C682695E44E4FF9FCBF75EDEC285E60A0068023700F900B11E07406AEFF53C
- EB8B22FD00C28F1C7F3724FA04E2C9279FA43BEFBCD3F0F50D3C7374577520AE
- 067EFFC39205400D094A015CCBE660D718DE9E1A453D37B1BFBF87958008083F
- 32EB9C2EF031E2282BB06EDDBAD1F6EDDB03BEDEA94913DAA6BA42BB9E60FC7F
- 1050014CEBD041AFABAA32FCA058DD3014EBFBF7B19FF59449A7958640F867CD
- 9AE54BAF752B66C13FF03F2D5AD01F55CCC7F588F6016C5800D490800AE0F5BC
- 3C7D83414008C46283106CDBFD07F6F5AB24667D809D7C5F79E51557EFE6A3B3
- 42CBC8C8A08D1B37067C1DBFF30E36FF554768F723DA0320232F8FAE2E2D9553
- 004053CB813ED0B917FDFB360B22FC0D81AF5F5C5CECFAA61E6FBDF5160D1D3A
- D4F0F5716CE9FD39062D3DAF11ACF90F0C15C0A4B838FDB84944B14762225DE5
- F21B3C1490C30FC1AFB050178F35FE993367BADAE46F8859E61F54FBB6D4543A
- 43ADFDBB1ED12EC040B3AA005E1E3448DFB66C99E107466B56E0BFBEFBCEE7E7
- 8B52794F05453D58E6734B5EBF08341E193870A0E1EB05ACE05F8862051F2DC8
- 64FF751E3488AE5FB6CC9A02009AC00D88A62E4130A3FEC87E3EF6E8B3DA0B67
- ECD8B1F4D8638F51BC47564610F9EFD5AB97A1EF0FD4D29F371075FF019A899C
- 9B2A80294949FA5193CD05A2A14908D6F11FE78B284AE10D44EBD6AD69F6ECD9
- AECCEC33E381071EA0871F7ED8F0F5DC84047A2D25C5E9612A241035FF884F4A
- A2076A6B8353006FE4E7EB1FF30D6EC6787603923CE62762396F0ECFF458CEFB
- 97A0534F20B0BC57545444BFFFFDEFA98DC7B64E5FB3660D6566669AF6FCFB3F
- FE4E7DD4ECEF7AD070663A9BFF66F42A28A02B4B4A8253004013B8015EDA360C
- D97B4F1D3E4C252CFC32493CA702C1CFCBCB234DD31CEFDD170C30FD2FB8E002
- 5A6FB20DDC109EFDDF54B3BF27106DFF0534818C0B15C0F4F474BD66C70EC3D7
- DBF34C71ABCB674144F2D18BFF4D36F383ED753B78F0609A3A752A9D7FFEF94E
- 7F9DA079F0C107E94F7FFA93E1EB2D1B35A24D6DDBD2691EB3E8629559D5D5B4
- DBC4824D4E4FA7F13B7684A60044DB8601B7EE198035FC497575C2869C66A045
- 16FC6537D5EE07838CE9FF627232E527263A3D548504557C4F3F6752B50BFCDB
- 7F999D23B586A709DC80BECD9AD160176E1E3AF4E0C1A0827BA06BD7AEBE19DF
- 8DD57B5641B51F84DFCCF41F141F4FEF7A3CA01B4B88527F812621DF520AA038
- 3353FFAAB2D2F075E4028C4B4D75DDD661B9AC00165A540068D185CAB8ABAEBA
- 8A1AB9ECFB0403D27D73727268E9D2A586E7C0F4FF944D7F95F4E30D10C49E21
- 58FB3F83157E6165A53D0A0068022BC08D0542B2160032F810DCBBEBAEBB3CED
- E307E28E3BEEA0A79E7ACAF49C67D87ABB354AF239620151E30FA049CAB6B402
- 989498A81F37493774A315205200D888F3F6DB6FF7F5E5473FFC6863C68C1934
- 7EFC78D37354B71F6F2133FB378E8BA3078F1DB3570188760E026815D6DF45A5
- A3660A005B704340BC92BD671551A10F80E9BF8E853F168ABAA205B4FC2E3769
- FB0D1AEEFC23C2D2742D2A1042F9E85D2EAA0F3053004F3CF184CF3C8E4610F1
- CFCECEA6432629A210F97758F80744A9028C4630EB3FCEB3FFB736CDFEC092A4
- 2E18354A5F3F77AEE9396E4A0C325300D3A74FA771E3C6393D44DBD9BC79B34F
- F8BFF9E61BD3F3D4929FF79049FCE9316A140D9F3B373C0A00C858016E691662
- B60A108D0A0033FF65975D26DCDB4F75F9F126D3F877359BFD816651A62D2B80
- F9B9B9FAC6B232D373DC5225184B2EC08A152BE8F2CB2F3735FBC1F53CEBCF56
- 65BE9E036BFE4B05BF6DF7DC5C1A5156165E050034C19260AB264DE80E173492
- 8C150580801F9631BF1524865CC2FEE17BECF7BB2546A39047D4F20B6841C873
- 5077C2BC9C1C7DCB9225A6E7B8C10A888518C0BC79F3A8A0A0C034C5179CC34A
- B9B2756BB5BB8F0791A9F93F75CF3F59829E0A34092BE0B76DDA383ADB44BB02
- 78F4D147E9BEFBEE139E87D6DEEFB3D9AF96FBBC0722FFCF56578765F607414B
- E7EC0103F4EDCB979B9EE3F43662D1EA02D4D4D4F866FD85263B38F939AF6953
- 5F8EBF4AF3F526A2EDBE41A70103287FF9F2C82A00A009AC00CCFEBF6DDBD631
- B3D36C15C0AB0AE0934F3EA1DCDC5CDAB2658BF0DC7E3CE3BF9392A2CC7E8FB2
- 8F677D54FC1DB339F2DF909014C0F35959FACE8A0AD3739C6C1B166D2EC08B2F
- BEE8EB44240AF60124F8BCC966BFD7BA3529FE83A8DD17E8989545632A2A9C51
- 00401358016038DF88190E249D448B0B80725E083EB61893015D7DCAF89AAB68
- BF77D9505F4F0BD8D513A18528C321DF218B0A0AF475821B130141340D8974A1
- 503458009F7EFAA96F89CFAC96BF21AA9DB7F79149F905A27E7F32D8229153DB
- B4D1EB05DD499C2817F6B20580FE7D0F3DF490AF298968890F20BEFF47BEBE13
- 5C9286AD081E9972DF449E50275457872CBFB64DC99A842B10E9D6615EB5002A
- 2A2AE8A69B6E32EDDBDF900EECE7CF4F49F125FA28BC8D4CAB2FA0D924BBB629
- 0051D7207026DFA005AD5BDBF5278578AD1600CB7B68352E6AE0D11004FB4AD9
- E46FA7827D5141C9FEFDF46F81C527DBED47065B9D7251A110886486A0975C00
- A4F36287A11D261D984F4515F5441732197F40B3516E6D55004B8A8AF4D53367
- 9A9E83C8F4EDEC0A244760CB692FB800AB57AFF665F32D1724553504B33D0A7A
- 06AB5AFEA8A1E6FBEFE9698935FFBE4545943373A63B1500989696A6D7EDDA65
- 7A4EA45C01375B00DBB66DA3FBEFBF9F5E7BED354BEF43F75ED4F2ABCCBEE8E2
- 7916FEAF05EDEB5BA4A5D13DBB76D92AB3615997D3240282915815709B024087
- DEFDECE36167A159B3664945F7FD60D67F8CAFD768D5C423EA9089FA032D0CF2
- 1A160550929DAD7F595E2E3CEFDA56ADA86B18CD5837B900E8D083E0DE4C7691
- 4435FB3FB94E2CF48FB3F0AB405FF4B199EFCF52BE4F458492EF6F46D8327344
- 5D8441B313B502E14A5775C32A0072F7B175786969A9A5191FA4376942CFB66C
- A97CFD28057EFFFFB2E92F4AF869CC13C083F5F56191D5B0A6E66912AEC0E94D
- 9BD29830ED2DE8940B0053FF9D77DEA169D3A6590AEEF9C16AFE9866CDE8CF3C
- EBBBA9CDBAC25E64FC7EA085514EC37A77C9B40F03E18A07445A0120671F0D3A
- D06E5C3689E75490C73FB5450BEAEEC2BD1615F621EBF767E4E5D1D5A5A5DE54
- 00E0892E5DF4FD5BB70ACF0B473C20523180DDBB77FB7C7B04F6440D398DE8C5
- 02FF049BFB2A9B2FFAD972F428BD7AE080F0BCD65DBAD09D5BB786554623625F
- CAC6036EB1393F20DC0A00FEFDE38F3FEEF3EF654A7403816E3D0FF18C7F9D8A
- EEC704D27EBFC5FEFEC112310753938807B4E759F0A6D6AD6D2B630D870B80F5
- FB575F7D95E6CF9F2F5DA11708E4EF8F63D7E72EF6F555D96E6C80249F17F6EF
- A7DD0EFBFD0D89D89D573A6C98BE49A285959D0D44ECEA088425BC3973E6D082
- 050B68D5AA55218DE9E7ACE4C6B3E08F645F5F097EEC00E1C7729FA8C1073877
- D830CA5BB830BA140078BC7367FD00CFA022BAB3705C9D9212F2DF0BC50580D0
- BFF1C61BBEA0DECA952B431E0B32F8EE66C11FA496F46292D7F95EDC28B15375
- ABCE9DE9AE6DDB222697119F8264E201A02F9BC6835BB60CE96F59550028C479
- F7DD777D267E30CB77A782705E017F8F3BF95051FDD8051B7AAC9688118573BD
- DF08476C504D221E0042DD6D58140340A79DF2F2727AEFBDF768D9B265B47DFB
- 765BBE1F32F66E65A12FE24365EFC53632BBF9FAD11C90474714C0EB7979FA86
- D252A97343291F365300AD5BB7F6E5E5DB095A7063B647BEBE4AE051C896F782
- 70AFF71BE1D85D2AB3AF809FBC94143A2721C1F2DF3053007681E5CB1CF6EB61
- EAAB945D851FD91C7F10AE3C7F191C9DA666F5EEAD57AD5D2B3C0FD172AC0C74
- B49824132E0580515CC60A69041F57B0D0ABD6DB8A86EC3C76CCD7D25B54DB0F
- 3AF4EE4DB7AE5DEB981C3A6EA7CA660A62A61DCD66BB959E82762A0008FDC52C
- EC7958A1E0436DB6A108047AFACD61D75294E8032291E927C2710500A675E8A0
- D7555509CF8312B8D68225609607200B76D719C93E3D045F05F4146660E6478A
- AF8CF0B7E8D081EEA9AA725CFE1C1F809F294949FAD1DA5AE1797007B0D1884C
- 4C20180BA0257F7E36CFF4D92CF8D7B0E0ABCE3B0A1990DF5FC6F79B8CD96F57
- 4B6F3B70C520FCC8E6080099D5011905005B229385FD372CF4E8B09BA58A7114
- 16B112ED7762ADDF0CD70CC48F4C67613FA23C01230580CABB5FB3B00FE403D5
- 776AC94E112C56D6F92355E06305570DC68F26992804CC3206FD3100E4DF0FE0
- 8B3FE08469AF02780A3B90CDF0F3A3B950DE5C37203F9A052560543BB0E6BBEF
- E84C167615BC53D88D6C6EBF1FCDA5B2E6CA41F9B1E20EA08A100943AAC24E11
- 4EEA75DD27FC32557DC08D667F435C3B303F560283E827701D2B81486C3AA288
- 3D6A8F1FA7B9070E48D5F303B705FC02E1EAC1F991D97DD80F7205AE642510CE
- 76E38AD803A9BD6FD6D448ADF103372DF599E1FA01FA914D16F2E3C476E48AE8
- 44B681A71FB724F9C8E08941FA914D1BF6832DC89034A45C024530A07FDF029E
- F545BBF536C40DE9BD56F0CC40FDC81610F9814B3054327350A1F083CCBE4507
- 0F4A9BFCC0E9C29E60F0D460FD582925F663478721456C60D5E4074E96F48682
- E706ECC74A53113F7009AE4A495189408A80C0E47F8D677D99DD7A1AE254330F
- 3BF0E4A01B62255700204F60705252D05D8614D109F2F997F2CC2F53CCE3C7ED
- 6BFC32787AF07E64BB0D3704D6005C022BFD0514D107EAF791D26B25D00722DD
- BD375C78FE0BF891DD77E054101BC072A1CA208C2D30D3C3D7B792CBEF27927D
- FBC34D547C898658750900560AFE9BAD810CB53D574CB0A1BE9EFEC2B3BE9508
- 3FF042669F55A2EACBF8B19A2FE007F5044392935590304AD9F7FDF7BE59FFB3
- 20BA44796D7D5F96A8FB427E64B7263F15B80259CD9BD3457C28B7203A80B9FF
- D1E1C354C18795209F9FEEB9B934A2AC2C2A6F86A8FC520DB1524CD490564D9A
- D0C0162D945BE07110DD5FC1827F80677FAB44A3C97F2A51FDE5FC946467EB5F
- 969707F55E280258047DD5B2A1A74070AF2248C1075E4DECB14AD47FC1864C4B
- 4BD3EB76ED0AEABD500417B012E8ABB6F3762D30EF21F8FFC747B082EFA5421E
- 3B88992FEA67495191BE7AE6CCA0DF8F1583BE6C1164F2A17A09BA0334E958C5
- B3FD3FF8B01AD96F48DFA222CA993933A67ED498FAB20D29CECCD4BFAAAC0CFA
- FDB002600D5CDCA28552040E01C1FF7B5D9D6FD60F26B8E7E7F47EFDE8E655AB
- 62F2478CC92FDD102BCD46020145D02B31917AB3325059859101D97B6B59E8D7
- D5D78724F85E69DA114E62FACBFB595450A0AF2B2909F973D092EC7C560638D4
- 7E81F682765C9FB0C0E3906DC96546AF8202BAB2A424E6EFFF98BF000D793E2B
- 4BDF595161CB6721A9A84742826F1951050D8303B33B5A71AD61A1976DC229A2
- 6356168DA9A8503FC809D485084030FD068C80F09FCB8A00D58767AB5D87A440
- 338E7FB1D06F62E10FC5C46F48AC2CEB59455D10135E193244DFBC78B16D9F87
- 1504C40ACE62EBA0132B036519FC00847CFBB163B495051EC21FEC125E20BAE6
- E4D0C8254BD48536405D18099056FCD99B6F92D52223112849C6F133B6103A36
- 6D1A330A0102BF93FDF8CF59E0B7B3C0EF6181B76BA607A8D3EF367468D4A6EF
- DA89BA401658306A94BE61FE7CDB150180F0631501B1832E7CA4459942F882AF
- D9972CECF0E511C5B753E0FD40F033468CA0E173E746CF850B33EA4205C15B85
- 85FABA397328981A035920FC1DF9863E8D15018E56AC14DAF2FFB93DE7006BF3
- 30E1AB58E0F7F2E3372CEC3BF9793804DE0F04BF577E3E5D515CECEE8BE342D4
- 050B9150138AAC8238422A2B041C6D9B34A176FC8823D225CC28ADDDC7C20D21
- C7F3BD78CE4728997856392333930A2B2BD53D1C02EAE2D9C4FB1327EA1FB355
- 50B36387237F1F16430B5602CDF931811FE3F9B1393F363DF15AB313FF877588
- 447E8E73A04CBE6381854373E4F871AAE703CF8FF2FF7D8BE7FC8815F7C3FC1C
- FF87730E9F98E19D22393D9D7A8E1E4D03274F56F7AE0DA88B1806DEC8CFF7F5
- 22385A5BEBF450A282F8A4243AEFEAAB55E24E18501734CCBC3C6890BEBDBC3C
- 2C81C368067E7DA7EC6CBA7ED932758F861175712308F6328032B0B2C7612C81
- 525C08BD577BEC7B1175A11D04F9055F7CF00185528CE465508C03818F960EBB
- 5E445D781781CCC31D1F7D14B50A01029F7ED14574DDE2C5EABE7309EA877031
- C837D8B7650BEDDDB4C9736E438BB4344AEDDE9DDA76EDAAD6E75D8CFA613C08
- 961CF77EF619EDE3632F2B887026249981A699A92CE06DBB75A3543ED4D29CF7
- 503F58940225517FF0201DABABA323870ED1117E8E65C9233535BE7FE3F9517E
- 04F12D5BFA96DA12F8312139F987E72929BE7FC7A1E3113F57C21D9DFC3FB05B
- 459D4B95757A0000000049454E44AE4260822800000030000000600000000100
- 0800000000000000000000000000000000000000000000000000000000000202
- 04000505070004040B0003030E0004040D0008080B000A0A0E000C0C0E000404
- 1200050514000C0C100006061A0006061D001111160015151A00060621000707
- 280007072C001B1B20001D1D22000808350008083B0022222800242429002828
- 2E002E2E2F0036363A0039393D003C3C3C000808470008084B0008084D000707
- 50000808530008085A0008085F003E3E42000909660009096A000A0A71000A0A
- 76000B0B79000B0B7D004343470044444700464649004A4A4C00535354005757
- 57005B5B5D00666667007171710077777700787878007D7D7D00000080000606
- 83000B0B8100090984000C0C85000404890005058F000C0C890016168B001717
- 8C00070790000D0D91000D0D96000606990006069D000D0D9900222291003434
- 9A003E3E9E000707A3000E0EA0000E0EA6000707A9000909B1000F0FB2000909
- B5001010B4001010BA005050A7005757AB007272B8000E0ECE001111C2001111
- C9001212D1001212D6001010DA001010DE001313E1001414E3001212E6001414
- E7001414E9001515EE001414F3001515F5001616FA001515FE00808080008A8A
- 8A008D8D8D00929292009A9A9A009E9E9E00A1A1A100A7A7A700AAAAAA00B0B0
- B000BDBDBD00C9C9C900D0D0D000D7D7D700D9D9D900DDDDDD00E2E2E200E5E5
- E500EBEBEB00EDEDED00F1F1F100F5F5F500F9F9F900FEFEFE00000000002F26
- 000050410000705B000090740000B08E0000CFA90000F0C30000FFD21100FFD8
- 3100FFDD5100FFE47100FFEA9100FFF0B100FFF6D100FFFFFF00000000002F14
- 00005022000070300000903E0000B04D0000CF5B0000F0690000FF791100FF8A
- 3100FF9D5100FFAF7100FFC19100FFD2B100FFE5D100FFFFFF00000000002F03
- 0000500400007006000090090000B00A0000CF0C0000F00E0000FF201200FF3E
- 3100FF5C5100FF7A7100FF979100FFB6B100FFD4D100FFFFFF00000000002F00
- 0E00500017007000210090002B00B0003600CF004000F0004900FF115A00FF31
- 7000FF518600FF719C00FF91B200FFB1C800FFD1DF00FFFFFF00000000002F00
- 20005000360070004C0090006200B0007800CF008E00F000A400FF11B300FF31
- BE00FF51C700FF71D100FF91DC00FFB1E500FFD1F000FFFFFF00000000002C00
- 2F004B0050006900700087009000A500B000C400CF00E100F000F011FF00F231
- FF00F451FF00F671FF00F791FF00F9B1FF00FBD1FF00FFFFFF00000000001B00
- 2F002D0050003F007000520090006300B0007600CF008800F0009911FF00A631
- FF00B451FF00C271FF00CF91FF00DCB1FF00EBD1FF00FFFFFF00000000000800
- 2F000E005000150070001B0090002100B0002600CF002C00F0003E11FF005831
- FF007151FF008C71FF00A691FF00BFB1FF00DAD1FF00FFFFFF00000000000000
- 0000000000000000000000000056554A483B3B484A5556000000000000000000
- 0000000000000000000000000000000000000000000000000000543B383D4246
- 4F52534E4B4339383B5400000000000000000000000000000000000000000000
- 00000000000000003B393D505E676666666666666667665E513D383C00000000
- 0000000000000000000000000000000000000000000040384B5E676766666666
- 666666666666666666665F4D3841000000000000000000000000000000000000
- 000000004938475F66666666666666666666666666666666666667675E453849
- 0000000000000000000000000000000000000041395767676767666666666666
- 66666666666666666666666666665A3941000000000000000000000000000000
- 0000394261676767676767676666666666666666666666666666666666676761
- 423B0000000000000000000000000000003846652923475F6767676767676766
- 6666666666666666666666666666666666463800000000000000000000000000
- 394C6667240807011F5266676767676666666666666666666666666666666667
- 6766463900000000000000000000004142656767242E7E6F25000C2B63676767
- 6766666666666666666666666666666666666642410000000000000000004939
- 62666767242E8F8F8F77360E0A47666766666666666666666666666666666666
- 6667676139490000000000000000385767676666262E8F8F8F8F8F7C34011662
- 67676766666666666666666666666666666666665A3800000000000000414766
- 66666767242E8F8F8F8F8F8F8F7414105B676666666666666666666666666666
- 66666667674541000000000000385D6767666666262E8F8F8F8F8F8F8F8F7A1C
- 055B676767666666666666666666666666666666665F3800000000003B4D6666
- 66666667241A7B8F8F8F8F8F8F8F8F7E1B126567676767666666666666666666
- 6666666767674B3C00000000385E6767666666664D0C08347A7F8F8F8F8F8F8F
- 790B26676767676767676766666666666666666666665F380000005442666666
- 666666666666430C026D8F8F8F8F8F8F8F70005E676767676767676766666666
- 666666666767673D5400003B4F67676666666666666666663C02688F8F8F8F8F
- 8F7F0F2A67676767676767676767676666666666666666503B0000385E666666
- 6666666666666666674C01327F8F8F8F8F8F360C44444444444444475B666666
- 666666666667675C38005638676767666666666666666666666658026D8F8F8F
- 8F8F75080B0707080B0808004467676666666666666666673956554366666666
- 6666666666666666666767270F7D8F8F8F8F8F8F8F8F8F8F8F8F8F0B47666666
- 666666666666676742554A466767666666666666666666666666666306688F8F
- 8F8F8F8F8F8F8F8F8F8F8F0B446767666666666666666667464A484E67666666
- 6666666666666666666667673C06798F8F8F8F8F8F8F8F8F8F8F8F0B47666666
- 66666666666767674E483B5167676766666666666666666666666666660B698F
- 8F8F8F8F8F8F8F8F8F8F8F08446767666666666666666666533B3B5366666666
- 66666666666666666666666767222F8F8F8F8F8F8F8F8F8F8F8F8F0847666666
- 6666666666666767513B484E6767676666666666666666666666666666440B8F
- 8F8F8F8F712D2C2D2D2E2E024467666666666666666666674E484A4667676666
- 666666666666666666666667675A00748F8F8F8F730022262627272759666666
- 6666666666676767464A5542676767666666666666666666666666666667076B
- 8F8F8F8F7F0E2A67676766666666666666666666666666674355563966676666
- 666666666666666666666667676720308F8F8F8F8F370A656766666666666666
- 6666666666676767385600385C6767676766666666666666666666666666400E
- 8F8F8F8F8F79023F6767676766666666666666666666675B3800003B4F676767
- 66666666666666666666666666675A00738F8F8F8F8F69015267676666666666
- 666666666767674F3B0000543D67676767666666666666666666666666666610
- 687F8F8F8F8F8F330359676767676666666666666667663D54000000385E6767
- 66666666666666666666666666676727198F8F8F8F8F8F7F2E01285F67666666
- 6666666767675D38000000003C4B67676767666666666666666666666666665A
- 026E8F8F8F8F8F8F7F6C0E000C3C66666666666667674B3C0000000000385E67
- 67666666666666666666666666666767280B798F8F8F8F8F8F8F7E721D1F6666
- 66676767675D3800000000000040456767676767666666666666666666666666
- 66111D7C8F8F8F8F8F8F8F8F331E67666667676767454100000000000000385A
- 67676766666666666666666666666666675B0D18778F8F8F8F8F8F8F331E6767
- 6767676757380000000000000000493861676767676766666666666666666666
- 666663150E6A7E8F8F8F8F8F331E676767676761384900000000000000000041
- 3E656767676666666666666666666666666667662A021469768F8F8F331E6767
- 6767643E41000000000000000000000039466767676767676666666666666666
- 666666666661260C02183672311E676767674639000000000000000000000000
- 00384665676767676766666666666666666666666666666658281100001E6767
- 644638000000000000000000000000000000393E606767676767676767666666
- 6666666666666666666667635958676142390000000000000000000000000000
- 0000004138576767676767676767676767676767676767676767676767675738
- 41000000000000000000000000000000000000004938455D6767676767676767
- 6767676767676767676767675D45384900000000000000000000000000000000
- 00000000000040384B5D676767676767676767676767676767675D4B38400000
- 0000000000000000000000000000000000000000000000003B383D4F5C676767
- 676767676767675C4F3D383B0000000000000000000000000000000000000000
- 00000000000000000000543B38383E464E51514E464238383B54000000000000
- 000000000000000000000000000000000000000000000000000000000056554A
- 483B3B484A555600000000000000000000000000000000000000FFFFE007FFFF
- 0000FFFF0000FFFF0000FFFC00003FFF0000FFF000000FFF0000FFC0000003FF
- 0000FF80000001FF0000FF00000000FF0000FE000000007F0000FC000000003F
- 0000F8000000001F0000F0000000000F0000F0000000000F0000E00000000007
- 0000E000000000070000C000000000030000C000000000030000800000000001
- 0000800000000001000080000000000100000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000000000000000000000000000000000000000000000000000000000000000
- 0000800000000001000080000000000100008000000000010000C00000000003
- 0000C000000000030000E000000000070000E000000000070000F0000000000F
- 0000F0000000000F0000F8000000001F0000FC000000003F0000FE000000007F
- 0000FF00000000FF0000FF80000001FF0000FFC0000003FF0000FFF000000FFF
- 0000FFFC00003FFF0000FFFF0000FFFF0000FFFFE007FFFF0000280000002000
- 0000400000000100080000000000000000000000000000000000000000000000
- 000000000000030305000B0B14000C0C16000E0E1D0012121F000F0F22001313
- 220017172300101024001919270012122D0014142F00191928001D1D29001E1E
- 2F001313340014143A0012123C0015153F00222231002A2A3A002C2C39003131
- 3D001212450010104B001616480012124E0013135200323243003A3A46001717
- 660012126A001414690012126E000F0F7D001111700013137E00454554004B4B
- 570050505E005E5E6A0063636F00676772006D6D77007373780078787F000606
- 8400090987000A0A88000E0E8E0012128E0015158E000D0D95000E0E9D001010
- 92001919910010109A0010109C002E2E9B0031319F000E0EA8001010A3001010
- A6000F0FB7001010BA001010BF006262B4007A7ABE000D0DC2001212CE000F0F
- D0001212D1001010DA001212E7001414E7001414E9001313EE001414EC001414
- F1001414F5001616FB001616FE00808085008C8C8F00969699009E9E9F00A0A0
- A100AEAEAE00B7B7B700BEBEBE00D6D6D600DADADA00E2E2E200E4E4E400E9E9
- E900EEEEEE00F0F0F000F6F6F600F8F8F800FEFEFE004CB0000059CF000067F0
- 000078FF11008AFF31009CFF5100AEFF7100C0FF9100D2FFB100E4FFD100FFFF
- FF0000000000262F0000405000005A700000749000008EB00000A9CF0000C2F0
- 0000D1FF1100D8FF3100DEFF5100E3FF7100E9FF9100EFFFB100F6FFD100FFFF
- FF00000000002F26000050410000705B000090740000B08E0000CFA90000F0C3
- 0000FFD21100FFD83100FFDD5100FFE47100FFEA9100FFF0B100FFF6D100FFFF
- FF00000000002F1400005022000070300000903E0000B04D0000CF5B0000F069
- 0000FF791100FF8A3100FF9D5100FFAF7100FFC19100FFD2B100FFE5D100FFFF
- FF00000000002F030000500400007006000090090000B00A0000CF0C0000F00E
- 0000FF201200FF3E3100FF5C5100FF7A7100FF979100FFB6B100FFD4D100FFFF
- FF00000000002F000E00500017007000210090002B00B0003600CF004000F000
- 4900FF115A00FF317000FF518600FF719C00FF91B200FFB1C800FFD1DF00FFFF
- FF00000000002F0020005000360070004C0090006200B0007800CF008E00F000
- A400FF11B300FF31BE00FF51C700FF71D100FF91DC00FFB1E500FFD1F000FFFF
- FF00000000002C002F004B0050006900700087009000A500B000C400CF00E100
- F000F011FF00F231FF00F451FF00F671FF00F791FF00F9B1FF00FBD1FF00FFFF
- FF00000000001B002F002D0050003F007000520090006300B0007600CF008800
- F0009911FF00A631FF00B451FF00C271FF00CF91FF00DCB1FF00EBD1FF00FFFF
- FF000000000008002F000E005000150070001B0090002100B0002600CF002C00
- F0003E11FF005831FF007151FF008C71FF00A691FF00BFB1FF00DAD1FF00FFFF
- FF00000000000000000000000000433C382F2F383C4300000000000000000000
- 000000000000000000000043313945494A50504A494539314300000000000000
- 0000000000000000004431404F525252525252525252524F4031440000000000
- 00000000000000003B3F4F52525252525252525252525252524D3F3B00000000
- 0000000000000034414952525252525252525252525252525252524234000000
- 00000000000034474B0110324B52525252525252525252525252525247340000
- 00000000003B42524B0F5C2E0A1A485252525252525252525252525252423B00
- 00000000443F52524B0F6F6F6F5A0A3352525252525252525252525252523F44
- 00000000314D52524B0F6F6F6F6F6127184B5252525252525252525252524D31
- 00000043405252524B08626F6F6F6F6F55125252525252525252525252525240
- 430000314F52525250220553636F6F6F6F2B255252525252525252525252524F
- 300000395252525252524E2017606F6F6F610451525252525252525252525252
- 390043455252525252525252370E616F6F6F281B1F1F1F1F2452525252525252
- 45433C49525252525252525252232C6F6F6F5E59595959590352525252525252
- 493C384A52525252525252525250065D6F6F6F6F6F6F6F6F0352525252525252
- 4A382F505252525252525252525236296F6F6F6F6F6F6F6F0352525252525252
- 502F2F50525252525252525252524E0D6F6F6F615B5C5B5B0352525252525252
- 502F384A52525252525252525252520B5F6F6F5B011313131952525252525252
- 4A383C49525252525252525252525221586F6F6F144952525252525252525252
- 493C434552525252525252525252523D2A6F6F6F542452525252525252525252
- 4543003952525252525252525252524E0D6F6F6F63163E525252525252525252
- 390000304F5252525252525252525252115C6F6F6F5F0E21465252525252524F
- 300000434052525252525252525252523E266F6F6F6F6257151C525252525240
- 43000000314D52525252525252525252521B53646F6F6F6F610C525252524D31
- 00000000443F52525252525252525252524E1C1E5F6F6F6F610C525252523F44
- 00000000003B425252525252525252525252523A0756616F610C525252423B00
- 00000000000034475252525252525252525252524922091D2D0C525247340000
- 0000000000000034425252525252525252525252525252483532524234000000
- 00000000000000003B3F4D52525252525252525252525252524D3F3B00000000
- 0000000000000000004431404F525252525252525252524F4031440000000000
- 000000000000000000000043303945494A50504A494539304300000000000000
- 0000000000000000000000000000433C382F2F383C4300000000000000000000
- 0000FFF00FFFFF8001FFFE00007FFC00003FF800001FF000000FE0000007C000
- 0003C00000038000000180000001800000010000000000000000000000000000
- 000000000000000000000000000000000000800000018000000180000001C000
- 0003C0000003E0000007F000000FF800001FFC00003FFE00007FFF8001FFFFF0
- 0FFF280000001000000020000000010008000000000000000000000000000000
- 00000000000000000000000000003F3F69002A2A720044447700272784002323
- 8F002C2C8F003535870033338C0035358E002A2A91002D2D910023239A001F1F
- A1001F1FB1001C1CBF002323A0002525A4003333BE0040408700515181005555
- 86005F5F80006363870062628E0066668E00696989004747B4004A4ABC001515
- C3001515D4001919D6002828C5001717E5001515F3001515FA001616FE006969
- C1007E7EC8009797AA00AFAFBB00BABAC700C2C2C800CDCDD400D1D1D300D5D5
- D800DDDDE000E4E4E500F1F1F100F9F9F900FFFFFF0000704C000090630000B0
- 790000CF8F0000F0A60011FFB40031FFBE0051FFC80071FFD30091FFDC00B1FF
- E500D1FFF000FFFFFF0000000000002F0E00005018000070220000902C0000B0
- 360000CF400000F04A0011FF5B0031FF710051FF870071FF9D0091FFB200B1FF
- C900D1FFDF00FFFFFF0000000000022F00000450000006700000089000000AB0
- 00000BCF00000EF0000020FF12003DFF31005BFF510079FF710098FF9100B5FF
- B100D4FFD100FFFFFF0000000000142F000022500000307000003D9000004CB0
- 000059CF000067F0000078FF11008AFF31009CFF5100AEFF7100C0FF9100D2FF
- B100E4FFD100FFFFFF0000000000262F0000405000005A700000749000008EB0
- 0000A9CF0000C2F00000D1FF1100D8FF3100DEFF5100E3FF7100E9FF9100EFFF
- B100F6FFD100FFFFFF00000000002F26000050410000705B000090740000B08E
- 0000CFA90000F0C30000FFD21100FFD83100FFDD5100FFE47100FFEA9100FFF0
- B100FFF6D100FFFFFF00000000002F1400005022000070300000903E0000B04D
- 0000CF5B0000F0690000FF791100FF8A3100FF9D5100FFAF7100FFC19100FFD2
- B100FFE5D100FFFFFF00000000002F030000500400007006000090090000B00A
- 0000CF0C0000F00E0000FF201200FF3E3100FF5C5100FF7A7100FF979100FFB6
- B100FFD4D100FFFFFF00000000002F000E00500017007000210090002B00B000
- 3600CF004000F0004900FF115A00FF317000FF518600FF719C00FF91B200FFB1
- C800FFD1DF00FFFFFF00000000002F0020005000360070004C0090006200B000
- 7800CF008E00F000A400FF11B300FF31BE00FF51C700FF71D100FF91DC00FFB1
- E500FFD1F000FFFFFF00000000002C002F004B0050006900700087009000A500
- B000C400CF00E100F000F011FF00F231FF00F451FF00F671FF00F791FF00F9B1
- FF00FBD1FF00FFFFFF00000000001B002F002D0050003F007000520090006300
- B0007600CF008800F0009911FF00A631FF00B451FF00C271FF00CF91FF00DCB1
- FF00EBD1FF00FFFFFF000000000008002F000E005000150070001B0090002100
- B0002600CF002C00F0003E11FF005831FF007151FF008C71FF00A691FF00BFB1
- FF00DAD1FF00FFFFFF000000000000251C12121C250000000000000000262023
- 2424242423202600000000001B0D0E23242424242424211B0000002621092C17
- 112424242424242126000020240832322B0724242424242420002523241F032E
- 32280F242424242423251C24242424042D321A1515102424241C122424242424
- 143232323206242424121224242424240B313016180C242424121C2424242424
- 1D2A321324242424241C25232424242424153229052224242325002024242424
- 240C2E322F012424200000262124242424240A2731192421260000001B212424
- 2424241E0A02211B000000000026202324242424232026000000000000000025
- 1C12121C250000000000F81F0000E0070000C003000080010000800100000000
- 000000000000000000000000000000000000000000008001000080010000C003
- 0000E0070000F81F0000}
- OldCreateOrder = False
- OnCreate = FormCreate
- OnResize = FormResize
- PixelsPerInch = 96
- TextHeight = 13
-end
+object frmMain: TfrmMain
+ Left = 323
+ Top = 163
+ Width = 1007
+ Height = 661
+ Caption = 'FFDec Flash Player'
+ Color = clWhite
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ Icon.Data = {
+ 0000010004000000000001000800EC310000460000003030000001000800A80E
+ 0000323200002020000001000800A8080000DA40000010100000010008006805
+ 00008249000089504E470D0A1A0A0000000D4948445200000100000001000806
+ 0000005C72A866000031B34944415478DAED9D0B7C14D5F5C70F8F3C8090F008
+ 041523521031451E159AF8A041FEB4F28F88429428A08912B51A54A80F94FEED
+ 940AA258F081CADFA841010D1A10458A1695482B49E15F40298280881435BC02
+ 84040328F33FBF95B50177E6DED99DDD99D9BDDFCF673EBBB0B39BBBB373CE3D
+ E7DC73CE6D448AA8E4FD8913F5FA8307E9686DADEF38C2CF8F1C3A4447F9F03D
+ E2FFF911C4B76C49F149499480473EF0989092E2FB3F1C89FC7CE0E4C98D9CFE
+ 4E0AFB513FAA078170EFFDEC33DAC7C7DE2D5BE8787DBD23E3689C9848A95DBB
+ 52DB6EDD28950FA524BC87FAC15CCC5B85853F0A7ADDAE5D4E0FC7122DD2D27E
+ 540C571417ABFBCCA5A81FC645BC326488BE7DF9729F791E8DC09DE83460005D
+ B778B1BAEF5C82FA211CA474D8307D7B7939D557573B3D1447486CD3863A6567
+ 53DEC285EA3E740875E123C8EB7979BE19DE6BE67CA480DB000BE1EAD252755F
+ 460875A1C3CCCB8306E9DB962D737A189EA4F3A04174FDB265EA1E0D23EAE286
+ 8137F2F3F58D656551EBCB471AC40EBAE7E6D255B367ABFBD566D405B5092CCD
+ 7D3C670ED5ECD8E1D8185A356942CD1B35A284C68D299E1F7124F21177E27933
+ FEFF383E2F911F134E3C07C7F83872FC38D5F381E7DFF2E3515DA7637CD4F371
+ F4C481730EF3E381EFBF77EC3B26A7A753CFD1A3D592A34DA88B1822C59999FA
+ 57959511FB7BCD5890539B36F51D6D59E053F9687BE27924D9C74A60DF77DFD1
+ 5E3CF2B117CFF9F8961544A4382333930A2B2BD53D1C02EAE20501D6E7D7CD9E
+ 4DC78F1D0BDBDFC0ACDD312E8E4E83B043D04F083D667437038BC1AF0CA01CBE
+ E1C79D7C9D8E85513134E6EBD42B3F5FE51B0481BA601658306A94BE61FEFCB0
+ 083E04BE030BF8D9F1F1D4858F347E1EE77261B7C2177CCDBE3C7A94BEE0A38A
+ 95423814021441C68811347CEEDCE8B97061465D2809E6E7E6FA827A767326DF
+ B0387E9690401DA34CE0CD80F0EF6425F0F99123B49D15C2D7FCDC6E10341C51
+ 56161B173404D40532615E4E8EBE65C912DB3E0FFEFBCF1313A90B0B7C2716FC
+ 581178115008DBD942D8CA0AE15FF5F5B6C611BAE6E4D0C8254BD48536405D98
+ 00CC1E30C097B0630710F27359E07B356B4667C7C585FE813100DC8575DF7E4B
+ 9B5821D8E52A20C1287FF97275BF9F82BA200D783E2B4BDF595161CB67C197EF
+ C1829FC133BE9AE98303C2BF812D82F5AC08103BB0838E595934A6A242FD2027
+ 501782595450A0AF2B2909F973DAB31FDF8305BE271F498D1B3BFDB5A28ADAE3
+ C7E96328033E76DB1033E8555040579694C4FCFD1FF317606A9B367A28C53898
+ DD7BB1C0F766131F517C45F8C12AC25A7611D6B13208C5454031D284EAEA9896
+ 8198FDF2CFF5EBA77FBD6A55D0EF87E0F765A1CF6CDE5CCDF60E01ABA0F2F061
+ 5ACDCA201445707ABF7E74F3AA5531290B31F7A5971415E9AB67CE0CFAFD88E4
+ F765A187E0BB3D29275640F2914F11F011CA0A42DFA222CA993933A67ED498FA
+ B2D3D2D2F4604B7121F817B568E19BF55550CF9DC00A8035F0515D5DD08AA045
+ 870E744F5555CCFCC031F1454BB2B3F52FCBCB837A2F0A6CFAF36CAFA2F9DE01
+ 8A00F1810AB608822D5C3A2B3B9B0ACACBA3FE078FFA2F382931510FA669A65F
+ F0B17EAFF02EC8275811A42240D3D307EBEBA35A46A2F6CB059BBE8B593E8B05
+ FF223ED48C1F1DC022F88895002C82608285D19C561C955FEA892E5DF4FD5BB7
+ 5A7E1F9277FEBB65CB8897D62A2203CA96FF72E850504945ADBB74A13BB76E8D
+ 3A7989BA2F34292E4EB75AAD87001F041F7EBE22FA4176211481D54021AA0D1F
+ 3C762CAA64266ABE0C3AEC6E5AB8D0F2FB10D51F80DD6F94B91F53C01578AFB6
+ D6B76A609573870D8B9A4EC651F1251EEFDC593FB06D9BA5F7A00C7730CFFA2A
+ 7B2FB64156E1DB3535964B925B75EE4C776DDBE679F9F1FC17B06AF223B03798
+ 677C15DD573404AB054BD922B012248C0697C0B3830F26CA7F3ACFF6D7A4A450
+ B20AF2290250F3FDF7F4DAC18396AD012FAF127872D0C1D4EBC3D787C9AF5088
+ 587AE890E5D88057FB0D786EC0B37AF7D6ABD6AE953E1F11FEA1C9C9744E4282
+ D343577888CD478ED09B353596560A3AF4EE4DB7AE5DEB2999F2D460ADAEEF2B
+ 935F110AC1B8045ECB17F0CC40A775E8A0D75555499F7F61F3E6F45F49494E0F
+ 5B110560B970E5E1C3D2E77BA9A0C813839C9294A4CB6EB3A54C7E4538B0EA12
+ 603BB3076A6B5D2F5FAE1FA095621EB4E41AD5AA956AD0A138097F1BF24DFCB8
+ 95CDFAADFCFCE77CAF145A5C0A864BF00ABB04B22DC9BC504CE4EAC15959E347
+ 1EFFD5ECEFAB8CBED8E4C0F1E3B48D8FCF5948716CE763CB89E7DFF071EA5D74
+ 330BFFAC205685A04C4A5909C8D613B83D57C0B503D388A4C3AFDDD9DC87F02B
+ 6283AF58D03F64015C81F6E13C1B6346AFB698D7FF5B56004F07B92C0C25B088
+ DD818DEC16C8A2B954D65C3928CD82F0ABF5FDE807FB047CC8B378F909A1DF6E
+ C3EEC4C15A000DB19A2FA0B950DE5C37202B667F768B16D49F0F4574B19167F4
+ 0F21F438B09720CFF876138A05D09015757554CE870C6E74075C35182B01BF2B
+ F8C753F9FCD10384FE25FEED4BD9ACDE61C30C2FC20E0BC00FEA08DE626B4006
+ B705065D3310D9A53E14F3E4B2BFDF353EDEE9212B42640FCFEC10F812F4F80F
+ C306A166D86501F8C132E1829A1AA96222372D11BA6210B2493E58E3BFB6552B
+ EAA8F6D8F32C68E1BD98CDFAB93CDBBF83BDFF1C1A879D16809F9DECB2BC7AE0
+ 8054AE805B92851C1F806C7A2F847F74EBD6AA7EDFA354B070C0C47F958F4336
+ EEFEDB90389E183A75EAE43BBA76ED4AEBD6ADA3952B57063CD76E0BC00FFA0B
+ CCD9BF5F4A09B8216DD8D13F2E5BD803B37FB49AF93DC7376CE2CF62F37E0E0B
+ BD1D91FB86B464E1CDCCCCA45FFDEA57949595455D5898CE3CF34C6AD4200F64
+ C28409F4C8238F047C7F382C003FB004E6B02520E30E385D40E4D81FB652D29B
+ C73EBF4AEDF50E58A79F525747B359F043D9A9A721EDDAB5F3097A7676365D7C
+ F1C5D4B3674F8A17C481CC1440B82C003F880920614806274B891DF9A3569A79
+ A868BF77B053F021F003070EA44B2EB9C427F4DDBB773F697697C1290BC08F95
+ D501A79A8A38A20034C9441FB5CEEF0DFC82FF3C36E90CE173E0C30F1932846E
+ B8E106BAECB2CB8433BC08272D003F56F2043407E431E27F5036D14765F8B91F
+ 44F435BEB96760C38D103EA75FBF7E3EA1CFCBCBA3366DDAD8363EA72D003FB2
+ 19834EE40844F48FC976EF55B9FDEE6711FBB877D5D6069DB4939E9E4E23478E
+ A4FCFC7C3AE79C73C232463758007E5E3F7850AA7620D2DD8623F68764FBF6A3
+ AA0F413FB52D973B415E7E11CFFA4B83D85D0791FB2BAFBCD227F403060CB0EC
+ D35BC52D16801FAC0CC854114672DF8188499926E1F7A39EFFA6D6AD95F0BB10
+ 98FBD3D9D49FCC87D5001F027877DF7DB7CFC46FDEBC79C4C6EC260B00E01ACE
+ DEBF5FAA9F801621D98CC81F91F1FB91E8730BFB7FAA7F9FFB409EFE556CC26E
+ B668EE43F0274E9C48D75D775DD867FB40B8CD0200682AF2BFD5D542251AA9C2
+ A1B0FF01D94C3FA4F8AAFC7EF7F14A7D3D155ADC47CF69C1F7E3360BC0CF1676
+ 0390322C2212998261FD70D9F57ED5C0D37D208B6D6C6D2D3D67A1DEFDB4D34E
+ A369D3A6392EF87EDC6801F8916D341AEEFC80B0FE4A9A84DF8F3DFA0AD8EF57
+ B80704FA86F3AC2F5BA187F5FB5B6FBD951E7AE8214A4E4E767AF83FE2560BC0
+ CFF3EC0AC8B41CD7C228A761FB6099DA7EE5F7BB0F2CEFDD5053235DB08335FC
+ 679F7D96FAF4E9E3F4D07F829B2D00201D0F08637E40583EB4243B5BFFB2BC5C
+ 789ECAF17717C8E6FBBD64D65A6BB6DA205C63C68C7185B91F08B75B0040B666
+ E0ACEC6C2A282FB7FD4287E597D3244C7FE5F7BB8B89EC933E2CB9F945FFFEFD
+ A9B4B4D4E7F3BB19B75B007E64E3015A18E4D5F60F9C9696A6D7EDDA657A0EB6
+ EC1A6363CAA722347EC737E00C49E1BFEFBEFBE8E1871F76EDACDF102F58007E
+ 64E2012DD2D2E89E5DBB6CBDF0B67ED892A2227DF5CC99A6E720C9E776E5F7BB
+ 863B0F1DA2A72422FD30F9E7CD9B4783070F767AC8D278C5020088073CCD4A40
+ D443A06F5111E5CC9C699BDCDAAA003409D35F95F7BA87DB59F89F95107E04FA
+ 5E7FFD755FFEBE97F092050064CB87351BE5D6B60F7AAE5F3FFDEB55AB4CCF51
+ A6BF7BB8956F349935FEC2C2429AC9565DA8A5B94EE0250BC04FC9FEFDF46F41
+ D6ECE9AC906F5EB5CA16D9B54D016812B3FFCD2CFCAAA79FF3C8CEFCE3C68DA3
+ E9D3A73B3DDCA0F19A0500D053F0397605446836C9AE2D1F32B54D1BBD5E3068
+ 55DFEF0ED09F0FEBFC22EEBFFF7E9A32658AD3C30D092F5A0040A67F40224FA6
+ 13AAAB4396DF903F60514181BEAEA4C4F41C24FCDC959AAAAAFC1C660DCF2E97
+ 4874AC45461F72F9BD8E172D008040E0E37BF70A7FA75E050574654949484215
+ B2446A12A6FFF0E464CA484CB4FB3A292C80DD73FBB0F08BBAF3C2E487E91F0D
+ 78D502009B8E1CA1D7241284B4106538A4373F9F95A5EFACA8303D070D3ED0D2
+ 5BE12C39070E089B783CF1C41374C71D77383D54DBF0AA05E047A68148C7AC2C
+ 1A535111B41C87A40034C1EC0F931F81BFB66ACDDF51FE5057477F12A4F8DE76
+ DB6DF4F4D34F3B3D545BF1B20500F6B3B5364B2237400B418E837EA34C5F7F74
+ F4CD565D7D1DE56D3625AF109892175E78212DE7DFD28B4B7D6678DD0200E828
+ BC42A0BC43D957206805A00966FF563CEBFF96677F15F8730EF8FDDD7806D963
+ B2BD36F2F9FFF9CF7FBA3EAF3F18BC6E0100CCFECFF26F784010BBD18294E5A0
+ DE342F2747DFB26489E9392AE3CF794439FEA8E3FFF0C30F7D3BEE4423D16001
+ 00990CC1AE39393472C912CBF21C9402D02466FF3BDAB68DE435529C02FAF85D
+ 2058F283CF0FDF3F1A387AF428FDFDEF7FA7F2F272DAB06103AD5FBF9EB66CD9
+ 6278BE572C003F4FEEDB17162BC0F21B64DA7C21E1A7AF9AFD1D4514F52F2828
+ A0175F7CD1E96186C461B66EDE7BEF3D5AB46891EFD8CF0A4F162F5900008941
+ 4B05564030EDC32C2B004D30FB23E9E79E76ED9CB8468A132C63C1FF8D49D349
+ F8FB5BB76E8D688B6EBBD0D9A259BC7831BDF4D24BB46CD9323A24B9F7DEA978
+ CD0200D3F6EC112607691665DAD2C90B468DD2D7CF9D6B7A0E9A7C5CE8C11B2B
+ 9AF87975357D6A525B3E977F43ECCAE32520F8A848449622CCFB50F19A0500D0
+ 3404CD43CCE8316A140D9F3B575AAE2D2900517F7F95F2EB3CA8EDBFD36456C4
+ 921F7C652F34F40010FC3973E6D0D4A95369E3C68DB67DAE172D00991461ABFB
+ 09489FF85661A1BEA6B8D8F41CB5EEEF2C58F6EBB26F1F551BDC20717C7CB46A
+ 15F5EDDBD7E9A14AF1C1071FF8BA0D9B05F382C58B160090C90BE85358485714
+ 174BC9B6B40210CDFE98F5C7F1EC9FE89199251A1165FC7925F0575353E3AB46
+ 7CE6996742FE2C28BDB39B34A1F39B36A55E7C9CC74737FE77778F96A5637BB1
+ 196C051CB3C90A9096564D10FC534D3E9DA713CFFE46BBF562634E04FEDAB76F
+ EFF4304DF9EB5FFF4AB7DC720B6DDFBE3DA8F7A7B3700F8D8FA70B58083220F0
+ FCEF689B94649A886A92B22D75527166A6FE5565A5E1EB98FDC7B66D4B498D1B
+ 3B7D6D62162CF9E59844FE911073EFBDF73A3D4C43E0EB1715150535EB63561F
+ 9E904043F9E8E3D199DD0A3256C019999954585929946F2905A009667FD5ECC3
+ 79AE397890CA0CF69FC7ECBF73E74E57EDDAD31098FCB9B9B9BE653D5960DA8F
+ 4A4CA4BBD9F2F4AA391F0A324D433409F9169EF0FEC489FADF264F363D47B5FA
+ 7216E4FA77C48C60F0BA9B7DFF6DDBB6D1E5975F2E1DE187E08FE109E76E16FE
+ B3E3E29C1EBE63C8B40EBB64E2441A3879B2A98C0B15C0F4F474BD66C70EC3D7
+ DBB3E0DFAA1A7D3ACA34F607EF33591F5EB972A52BF3FD57AF5E4D393939B467
+ CF1EA9F30B58E8272525D119CAD5F48152E1DD26F91EC9E9E9347EC78ED01480
+ 2630FF07F20F72914AFC719473F7EDA3CD06C1BF1E3D7AD0279F7CE2F4107F02
+ 847FE0C08152997C1D58E05F60F7657094952B878A4C6290269071D317DFC8CF
+ D73F9E3DDBF40F8C4F4D55C13F07A938768C2E32C9817763971F28A4ECEC6CA9
+ DC7DCCFA7FE649A695BAC77E422DBB7ED3D9F533A3677E3E5D357BB6A19C9B2A
+ 80294949FA51130DA3DA7D39CF4D35355462B00B7333F69511FC6BE322170D3E
+ FFC5175F4CDF7CF38DE979C82A9DCDB3FED56AF35853446DC3E259793E505B1B
+ 9C02D004E6BFAAF9779E54F69F8D32FFF2F2F2E8D5575F757A883F02A1472AB2
+ 688DBF1DCFF66FA7A450DF180EF2C922D32B40339173C3175E1E3448DF66B22C
+ 83B5FFBB55DEBFA3A0E63FC32412FCFEFBEFD3A5975EEAF4307D609D1F3EFF72
+ 411BB99F376D4A4BD9AA54813E39900BF0982027A0F3A04174FDB2650105D550
+ 7A35C1ECDF837DB3AB5CBAAE1C2B14B3F6BFC540FBB76BD78E76EFDEEDF4107F
+ 64C68C19347EFC78D37390D0F321CFFCAA89AC35DE603770BD811BE8473390F5
+ A015C0B5ACA5BBAAA8ACA398F9FF575C7105BDF9E69B4E0FD107827E175C7001
+ 1D33A925410A6F45EBD6749A9AF92DF3055FD7398280AA664501BC9E97A76F28
+ 2D35FC30D5F4C31D982DFFB925F517ADBA20FC6635FCF0F92B79E68FE5C49E50
+ 11350BC9C8CBA3AB4B4B7F22EF0115C0B4B434BD6ED72EC30F53A9BFCE83D2DF
+ 36264B4068F6D9BF7F7FA787E933FB61FE1B81C6A4157C2FC5420E7F38111508
+ B5E8D081EEA9AA9253009AC0FC1FCDA69AD2D6CE6256FC03A13AC0AF39DDF20B
+ F5FC08FC998135FE712A912C64B6F0FDF0AA493118D002C87B500AE07E36FF55
+ F4DF59CC6AFFFBF4E9E3EBF5EF24D5D5D5D4BB776FDA6192463E283E9EDE5579
+ 24B620B31AA0C92880D261C3F44D0B171A7EC8993CBB14B005A0709681ACED97
+ 1B24808C1D3B969E7CF24947C777EDB5D752A9491C097EFFBA366D54D0CF464A
+ F6EFA77F9B045ACF1D368CF2162E3C49E67FA200A6B669A3D79BAC2DABC61FEE
+ A08549D0C7E9A69F6BD6ACA15FFCE217A6E7CC4F4951597E36236A1796C80A77
+ 4275B5B902D094FFEF7A4409405F7EF925A5A7A73B36BEA14387D25B6FBD65F8
+ 3AF2FB5F503924B613CC72A02505A0B2FFDCC12BF5F534AAA626E06BE8F9FFF5
+ D75F3B3636ACF9F7ECD9D3F0F54E4D9AD0273C89A80232FB09260E70D23F5E19
+ 3244DFBC78B1E19B95FFEF0E26D4D6D2A3064B3EC3D8CF5BB0608163631B3E7C
+ 382D3489217DC8F7CF25CA820C1BA238C0394386D0758B17FF28F727290051F5
+ 9F6AFBED0ECC0280D83863E2C4898E8CEBD34F3FA58C8C0CC3D755D43FFC88E2
+ 00A756079EA4003481FF7F236BEF8E4A7B3B8E5905E05FFEF2171A3C78B023E3
+ 1245FED5EC1F7EACC601A41580F2FFDD017EE09F99FCC0F0FF1107883498FD7B
+ F5EA6598EF0FC1FF50B98F11E1619E2064E3003F3E11EDFCA39A7FB88345478E
+ D0B0830703BEE66405E0F5D75FEFDBC2CB88F7F9DE19A08AC72282A84948C39D
+ 837E54002FF6EFAFEF58B1C2F04D6AFDDF1D986500C2F4870B1069D0D63B95AD
+ 43A3D93F8B67FF8FD4EC1F31447180F4FEFDE9C6152B4E5600D33A74D0EBAAAA
+ 0CDFA4BAFFB803E4FF2F35D0EED84E6BCA9429111F135A8EDF74D34D86AF2FE1
+ D95F35F48C1CA22E412DD2D2E89E5DBB4E56009A0A007A82D3F7EEA5AAE3C703
+ BE367FFE7CBAE69A6B223E26741D32EAF483FDF8D6B8A827612C20B367807642
+ F6A515C0BDEC5F46DB1E6B5E031B80A49994007FFEF9E7D4B973E7888E09C53E
+ 679D7596E1EB4FB0E53856598E11055B873D2AD86B41B3A20054031077605602
+ 8CEDBF0E1E3C488D22ACA41F7DF451BAEFBEFB02BE067B717B6AAA2AF8710051
+ 8310ADA102106DFFA53200DDC1D4C38791C411F03534FF4013904873FEF9E71B
+ 76FB51893FCE21CA08F46F1BE65300F37373F58D65658627F766136E88EA00E4
+ 38B93CC32F34D80074DCB871347DFAF4888E4794F9F7627232E5272646744C8A
+ 1F587CE810AD35D93CB47B6E2E8D282BFB41013CD3A387BEDBA4671B96FF2E54
+ 5D5B1CA7F3BE7DB4DDA007E04B2FBDE45B8B8F24D8CAFBF6DB6F0FF81ADCC65D
+ 6ACB78C7106D1BD6BE470FBA6DFDFA1F14C0A4C444FDB8495B61D501D879443D
+ 003FFEF8639F391E49468C1841AFBDF65AC0D786252450594A4A44C7A3F80FA2
+ 16618DD9327BB0BEFE0705A00956006E674DAE7AB53BCBDFD89FFB95410A30B6
+ 00430FC0F8082BE9D34F3FDD708BAF67D865BCD562F41FD1EB437CF8B31C603B
+ A0552882895881C21DA852D1E5D8C796E2D36C319AA111C9298007DBB777FAFB
+ C43C33D8A4FB9D8149E7440FC0CD9B3753B76EDD0C5F47F61F76F769CEB7D861
+ 16EA3A3E0EF081C834FE5DC3079C995A7EFC8E8F63F27F9AFCD9284DF9B3FD2A
+ 269E9FE380D2883FF1EFF1ECB6C6720C6292202D5C935100AD78E6BF832D0085
+ B3E4D7D4D0CB066E5A6161213DF7DC73111D4F717131DD7CF3CD4E5F1653A624
+ 25D184188E5D3DC916C001839811D06414C0E94D9BD21895C9E5384800DA6390
+ 01F8F4D34FD36DB7DD16D1F1888A7FDC40AC2B80E7ABABE9EBEFBE337C5D9351
+ 00AA0AD0792AD8FFBFC8A40418E63FDC804872F6D9670B77F9759A585700A2AA
+ 400D0A409404D42D218146A868AEA34C64DFFF618316604EF40044E00F0140B7
+ 13EB0A60FEC183F49941DE08403250A3254545FAEA99330D4F524940CE733E9B
+ 72FF3230E59CF0FFE7CD9B47A3468D72FAB20889750520DA35B86F5111357A23
+ 3F5FFF78F66CE393D43E808E22EA00841D80B113702441F20F9280DC4EAC2B80
+ A5870ED16A936CC09EF9F9D4489406AC1A813ACB53FC03DE6950DB8D02A0AAAA
+ AA88EF01880620C83BA8E7D9A596DD131C757575F42D8F15C7617657F088D771
+ 24262652120B63C303FF87FC85047631F11CDFA5499326BED7F0FF286AC2CEC2
+ DFB1E5E33F8EB0398BA623FE7FE3B3274C98404B972E0D38CE585700A20D4391
+ 0EDCE8E54183F46DCB96199E04E1EFAF148063987500C6CC0F0B2096316B441A
+ EB0AE02316FEF74DD2813B0F1A448D9ECFCAD2775654189E04F3BFAFAAE77684
+ 0327EAFF8D92645E78E105BAF1C61B9D1EA6A398A523C7BA0280F9BFD4A433D0
+ 199999D4E8E98C0C7DCF860D8627A95660CE61B6031070AA03B09B501680311B
+ F8FE596072FFB4CBC8A046D3D3D3F51A932D9CAF4949A173D5268E8E702DFF78
+ F30DA2B8FDFAF5A37FFCE31F4E0FD17194023066D39123F49A410769909C9E4E
+ 8D44BB01ABCD409D017DDD53D9FC3F64D0D5C5C91D80DC845200C6883609C16E
+ C18D26C5C5E9C74D3A87DCCC277568DAD4E9EF127320F037D0A49CD389F25F37
+ A21480313B59AE5F3451008D7962172A00D50DD819B0F4F794C11A6EA74E9DE8
+ 8B2FBE707A88AE4029006344DD817D0A40B900EEC4ACFBCFD8B163E9C9279F74
+ 7A88AE40AD021823E502A820A0FB40DAEFF9264AF9DD77DFA55FFFFAD74E0FD3
+ 15280BC018A920A068197078723265C47053052740E38F1906195CC898DBBB77
+ 6FC4BBFFB815A5008C11ED10E45B062CCECCD4BFAAAC343C4925024516B4C54A
+ 3389FE63E71FEC00A4F801A5008C914A0412A5020FE48B78510C5FC44853CC3F
+ DA2D263F1A36FFC426A08A1F50310063A4528145C5406A57E0C8D2877DFF7506
+ A5BF88FE6FDBB62DE2BBFFB81965011823550CA4CA81DD83A8F3CF238F3C42F7
+ DE7BAFD3C374154A011823550EAC1A82B887913535F4AA41EA6F5C5C9CAFF4B7
+ 8DEACF78124A011823D51044B50473071BD9ECEFC5E6BF514AD6E8D1A3E9E597
+ 5F767A98AE43C5008C916A0986279A6A0AEA3866B33F58B97225656565393D4C
+ D7A12C0063A49A829E78A2DA823B8868F67762E30FAFA0148031B6B405571B83
+ 841FD1EC8F757FACFF2B7E8A5200C6D8B23108505B83850FCCFE192669BF3D7A
+ F4F055FEA9A5BFC0280560CCC37BF6F8CACA8DD0641580DA1C347CE4B09FB6D4
+ C44F5BB060010D1B36CCE961BA16A5000263697350D1F6E0792929748E2A08B2
+ 9D45478ED03093620DE5FB8B510A20309BF9DE2A35B9B74EDA1EFC991E3DF4DD
+ EBD71B9E8C4CC00B63F442860BE4FC9FCBA6FF0E131FCD899EFF5E432980C020
+ 03F03D9334E0F6EC5ADEB67EFD0F0A40940EAC9281EC6702FF388F9AA469AA9E
+ 7F7228051098C5870ED15A932C40A4018F282BFB4101889281CE8C8BA382D6AD
+ 9DFE4E518368D90F38B1E1A717510A203025FBF7D3BF4D3A7D210968E0E4C9FF
+ 092D6B2681C0667CDA3DEDDA39FD9DA20244652F3970805699FC38D8EA1B5B7E
+ 2BC4A84CC0C04CDBB387BE15AC00E0514A01807B590124AAA5A890316BF601D0
+ E77FD3A64D949C9CECF4503D81B2007E0AE24B8FB2023043B3AA005477E0D079
+ FBC811BAC224320BE6CE9D4B23478E74749C2B56ACF0EDBBF7FDF7DFFBF6EB6B
+ F8084EFDBF501EC1A99FDFF06F3424D0FB27B3EB8AF10622561580A81B30D04E
+ 5500D3D2D2F4BA5DBB0CDFA076080A8DAF8E1FA79EFBF651B589593660C000FA
+ E0830F1C1D2736FE4C4D4DF56DC2E975625501885A81B5484BA37B76ED3A5901
+ BCD8BFBFBEC3409302B54B70F0608FBF4BD9EF5F6792978D5E7FEBD6ADA3CE9D
+ 3B3B3A56F8D3F0ABA381585500E57575B4820F23D2FBF7A71B57AC385901BC55
+ 58A8AF292E367C93AA0A0C8E5A16FEFE02E1076EC9F7C766A32525254E0FC316
+ 62550188AA00FB1416D215C5C5272B00A099C401E21A35A2FBD54A802520FCFF
+ C53EFF2A81395DC83FC873CF3DE7F4707DB46FDF9EF60802485E211615005699
+ 1EC38ED2122B00405A0100B54B903C88C4FE8635F1DF04C28F629FCACA4A6AEE
+ 821B75F5EAD5BE04A468211615809500203849018876095271003920FC393CF3
+ 2F3731C300FC7E08FF79E79DE7F4907D4C9A3489FEF0873F383D0CDB88450520
+ F2FFB11BD084EAEAC00AE0952143F4CD8B171BBE5965048A81E975250BFF5281
+ F0376BD68CDE79E71DEADFBFBFD343FE915FFEF297B46AD5AA80AFB5611730B5
+ 7163A7876889DFB1F017C6D8CA952803F09C2143E8BAC58B032B00A009E20077
+ A7A6FA1E153F05C29F5B53438B4DFAB00108FFDB6FBF4D975E7AA9D343FE91DD
+ BB7753C78E1D0D97FFE6A7A4D0D5AA22D4D558F5FF81250500D466A181C152DF
+ 0D870E4909FFA2458B5CB7B71F1A8EDE70C30D015FC3AFBD8B157F2B8F5900B1
+ 86683350A08914808A035807FDFCAFE599DFACB417A0B5775959992B4B7CCD52
+ 6A07C4C7D3FB6A09D8F588360239D5FF073F5100A5C386E99B162E34FC101507
+ 3899297575F4473E447973107E08981BBBFB1CE69B06E6FF7E83D9E391A424BA
+ 27C682695E44E4FF9FCBF75EDEC285E60A0068023700F900B11E07406AEFF53C
+ EB8B22FD00C28F1C7F3724FA04E2C9279FA43BEFBCD3F0F50D3C7374577520AE
+ 067EFFC39205400D094A015CCBE660D718DE9E1A453D37B1BFBF87958008083F
+ 32EB9C2EF031E2282BB06EDDBAD1F6EDDB03BEDEA94913DAA6BA42BB9E60FC7F
+ 1050014CEBD041AFABAA32FCA058DD3014EBFBF7B19FF59449A7958640F867CD
+ 9AE54BAF752B66C13FF03F2D5AD01F55CCC7F588F6016C5800D490800AE0F5BC
+ 3C7D83414008C46283106CDBFD07F6F5AB24667D809D7C5F79E51557EFE6A3B3
+ 42CBC8C8A08D1B37067C1DBFF30E36FF554768F723DA0320232F8FAE2E2D9553
+ 004053CB813ED0B917FDFB360B22FC0D81AF5F5C5CECFAA61E6FBDF5160D1D3A
+ D4F0F5716CE9FD39062D3DAF11ACF90F0C15C0A4B838FDB84944B14762225DE5
+ F21B3C1490C30FC1AFB050178F35FE993367BADAE46F8859E61F54FBB6D4543A
+ 43ADFDBB1ED12EC040B3AA005E1E3448DFB66C99E107466B56E0BFBEFBCEE7E7
+ 8B52794F05453D58E6734B5EBF08341E193870A0E1EB05ACE05F8862051F2DC8
+ 64FF751E3488AE5FB6CC9A02009AC00D88A62E4130A3FEC87E3EF6E8B3DA0B67
+ ECD8B1F4D8638F51BC47564610F9EFD5AB97A1EF0FD4D29F371075FF019A899C
+ 9B2A80294949FA5193CD05A2A14908D6F11FE78B284AE10D44EBD6AD69F6ECD9
+ AECCEC33E381071EA0871F7ED8F0F5DC84047A2D25C5E9612A241035FF884F4A
+ A2076A6B8353006FE4E7EB1FF30D6EC6787603923CE62762396F0ECFF458CEFB
+ 97A0534F20B0BC57545444BFFFFDEFA98DC7B64E5FB3660D6566669AF6FCFB3F
+ FE4E7DD4ECEF7AD070663A9BFF66F42A28A02B4B4A8253004013B8015EDA360C
+ D97B4F1D3E4C252CFC32493CA702C1CFCBCB234DD31CEFDD170C30FD2FB8E002
+ 5A6FB20DDC109EFDDF54B3BF27106DFF0534818C0B15C0F4F474BD66C70EC3D7
+ DBF34C71ABCB674144F2D18BFF4D36F383ED753B78F0609A3A752A9D7FFEF94E
+ 7F9DA079F0C107E94F7FFA93E1EB2D1B35A24D6DDBD2691EB3E8629559D5D5B4
+ DBC4824D4E4FA7F13B7684A60044DB8601B7EE198035FC497575C2869C66A045
+ 16FC6537D5EE07838CE9FF627232E527263A3D548504557C4F3F6752B50BFCDB
+ 7F999D23B586A709DC80BECD9AD160176E1E3AF4E0C1A0827BA06BD7AEBE19DF
+ 8DD57B5641B51F84DFCCF41F141F4FEF7A3CA01B4B88527F812621DF520AA038
+ 3353FFAAB2D2F075E4028C4B4D75DDD661B9AC00165A540068D185CAB8ABAEBA
+ 8A1AB9ECFB0403D27D73727268E9D2A586E7C0F4FF944D7F95F4E30D10C49E21
+ 58FB3F83157E6165A53D0A0068022BC08D0542B2160032F810DCBBEBAEBB3CED
+ E307E28E3BEEA0A79E7ACAF49C67D87ABB354AF239620151E30FA049CAB6B402
+ 989498A81F37493774A315205200D888F3F6DB6FF7F5E5473FFC6863C68C1934
+ 7EFC78D37354B71F6F2133FB378E8BA3078F1DB3570188760E026815D6DF45A5
+ A3660A005B704340BC92BD671551A10F80E9BF8E853F168ABAA205B4FC2E3769
+ FB0D1AEEFC23C2D2742D2A1042F9E85D2EAA0F3053004F3CF184CF3C8E4610F1
+ CFCECEA6432629A210F97758F80744A9028C4630EB3FCEB3FFB736CDFEC092A4
+ 2E18354A5F3F77AEE9396E4A0C325300D3A74FA771E3C6393D44DBD9BC79B34F
+ F8BFF9E61BD3F3D4929FF79049FCE9316A140D9F3B373C0A00C858016E691662
+ B60A108D0A0033FF65975D26DCDB4F75F9F126D3F877359BFD816651A62D2B80
+ F9B9B9FAC6B232D373DC5225184B2EC08A152BE8F2CB2F3735FBC1F53CEBCF56
+ 65BE9E036BFE4B05BF6DF7DC5C1A5156165E050034C19260AB264DE80E173492
+ 8C150580801F9631BF1524865CC2FEE17BECF7BB2546A39047D4F20B6841C873
+ 5077C2BC9C1C7DCB9225A6E7B8C10A888518C0BC79F3A8A0A0C034C5179CC34A
+ B9B2756BB5BB8F0791A9F93F75CF3F59829E0A34092BE0B76DDA383ADB44BB02
+ 78F4D147E9BEFBEE139E87D6DEEFB3D9AF96FBBC0722FFCF56578765F607414B
+ E7EC0103F4EDCB979B9EE3F43662D1EA02D4D4D4F866FD85263B38F939AF6953
+ 5F8EBF4AF3F526A2EDBE41A70103287FF9F2C82A00A009AC00CCFEBF6DDBD631
+ B3D36C15C0AB0AE0934F3EA1DCDC5CDAB2658BF0DC7E3CE3BF9392A2CC7E8FB2
+ 8F677D54FC1DB339F2DF909014C0F35959FACE8A0AD3739C6C1B166D2EC08B2F
+ BEE8EB44240AF60124F8BCC966BFD7BA3529FE83A8DD17E8989545632A2A9C51
+ 00401358016038DF88190E249D448B0B80725E083EB61893015D7DCAF89AAB68
+ BF77D9505F4F0BD8D513A18528C321DF218B0A0AF475821B130141340D8974A1
+ 503458009F7EFAA96F89CFAC96BF21AA9DB7F79149F905A27E7F32D8229153DB
+ B4D1EB05DD499C2817F6B20580FE7D0F3DF490AF298968890F20BEFF47BEBE13
+ 5C9286AD081E9972DF449E50275457872CBFB64DC99A842B10E9D6615EB5002A
+ 2A2AE8A69B6E32EDDBDF900EECE7CF4F49F125FA28BC8D4CAB2FA0D924BBB629
+ 0051D7207026DFA005AD5BDBF5278578AD1600CB7B68352E6AE0D11004FB4AD9
+ E46FA7827D5141C9FEFDF46F81C527DBED47065B9D7251A110886486A0975C00
+ A4F36287A11D261D984F4515F5441732197F40B3516E6D55004B8A8AF4D53367
+ 9A9E83C8F4EDEC0A244760CB692FB800AB57AFF665F32D1724553504B33D0A7A
+ 06AB5AFEA8A1E6FBEFE9698935FFBE4545943373A63B1500989696A6D7EDDA65
+ 7A4EA45C01375B00DBB66DA3FBEFBF9F5E7BED354BEF43F75ED4F2ABCCBEE8E2
+ 7916FEAF05EDEB5BA4A5D13DBB76D92AB3615997D3240282915815709B024087
+ DEFDECE36167A159B3664945F7FD60D67F8CAFD768D5C423EA9089FA032D0CF2
+ 1A160550929DAD7F595E2E3CEFDA56ADA86B18CD5837B900E8D083E0DE4C7691
+ 4435FB3FB94E2CF48FB3F0AB405FF4B199EFCF52BE4F458492EF6F46D8327344
+ 5D8441B313B502E14A5775C32A0072F7B175786969A9A5191FA4376942CFB66C
+ A97CFD28057EFFFFB2E92F4AF869CC13C083F5F56191D5B0A6E66912AEC0E94D
+ 9BD29830ED2DE8940B0053FF9D77DEA169D3A6590AEEF9C16AFE9866CDE8CF3C
+ EBBBA9CDBAC25E64FC7EA085514EC37A77C9B40F03E18A07445A0120671F0D3A
+ D06E5C3689E75490C73FB5450BEAEEC2BD1615F621EBF767E4E5D1D5A5A5DE54
+ 00E0892E5DF4FD5BB70ACF0B473C20523180DDBB77FB7C7B04F6440D398DE8C5
+ 02FF049BFB2A9B2FFAD972F428BD7AE080F0BCD65DBAD09D5BB786554623625F
+ CAC6036EB1393F20DC0A00FEFDE38F3FEEF3EF654A7403816E3D0FF18C7F9D8A
+ EEC704D27EBFC5FEFEC112310753938807B4E759F0A6D6AD6D2B630D870B80F5
+ FB575F7D95E6CF9F2F5DA11708E4EF8F63D7E72EF6F555D96E6C80249F17F6EF
+ A7DD0EFBFD0D89D89D573A6C98BE49A285959D0D44ECEA088425BC3973E6D082
+ 050B68D5AA55218DE9E7ACE4C6B3E08F645F5F097EEC00E1C7729FA8C1073877
+ D830CA5BB830BA140078BC7367FD00CFA022BAB3705C9D9212F2DF0BC50580D0
+ BFF1C61BBEA0DECA952B431E0B32F8EE66C11FA496F46292D7F95EDC28B15375
+ ABCE9DE9AE6DDB222697119F8264E201A02F9BC6835BB60CE96F59550028C479
+ F7DD777D267E30CB77A782705E017F8F3BF95051FDD8051B7AAC9688118573BD
+ DF08476C504D221E0042DD6D58140340A79DF2F2727AEFBDF768D9B265B47DFB
+ 765BBE1F32F66E65A12FE24365EFC53632BBF9FAD11C90474714C0EB7979FA86
+ D252A97343291F365300AD5BB7F6E5E5DB095A7063B647BEBE4AE051C896F782
+ 70AFF71BE1D85D2AB3AF809FBC94143A2721C1F2DF3053007681E5CB1CF6EB61
+ EAAB945D851FD91C7F10AE3C7F191C9DA666F5EEAD57AD5D2B3C0FD172AC0C74
+ B49824132E0580515CC60A69041F57B0D0ABD6DB8A86EC3C76CCD7D25B54DB0F
+ 3AF4EE4DB7AE5DEB981C3A6EA7CA660A62A61DCD66BB959E82762A0008FDC52C
+ EC7958A1E0436DB6A108047AFACD61D75294E8032291E927C2710500A675E8A0
+ D7555509CF8312B8D68225609607200B76D719C93E3D045F05F4146660E6478A
+ AF8CF0B7E8D081EEA9AA725CFE1C1F809F294949FAD1DA5AE1797007B0D1884C
+ 4C20180BA0257F7E36CFF4D92CF8D7B0E0ABCE3B0A1990DF5FC6F79B8CD96F57
+ 4B6F3B70C520FCC8E6080099D5011905005B229385FD372CF4E8B09BA58A7114
+ 16B112ED7762ADDF0CD70CC48F4C67613FA23C01230580CABB5FB3B00FE403D5
+ 776AC94E112C56D6F92355E06305570DC68F26992804CC3206FD3100E4DF0FE0
+ 8B3FE08469AF02780A3B90CDF0F3A3B950DE5C37203F9A052560543BB0E6BBEF
+ E84C167615BC53D88D6C6EBF1FCDA5B2E6CA41F9B1E20EA08A100943AAC24E11
+ 4EEA75DD27FC32557DC08D667F435C3B303F560283E827701D2B81486C3AA288
+ 3D6A8F1FA7B9070E48D5F303B705FC02E1EAC1F991D97DD80F7205AE642510CE
+ 76E38AD803A9BD6FD6D448ADF103372DF599E1FA01FA914D16F2E3C476E48AE8
+ 44B681A71FB724F9C8E08941FA914D1BF6832DC89034A45C024530A07FDF029E
+ F545BBF536C40DE9BD56F0CC40FDC81610F9814B3054327350A1F083CCBE4507
+ 0F4A9BFCC0E9C29E60F0D460FD582925F663478721456C60D5E4074E96F48682
+ E706ECC74A53113F7009AE4A495189408A80C0E47F8D677D99DD7A1AE254330F
+ 3BF0E4A01B62255700204F60705252D05D8614D109F2F997F2CC2F53CCE3C7ED
+ 6BFC32787AF07E64BB0D3704D6005C022BFD0514D107EAF791D26B25D00722DD
+ BD375C78FE0BF891DD77E054101BC072A1CA208C2D30D3C3D7B792CBEF27927D
+ FBC34D547C898658750900560AFE9BAD810CB53D574CB0A1BE9EFEC2B3BE9508
+ 3FF042669F55A2EACBF8B19A2FE007F5044392935590304AD9F7FDF7BE59FFB3
+ 20BA44796D7D5F96A8FB427E64B7263F15B80259CD9BD3457C28B7203A80B9FF
+ D1E1C354C18795209F9FEEB9B934A2AC2C2A6F86A8FC520DB1524CD490564D9A
+ D0C0162D945BE07110DD5FC1827F80677FAB44A3C97F2A51FDE5FC946467EB5F
+ 969707F55E280258047DD5B2A1A74070AF2248C1075E4DECB14AD47FC1864C4B
+ 4BD3EB76ED0AEABD500417B012E8ABB6F3762D30EF21F8FFC747B082EFA5421E
+ 3B88992FEA67495191BE7AE6CCA0DF8F1583BE6C1164F2A17A09BA0334E958C5
+ B3FD3FF8B01AD96F48DFA222CA993933A67ED498FAB20D29CECCD4BFAAAC0CFA
+ FDB002600D5CDCA28552040E01C1FF7B5D9D6FD60F26B8E7E7F47EFDE8E655AB
+ 62F2478CC92FDD102BCD46020145D02B31917AB3325059859101D97B6B59E8D7
+ D5D78724F85E69DA114E62FACBFB595450A0AF2B2909F973D092EC7C560638D4
+ 7E81F682765C9FB0C0E3906DC96546AF8202BAB2A424E6EFFF98BF000D793E2B
+ 4BDF595161CB6721A9A84742826F1951050D8303B33B5A71AD61A1976DC229A2
+ 6356168DA9A8503FC809D485084030FD068C80F09FCB8A00D58767AB5D87A440
+ 338E7FB1D06F62E10FC5C46F48AC2CEB59455D10135E193244DFBC78B16D9F87
+ 1504C40ACE62EBA0132B036519FC00847CFBB163B495051EC21FEC125E20BAE6
+ E4D0C8254BD48536405D18099056FCD99B6F92D52223112849C6F133B6103A36
+ 6D1A330A0102BF93FDF8CF59E0B7B3C0EF6181B76BA607A8D3EF367468D4A6EF
+ DA89BA401658306A94BE61FE7CDB150180F0631501B1832E7CA4459942F882AF
+ D9972CECF0E511C5B753E0FD40F033468CA0E173E746CF850B33EA4205C15B85
+ 85FABA397328981A035920FC1DF9863E8D15018E56AC14DAF2FFB93DE7006BF3
+ 30E1AB58E0F7F2E3372CEC3BF9793804DE0F04BF577E3E5D515CECEE8BE342D4
+ 050B9150138AAC8238422A2B041C6D9B34A176FC8823D225CC28ADDDC7C20D21
+ C7F3BD78CE4728997856392333930A2B2BD53D1C02EAE2D9C4FB1327EA1FB355
+ 50B36387237F1F16430B5602CDF931811FE3F9B1393F363DF15AB313FF877588
+ 447E8E73A04CBE6381854373E4F871AAE703CF8FF2FF7D8BE7FC8815F7C3FC1C
+ FF87730E9F98E19D22393D9D7A8E1E4D03274F56F7AE0DA88B1806DEC8CFF7F5
+ 22385A5BEBF450A282F8A4243AEFEAAB55E24E18501734CCBC3C6890BEBDBC3C
+ 2C81C368067E7DA7EC6CBA7ED932758F861175712308F6328032B0B2C7612C81
+ 525C08BD577BEC7B1175A11D04F9055F7CF00185528CE465508C03818F960EBB
+ 5E445D781781CCC31D1F7D14B50A01029F7ED14574DDE2C5EABE7309EA877031
+ C837D8B7650BEDDDB4C9736E438BB4344AEDDE9DDA76EDAAD6E75D8CFA613C08
+ 961CF77EF619EDE3632F2B887026249981A699A92CE06DBB75A3543ED4D29CF7
+ 503F58940225517FF0201DABABA323870ED1117E8E65C9233535BE7FE3F9517E
+ 04F12D5BFA96DA12F8312139F987E72929BE7FC7A1E3113F57C21D9DFC3FB05B
+ 459D4B95757A0000000049454E44AE4260822800000030000000600000000100
+ 0800000000000000000000000000000000000000000000000000000000000202
+ 04000505070004040B0003030E0004040D0008080B000A0A0E000C0C0E000404
+ 1200050514000C0C100006061A0006061D001111160015151A00060621000707
+ 280007072C001B1B20001D1D22000808350008083B0022222800242429002828
+ 2E002E2E2F0036363A0039393D003C3C3C000808470008084B0008084D000707
+ 50000808530008085A0008085F003E3E42000909660009096A000A0A71000A0A
+ 76000B0B79000B0B7D004343470044444700464649004A4A4C00535354005757
+ 57005B5B5D00666667007171710077777700787878007D7D7D00000080000606
+ 83000B0B8100090984000C0C85000404890005058F000C0C890016168B001717
+ 8C00070790000D0D91000D0D96000606990006069D000D0D9900222291003434
+ 9A003E3E9E000707A3000E0EA0000E0EA6000707A9000909B1000F0FB2000909
+ B5001010B4001010BA005050A7005757AB007272B8000E0ECE001111C2001111
+ C9001212D1001212D6001010DA001010DE001313E1001414E3001212E6001414
+ E7001414E9001515EE001414F3001515F5001616FA001515FE00808080008A8A
+ 8A008D8D8D00929292009A9A9A009E9E9E00A1A1A100A7A7A700AAAAAA00B0B0
+ B000BDBDBD00C9C9C900D0D0D000D7D7D700D9D9D900DDDDDD00E2E2E200E5E5
+ E500EBEBEB00EDEDED00F1F1F100F5F5F500F9F9F900FEFEFE00000000002F26
+ 000050410000705B000090740000B08E0000CFA90000F0C30000FFD21100FFD8
+ 3100FFDD5100FFE47100FFEA9100FFF0B100FFF6D100FFFFFF00000000002F14
+ 00005022000070300000903E0000B04D0000CF5B0000F0690000FF791100FF8A
+ 3100FF9D5100FFAF7100FFC19100FFD2B100FFE5D100FFFFFF00000000002F03
+ 0000500400007006000090090000B00A0000CF0C0000F00E0000FF201200FF3E
+ 3100FF5C5100FF7A7100FF979100FFB6B100FFD4D100FFFFFF00000000002F00
+ 0E00500017007000210090002B00B0003600CF004000F0004900FF115A00FF31
+ 7000FF518600FF719C00FF91B200FFB1C800FFD1DF00FFFFFF00000000002F00
+ 20005000360070004C0090006200B0007800CF008E00F000A400FF11B300FF31
+ BE00FF51C700FF71D100FF91DC00FFB1E500FFD1F000FFFFFF00000000002C00
+ 2F004B0050006900700087009000A500B000C400CF00E100F000F011FF00F231
+ FF00F451FF00F671FF00F791FF00F9B1FF00FBD1FF00FFFFFF00000000001B00
+ 2F002D0050003F007000520090006300B0007600CF008800F0009911FF00A631
+ FF00B451FF00C271FF00CF91FF00DCB1FF00EBD1FF00FFFFFF00000000000800
+ 2F000E005000150070001B0090002100B0002600CF002C00F0003E11FF005831
+ FF007151FF008C71FF00A691FF00BFB1FF00DAD1FF00FFFFFF00000000000000
+ 0000000000000000000000000056554A483B3B484A5556000000000000000000
+ 0000000000000000000000000000000000000000000000000000543B383D4246
+ 4F52534E4B4339383B5400000000000000000000000000000000000000000000
+ 00000000000000003B393D505E676666666666666667665E513D383C00000000
+ 0000000000000000000000000000000000000000000040384B5E676766666666
+ 666666666666666666665F4D3841000000000000000000000000000000000000
+ 000000004938475F66666666666666666666666666666666666667675E453849
+ 0000000000000000000000000000000000000041395767676767666666666666
+ 66666666666666666666666666665A3941000000000000000000000000000000
+ 0000394261676767676767676666666666666666666666666666666666676761
+ 423B0000000000000000000000000000003846652923475F6767676767676766
+ 6666666666666666666666666666666666463800000000000000000000000000
+ 394C6667240807011F5266676767676666666666666666666666666666666667
+ 6766463900000000000000000000004142656767242E7E6F25000C2B63676767
+ 6766666666666666666666666666666666666642410000000000000000004939
+ 62666767242E8F8F8F77360E0A47666766666666666666666666666666666666
+ 6667676139490000000000000000385767676666262E8F8F8F8F8F7C34011662
+ 67676766666666666666666666666666666666665A3800000000000000414766
+ 66666767242E8F8F8F8F8F8F8F7414105B676666666666666666666666666666
+ 66666667674541000000000000385D6767666666262E8F8F8F8F8F8F8F8F7A1C
+ 055B676767666666666666666666666666666666665F3800000000003B4D6666
+ 66666667241A7B8F8F8F8F8F8F8F8F7E1B126567676767666666666666666666
+ 6666666767674B3C00000000385E6767666666664D0C08347A7F8F8F8F8F8F8F
+ 790B26676767676767676766666666666666666666665F380000005442666666
+ 666666666666430C026D8F8F8F8F8F8F8F70005E676767676767676766666666
+ 666666666767673D5400003B4F67676666666666666666663C02688F8F8F8F8F
+ 8F7F0F2A67676767676767676767676666666666666666503B0000385E666666
+ 6666666666666666674C01327F8F8F8F8F8F360C44444444444444475B666666
+ 666666666667675C38005638676767666666666666666666666658026D8F8F8F
+ 8F8F75080B0707080B0808004467676666666666666666673956554366666666
+ 6666666666666666666767270F7D8F8F8F8F8F8F8F8F8F8F8F8F8F0B47666666
+ 666666666666676742554A466767666666666666666666666666666306688F8F
+ 8F8F8F8F8F8F8F8F8F8F8F0B446767666666666666666667464A484E67666666
+ 6666666666666666666667673C06798F8F8F8F8F8F8F8F8F8F8F8F0B47666666
+ 66666666666767674E483B5167676766666666666666666666666666660B698F
+ 8F8F8F8F8F8F8F8F8F8F8F08446767666666666666666666533B3B5366666666
+ 66666666666666666666666767222F8F8F8F8F8F8F8F8F8F8F8F8F0847666666
+ 6666666666666767513B484E6767676666666666666666666666666666440B8F
+ 8F8F8F8F712D2C2D2D2E2E024467666666666666666666674E484A4667676666
+ 666666666666666666666667675A00748F8F8F8F730022262627272759666666
+ 6666666666676767464A5542676767666666666666666666666666666667076B
+ 8F8F8F8F7F0E2A67676766666666666666666666666666674355563966676666
+ 666666666666666666666667676720308F8F8F8F8F370A656766666666666666
+ 6666666666676767385600385C6767676766666666666666666666666666400E
+ 8F8F8F8F8F79023F6767676766666666666666666666675B3800003B4F676767
+ 66666666666666666666666666675A00738F8F8F8F8F69015267676666666666
+ 666666666767674F3B0000543D67676767666666666666666666666666666610
+ 687F8F8F8F8F8F330359676767676666666666666667663D54000000385E6767
+ 66666666666666666666666666676727198F8F8F8F8F8F7F2E01285F67666666
+ 6666666767675D38000000003C4B67676767666666666666666666666666665A
+ 026E8F8F8F8F8F8F7F6C0E000C3C66666666666667674B3C0000000000385E67
+ 67666666666666666666666666666767280B798F8F8F8F8F8F8F7E721D1F6666
+ 66676767675D3800000000000040456767676767666666666666666666666666
+ 66111D7C8F8F8F8F8F8F8F8F331E67666667676767454100000000000000385A
+ 67676766666666666666666666666666675B0D18778F8F8F8F8F8F8F331E6767
+ 6767676757380000000000000000493861676767676766666666666666666666
+ 666663150E6A7E8F8F8F8F8F331E676767676761384900000000000000000041
+ 3E656767676666666666666666666666666667662A021469768F8F8F331E6767
+ 6767643E41000000000000000000000039466767676767676666666666666666
+ 666666666661260C02183672311E676767674639000000000000000000000000
+ 00384665676767676766666666666666666666666666666658281100001E6767
+ 644638000000000000000000000000000000393E606767676767676767666666
+ 6666666666666666666667635958676142390000000000000000000000000000
+ 0000004138576767676767676767676767676767676767676767676767675738
+ 41000000000000000000000000000000000000004938455D6767676767676767
+ 6767676767676767676767675D45384900000000000000000000000000000000
+ 00000000000040384B5D676767676767676767676767676767675D4B38400000
+ 0000000000000000000000000000000000000000000000003B383D4F5C676767
+ 676767676767675C4F3D383B0000000000000000000000000000000000000000
+ 00000000000000000000543B38383E464E51514E464238383B54000000000000
+ 000000000000000000000000000000000000000000000000000000000056554A
+ 483B3B484A555600000000000000000000000000000000000000FFFFE007FFFF
+ 0000FFFF0000FFFF0000FFFC00003FFF0000FFF000000FFF0000FFC0000003FF
+ 0000FF80000001FF0000FF00000000FF0000FE000000007F0000FC000000003F
+ 0000F8000000001F0000F0000000000F0000F0000000000F0000E00000000007
+ 0000E000000000070000C000000000030000C000000000030000800000000001
+ 0000800000000001000080000000000100000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000800000000001000080000000000100008000000000010000C00000000003
+ 0000C000000000030000E000000000070000E000000000070000F0000000000F
+ 0000F0000000000F0000F8000000001F0000FC000000003F0000FE000000007F
+ 0000FF00000000FF0000FF80000001FF0000FFC0000003FF0000FFF000000FFF
+ 0000FFFC00003FFF0000FFFF0000FFFF0000FFFFE007FFFF0000280000002000
+ 0000400000000100080000000000000000000000000000000000000000000000
+ 000000000000030305000B0B14000C0C16000E0E1D0012121F000F0F22001313
+ 220017172300101024001919270012122D0014142F00191928001D1D29001E1E
+ 2F001313340014143A0012123C0015153F00222231002A2A3A002C2C39003131
+ 3D001212450010104B001616480012124E0013135200323243003A3A46001717
+ 660012126A001414690012126E000F0F7D001111700013137E00454554004B4B
+ 570050505E005E5E6A0063636F00676772006D6D77007373780078787F000606
+ 8400090987000A0A88000E0E8E0012128E0015158E000D0D95000E0E9D001010
+ 92001919910010109A0010109C002E2E9B0031319F000E0EA8001010A3001010
+ A6000F0FB7001010BA001010BF006262B4007A7ABE000D0DC2001212CE000F0F
+ D0001212D1001010DA001212E7001414E7001414E9001313EE001414EC001414
+ F1001414F5001616FB001616FE00808085008C8C8F00969699009E9E9F00A0A0
+ A100AEAEAE00B7B7B700BEBEBE00D6D6D600DADADA00E2E2E200E4E4E400E9E9
+ E900EEEEEE00F0F0F000F6F6F600F8F8F800FEFEFE004CB0000059CF000067F0
+ 000078FF11008AFF31009CFF5100AEFF7100C0FF9100D2FFB100E4FFD100FFFF
+ FF0000000000262F0000405000005A700000749000008EB00000A9CF0000C2F0
+ 0000D1FF1100D8FF3100DEFF5100E3FF7100E9FF9100EFFFB100F6FFD100FFFF
+ FF00000000002F26000050410000705B000090740000B08E0000CFA90000F0C3
+ 0000FFD21100FFD83100FFDD5100FFE47100FFEA9100FFF0B100FFF6D100FFFF
+ FF00000000002F1400005022000070300000903E0000B04D0000CF5B0000F069
+ 0000FF791100FF8A3100FF9D5100FFAF7100FFC19100FFD2B100FFE5D100FFFF
+ FF00000000002F030000500400007006000090090000B00A0000CF0C0000F00E
+ 0000FF201200FF3E3100FF5C5100FF7A7100FF979100FFB6B100FFD4D100FFFF
+ FF00000000002F000E00500017007000210090002B00B0003600CF004000F000
+ 4900FF115A00FF317000FF518600FF719C00FF91B200FFB1C800FFD1DF00FFFF
+ FF00000000002F0020005000360070004C0090006200B0007800CF008E00F000
+ A400FF11B300FF31BE00FF51C700FF71D100FF91DC00FFB1E500FFD1F000FFFF
+ FF00000000002C002F004B0050006900700087009000A500B000C400CF00E100
+ F000F011FF00F231FF00F451FF00F671FF00F791FF00F9B1FF00FBD1FF00FFFF
+ FF00000000001B002F002D0050003F007000520090006300B0007600CF008800
+ F0009911FF00A631FF00B451FF00C271FF00CF91FF00DCB1FF00EBD1FF00FFFF
+ FF000000000008002F000E005000150070001B0090002100B0002600CF002C00
+ F0003E11FF005831FF007151FF008C71FF00A691FF00BFB1FF00DAD1FF00FFFF
+ FF00000000000000000000000000433C382F2F383C4300000000000000000000
+ 000000000000000000000043313945494A50504A494539314300000000000000
+ 0000000000000000004431404F525252525252525252524F4031440000000000
+ 00000000000000003B3F4F52525252525252525252525252524D3F3B00000000
+ 0000000000000034414952525252525252525252525252525252524234000000
+ 00000000000034474B0110324B52525252525252525252525252525247340000
+ 00000000003B42524B0F5C2E0A1A485252525252525252525252525252423B00
+ 00000000443F52524B0F6F6F6F5A0A3352525252525252525252525252523F44
+ 00000000314D52524B0F6F6F6F6F6127184B5252525252525252525252524D31
+ 00000043405252524B08626F6F6F6F6F55125252525252525252525252525240
+ 430000314F52525250220553636F6F6F6F2B255252525252525252525252524F
+ 300000395252525252524E2017606F6F6F610451525252525252525252525252
+ 390043455252525252525252370E616F6F6F281B1F1F1F1F2452525252525252
+ 45433C49525252525252525252232C6F6F6F5E59595959590352525252525252
+ 493C384A52525252525252525250065D6F6F6F6F6F6F6F6F0352525252525252
+ 4A382F505252525252525252525236296F6F6F6F6F6F6F6F0352525252525252
+ 502F2F50525252525252525252524E0D6F6F6F615B5C5B5B0352525252525252
+ 502F384A52525252525252525252520B5F6F6F5B011313131952525252525252
+ 4A383C49525252525252525252525221586F6F6F144952525252525252525252
+ 493C434552525252525252525252523D2A6F6F6F542452525252525252525252
+ 4543003952525252525252525252524E0D6F6F6F63163E525252525252525252
+ 390000304F5252525252525252525252115C6F6F6F5F0E21465252525252524F
+ 300000434052525252525252525252523E266F6F6F6F6257151C525252525240
+ 43000000314D52525252525252525252521B53646F6F6F6F610C525252524D31
+ 00000000443F52525252525252525252524E1C1E5F6F6F6F610C525252523F44
+ 00000000003B425252525252525252525252523A0756616F610C525252423B00
+ 00000000000034475252525252525252525252524922091D2D0C525247340000
+ 0000000000000034425252525252525252525252525252483532524234000000
+ 00000000000000003B3F4D52525252525252525252525252524D3F3B00000000
+ 0000000000000000004431404F525252525252525252524F4031440000000000
+ 000000000000000000000043303945494A50504A494539304300000000000000
+ 0000000000000000000000000000433C382F2F383C4300000000000000000000
+ 0000FFF00FFFFF8001FFFE00007FFC00003FF800001FF000000FE0000007C000
+ 0003C00000038000000180000001800000010000000000000000000000000000
+ 000000000000000000000000000000000000800000018000000180000001C000
+ 0003C0000003E0000007F000000FF800001FFC00003FFE00007FFF8001FFFFF0
+ 0FFF280000001000000020000000010008000000000000000000000000000000
+ 00000000000000000000000000003F3F69002A2A720044447700272784002323
+ 8F002C2C8F003535870033338C0035358E002A2A91002D2D910023239A001F1F
+ A1001F1FB1001C1CBF002323A0002525A4003333BE0040408700515181005555
+ 86005F5F80006363870062628E0066668E00696989004747B4004A4ABC001515
+ C3001515D4001919D6002828C5001717E5001515F3001515FA001616FE006969
+ C1007E7EC8009797AA00AFAFBB00BABAC700C2C2C800CDCDD400D1D1D300D5D5
+ D800DDDDE000E4E4E500F1F1F100F9F9F900FFFFFF0000704C000090630000B0
+ 790000CF8F0000F0A60011FFB40031FFBE0051FFC80071FFD30091FFDC00B1FF
+ E500D1FFF000FFFFFF0000000000002F0E00005018000070220000902C0000B0
+ 360000CF400000F04A0011FF5B0031FF710051FF870071FF9D0091FFB200B1FF
+ C900D1FFDF00FFFFFF0000000000022F00000450000006700000089000000AB0
+ 00000BCF00000EF0000020FF12003DFF31005BFF510079FF710098FF9100B5FF
+ B100D4FFD100FFFFFF0000000000142F000022500000307000003D9000004CB0
+ 000059CF000067F0000078FF11008AFF31009CFF5100AEFF7100C0FF9100D2FF
+ B100E4FFD100FFFFFF0000000000262F0000405000005A700000749000008EB0
+ 0000A9CF0000C2F00000D1FF1100D8FF3100DEFF5100E3FF7100E9FF9100EFFF
+ B100F6FFD100FFFFFF00000000002F26000050410000705B000090740000B08E
+ 0000CFA90000F0C30000FFD21100FFD83100FFDD5100FFE47100FFEA9100FFF0
+ B100FFF6D100FFFFFF00000000002F1400005022000070300000903E0000B04D
+ 0000CF5B0000F0690000FF791100FF8A3100FF9D5100FFAF7100FFC19100FFD2
+ B100FFE5D100FFFFFF00000000002F030000500400007006000090090000B00A
+ 0000CF0C0000F00E0000FF201200FF3E3100FF5C5100FF7A7100FF979100FFB6
+ B100FFD4D100FFFFFF00000000002F000E00500017007000210090002B00B000
+ 3600CF004000F0004900FF115A00FF317000FF518600FF719C00FF91B200FFB1
+ C800FFD1DF00FFFFFF00000000002F0020005000360070004C0090006200B000
+ 7800CF008E00F000A400FF11B300FF31BE00FF51C700FF71D100FF91DC00FFB1
+ E500FFD1F000FFFFFF00000000002C002F004B0050006900700087009000A500
+ B000C400CF00E100F000F011FF00F231FF00F451FF00F671FF00F791FF00F9B1
+ FF00FBD1FF00FFFFFF00000000001B002F002D0050003F007000520090006300
+ B0007600CF008800F0009911FF00A631FF00B451FF00C271FF00CF91FF00DCB1
+ FF00EBD1FF00FFFFFF000000000008002F000E005000150070001B0090002100
+ B0002600CF002C00F0003E11FF005831FF007151FF008C71FF00A691FF00BFB1
+ FF00DAD1FF00FFFFFF000000000000251C12121C250000000000000000262023
+ 2424242423202600000000001B0D0E23242424242424211B0000002621092C17
+ 112424242424242126000020240832322B0724242424242420002523241F032E
+ 32280F242424242423251C24242424042D321A1515102424241C122424242424
+ 143232323206242424121224242424240B313016180C242424121C2424242424
+ 1D2A321324242424241C25232424242424153229052224242325002024242424
+ 240C2E322F012424200000262124242424240A2731192421260000001B212424
+ 2424241E0A02211B000000000026202324242424232026000000000000000025
+ 1C12121C250000000000F81F0000E0070000C003000080010000800100000000
+ 000000000000000000000000000000000000000000008001000080010000C003
+ 0000E0070000F81F0000}
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ OnResize = FormResize
+ PixelsPerInch = 96
+ TextHeight = 13
+end
diff --git a/libsrc/Swf2Exe/uMain.pas b/libsrc/Swf2Exe/uMain.pas
index 178fbec17..eba13dc1d 100644
--- a/libsrc/Swf2Exe/uMain.pas
+++ b/libsrc/Swf2Exe/uMain.pas
@@ -1,94 +1,94 @@
-unit uMain;
-
-interface
-
-uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, StdCtrls, ExtCtrls;
-
-type
- TfrmMain = class(TForm)
-
- procedure FormCreate(Sender: TObject);
- procedure FormResize(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
-type
- TMySWF = class(TShockwaveFlash)
- public
- procedure CreateWnd; override;
- end;
-
-var
- frmMain: TfrmMain;
- flaPreview: TMySWF;
-
-implementation
-
-{$R *.dfm}
-
-procedure TMySWF.CreateWnd;
-begin
- inherited;
-end;
-
-procedure TfrmMain.FormCreate(Sender: TObject);
-const
- exeSize = 470016;
-var
- stream: TFileStream;
- buffer: array of byte;
- tempFile: array[0..MAX_PATH - 1] of char;
- tempPath: array[0..MAX_PATH - 1] of char;
- flashVarData: TVarData;
- Width: integer;
- Height: integer;
- scaleMode: byte;
-begin
- flaPreview := TMySWF.Create(frmMain);
- flaPreview.Parent := frmMain;
- flaPreview.Anchors := [akLeft, akRight, akTop, akBottom];
- flaPreview.Align := alClient;
- GetTempPath(MAX_PATH, TempPath);
- if GetTempFileName(TempPath, PAnsiChar('ffd'), 0, TempFile) = 0 then
- raise Exception.Create('GetTempFileName API failed. ' +
- SysErrorMessage(GetLastError));
- try
- stream := TFileStream.Create(ParamStr(0), fmOpenRead);
- stream.Seek(exeSize, soBeginning);
- stream.Read(Width, 4);
- stream.Read(Height, 4);
- stream.Read(scaleMode, 1);
- SetLength(buffer, stream.Size - exeSize);
- try
- stream.Read(buffer[0], Length(buffer));
- finally
- stream.Free;
- end;
- except
- Width := 12800;
- Height := 9600;
- scaleMode := 3;
- end;
- ClientWidth := Width div 20;
- ClientHeight := Height div 20;
- stream := TFileStream.Create(tempFile, fmOpenWrite);
- try
- stream.Write(buffer[0], Length(buffer));
- finally
- stream.Free;
- end;
- flaPreview.Movie := tempFile;
- flaPreview.ScaleMode := scaleMode;
-end;
-
-procedure TfrmMain.FormResize(Sender: TObject);
-begin
- flaPreview.CreateWnd;
-end;
-
-end.
+unit uMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, StdCtrls, ExtCtrls;
+
+type
+ TfrmMain = class(TForm)
+
+ procedure FormCreate(Sender: TObject);
+ procedure FormResize(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+type
+ TMySWF = class(TShockwaveFlash)
+ public
+ procedure CreateWnd; override;
+ end;
+
+var
+ frmMain: TfrmMain;
+ flaPreview: TMySWF;
+
+implementation
+
+{$R *.dfm}
+
+procedure TMySWF.CreateWnd;
+begin
+ inherited;
+end;
+
+procedure TfrmMain.FormCreate(Sender: TObject);
+const
+ exeSize = 470016;
+var
+ stream: TFileStream;
+ buffer: array of byte;
+ tempFile: array[0..MAX_PATH - 1] of char;
+ tempPath: array[0..MAX_PATH - 1] of char;
+ flashVarData: TVarData;
+ Width: integer;
+ Height: integer;
+ scaleMode: byte;
+begin
+ flaPreview := TMySWF.Create(frmMain);
+ flaPreview.Parent := frmMain;
+ flaPreview.Anchors := [akLeft, akRight, akTop, akBottom];
+ flaPreview.Align := alClient;
+ GetTempPath(MAX_PATH, TempPath);
+ if GetTempFileName(TempPath, PAnsiChar('ffd'), 0, TempFile) = 0 then
+ raise Exception.Create('GetTempFileName API failed. ' +
+ SysErrorMessage(GetLastError));
+ try
+ stream := TFileStream.Create(ParamStr(0), fmOpenRead);
+ stream.Seek(exeSize, soBeginning);
+ stream.Read(Width, 4);
+ stream.Read(Height, 4);
+ stream.Read(scaleMode, 1);
+ SetLength(buffer, stream.Size - exeSize);
+ try
+ stream.Read(buffer[0], Length(buffer));
+ finally
+ stream.Free;
+ end;
+ except
+ Width := 12800;
+ Height := 9600;
+ scaleMode := 3;
+ end;
+ ClientWidth := Width div 20;
+ ClientHeight := Height div 20;
+ stream := TFileStream.Create(tempFile, fmOpenWrite);
+ try
+ stream.Write(buffer[0], Length(buffer));
+ finally
+ stream.Free;
+ end;
+ flaPreview.Movie := tempFile;
+ flaPreview.ScaleMode := scaleMode;
+end;
+
+procedure TfrmMain.FormResize(Sender: TObject);
+begin
+ flaPreview.CreateWnd;
+end;
+
+end.
diff --git a/libsrc/avi/build.xml b/libsrc/avi/build.xml
index f35d65806..e133552c6 100644
--- a/libsrc/avi/build.xml
+++ b/libsrc/avi/build.xml
@@ -1,73 +1,73 @@
-
-
-
-
-
-
-
-
-
-
- Builds, tests, and runs the project avi.
-
-
-
+
+
+
+
+
+
+
+
+
+
+ Builds, tests, and runs the project avi.
+
+
+
diff --git a/libsrc/avi/nbproject/build-impl.xml b/libsrc/avi/nbproject/build-impl.xml
index d2730e2c3..e108c2960 100644
--- a/libsrc/avi/nbproject/build-impl.xml
+++ b/libsrc/avi/nbproject/build-impl.xml
@@ -1,1413 +1,1413 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set src.dir
- Must set test.src.dir
- Must set build.dir
- Must set dist.dir
- Must set build.classes.dir
- Must set dist.javadoc.dir
- Must set build.test.classes.dir
- Must set build.test.results.dir
- Must set build.classes.excludes
- Must set dist.jar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- No tests executed.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must set JVM to use for profiling in profiler.info.jvm
- Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- To run this application from the command line without Ant, try:
-
- java -jar "${dist.jar.resolved}"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set debug.class
-
-
-
-
- Must select one file in the IDE or set debug.class
-
-
-
-
- Must set fix.includes
-
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set profile.class
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
-
-
-
-
- This target only works when run from inside the NetBeans IDE.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
-
- Must select some files in the IDE or set test.includes
-
-
-
-
- Must select one file in the IDE or set run.class
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set javac.includes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Some tests failed; see details above.
-
-
-
-
-
-
-
-
- Must select some files in the IDE or set test.includes
-
-
-
- Some tests failed; see details above.
-
-
-
- Must select some files in the IDE or set test.class
- Must select some method in the IDE or set test.method
-
-
-
- Some tests failed; see details above.
-
-
-
-
- Must select one file in the IDE or set test.class
-
-
-
- Must select one file in the IDE or set test.class
- Must select some method in the IDE or set test.method
-
-
-
-
-
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
- Must select one file in the IDE or set applet.url
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set src.dir
+ Must set test.src.dir
+ Must set build.dir
+ Must set dist.dir
+ Must set build.classes.dir
+ Must set dist.javadoc.dir
+ Must set build.test.classes.dir
+ Must set build.test.results.dir
+ Must set build.classes.excludes
+ Must set dist.jar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No tests executed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set JVM to use for profiling in profiler.info.jvm
+ Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+ java -jar "${dist.jar.resolved}"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must set fix.includes
+
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set profile.class
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+ Some tests failed; see details above.
+
+
+
+ Must select some files in the IDE or set test.class
+ Must select some method in the IDE or set test.method
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+ Must select one file in the IDE or set test.class
+
+
+
+ Must select one file in the IDE or set test.class
+ Must select some method in the IDE or set test.method
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libsrc/avi/nbproject/genfiles.properties b/libsrc/avi/nbproject/genfiles.properties
index adc983466..3bbefa247 100644
--- a/libsrc/avi/nbproject/genfiles.properties
+++ b/libsrc/avi/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=505ab359
-build.xml.script.CRC32=fa68b8cb
-build.xml.stylesheet.CRC32=8064a381@1.68.1.46
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=505ab359
-nbproject/build-impl.xml.script.CRC32=3d5c3ae5
-nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.74.1.48
+build.xml.data.CRC32=505ab359
+build.xml.script.CRC32=fa68b8cb
+build.xml.stylesheet.CRC32=8064a381@1.68.1.46
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=505ab359
+nbproject/build-impl.xml.script.CRC32=3d5c3ae5
+nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.74.1.48
diff --git a/libsrc/avi/nbproject/project.properties b/libsrc/avi/nbproject/project.properties
index 10af1866e..fcd82c1b0 100644
--- a/libsrc/avi/nbproject/project.properties
+++ b/libsrc/avi/nbproject/project.properties
@@ -1,72 +1,72 @@
-annotation.processing.enabled=true
-annotation.processing.enabled.in.editor=false
-annotation.processing.processor.options=
-annotation.processing.processors.list=
-annotation.processing.run.all.processors=true
-annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-build.generated.sources.dir=${build.dir}/generated-sources
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-# Uncomment to specify the preferred debugger connection transport:
-#debug.transport=dt_socket
-debug.classpath=\
- ${run.classpath}
-debug.test.classpath=\
- ${run.test.classpath}
-# Files in build.classes.dir which should be excluded from distribution jar
-dist.archive.excludes=
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=../../lib/avi.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-excludes=
-includes=**
-jar.compress=false
-javac.classpath=
-# Space-separated list of extra javac options
-javac.compilerargs=
-javac.deprecation=false
-javac.processorpath=\
- ${javac.classpath}
-javac.source=1.7
-javac.target=1.7
-javac.test.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-javac.test.processorpath=\
- ${javac.test.classpath}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=${source.encoding}
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-main.class=org.monte.media.math.IntMath
-meta.inf.dir=${src.dir}/META-INF
-mkdist.disabled=true
-platform.active=default_platform
-run.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project.
-# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
-# To set system properties for unit tests define test-sys-prop.name=value:
-run.jvmargs=
-run.test.classpath=\
- ${javac.test.classpath}:\
- ${build.test.classes.dir}
-source.encoding=UTF-8
-src.dir=src
-test.src.dir=test
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.processor.options=
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+ ${run.classpath}
+debug.test.classpath=\
+ ${run.test.classpath}
+# Files in build.classes.dir which should be excluded from distribution jar
+dist.archive.excludes=
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=../../lib/avi.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.7
+javac.target=1.7
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+javac.test.processorpath=\
+ ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+main.class=org.monte.media.math.IntMath
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=true
+platform.active=default_platform
+run.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project.
+# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
+# To set system properties for unit tests define test-sys-prop.name=value:
+run.jvmargs=
+run.test.classpath=\
+ ${javac.test.classpath}:\
+ ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
diff --git a/libsrc/avi/nbproject/project.xml b/libsrc/avi/nbproject/project.xml
index 53a131c45..272f02a51 100644
--- a/libsrc/avi/nbproject/project.xml
+++ b/libsrc/avi/nbproject/project.xml
@@ -1,15 +1,15 @@
-
-
- org.netbeans.modules.java.j2seproject
-
-
- avi
-
-
-
-
-
-
-
-
-
+
+
+ org.netbeans.modules.java.j2seproject
+
+
+ avi
+
+
+
+
+
+
+
+
+
diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/ApplicationInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/ApplicationInfo.java
index 14282fe9a..37d49f865 100644
--- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/ApplicationInfo.java
+++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/ApplicationInfo.java
@@ -1,111 +1,111 @@
-/*
- * Copyright (C) 2010-2016 JPEXS, All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3.0 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library.
- */
-package com.jpexs.decompiler.flash;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.Properties;
-
-/**
- *
- * @author JPEXS
- */
-public class ApplicationInfo {
-
- public static final String APPLICATION_NAME = "JPEXS Free Flash Decompiler";
-
- public static final String SHORT_APPLICATION_NAME = "FFDec";
-
- public static final String VENDOR = "JPEXS";
-
- public static String version = "";
-
- public static String revision = "";
-
- public static int version_major = 4;
-
- public static int version_minor = 0;
-
- public static int version_release = 0;
-
- public static int version_build = 0;
-
- public static boolean nightly = false;
-
- public static String applicationVerName;
-
- public static String shortApplicationVerName;
-
- public static final String PROJECT_PAGE = "https://www.free-decompiler.com/flash";
-
- /**
- * URL for checking new updates
- */
- public static String updateCheckUrl = "https://www.free-decompiler.com/flash/update/check/?currentVersion=¤tRevision=¤tVersionMajor=¤tVersionMinor=¤tVersionRelease=¤tVersionBuild=¤tNightly=";
-
- /**
- * URL for doing update
- */
- public static String updateUrl = "https://www.free-decompiler.com/flash/update/update/?currentVersion=¤tRevision=¤tVersionMajor=¤tVersionMinor=¤tVersionRelease=¤tVersionBuild=¤tNightly=";
-
- static {
- loadProperties();
- }
-
- private static void loadProperties() {
- Properties prop = new Properties();
- try {
- prop.load(ApplicationInfo.class.getResourceAsStream("/project.properties"));
- version = prop.getProperty("version");
- revision = prop.getProperty("build");
- version_major = Integer.parseInt(prop.getProperty("version.major"));
- version_minor = Integer.parseInt(prop.getProperty("version.minor"));
- version_release = Integer.parseInt(prop.getProperty("version.release"));
- version_build = Integer.parseInt(prop.getProperty("version.build"));
- nightly = prop.getProperty("nightly").equals("true");
- if (nightly) {
- version = version + " nightly build " + version_build;
- }
- } catch (IOException | NullPointerException | NumberFormatException ex) {
- // ignore
- version = "unknown";
- }
- try {
- updateCheckUrl = updateCheckUrl
- .replace("", URLEncoder.encode(revision, "UTF-8"))
- .replace("", URLEncoder.encode(version, "UTF-8"))
- .replace("", "" + version_major)
- .replace("", "" + version_minor)
- .replace("", "" + version_release)
- .replace("", "" + version_build)
- .replace("", nightly ? "1" : "0");
- updateUrl = updateUrl
- .replace("", URLEncoder.encode(revision, "UTF-8"))
- .replace("", URLEncoder.encode(version, "UTF-8"))
- .replace("", "" + version_major)
- .replace("", "" + version_minor)
- .replace("", "" + version_release)
- .replace("", "" + version_build)
- .replace("", nightly ? "1" : "0");
- } catch (UnsupportedEncodingException e) {
-
- }
- applicationVerName = APPLICATION_NAME + " v." + version;
- shortApplicationVerName = SHORT_APPLICATION_NAME + " v." + version;
- }
-}
+/*
+ * Copyright (C) 2010-2016 JPEXS, All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3.0 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.
+ */
+package com.jpexs.decompiler.flash;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Properties;
+
+/**
+ *
+ * @author JPEXS
+ */
+public class ApplicationInfo {
+
+ public static final String APPLICATION_NAME = "JPEXS Free Flash Decompiler";
+
+ public static final String SHORT_APPLICATION_NAME = "FFDec";
+
+ public static final String VENDOR = "JPEXS";
+
+ public static String version = "";
+
+ public static String revision = "";
+
+ public static int version_major = 4;
+
+ public static int version_minor = 0;
+
+ public static int version_release = 0;
+
+ public static int version_build = 0;
+
+ public static boolean nightly = false;
+
+ public static String applicationVerName;
+
+ public static String shortApplicationVerName;
+
+ public static final String PROJECT_PAGE = "https://www.free-decompiler.com/flash";
+
+ /**
+ * URL for checking new updates
+ */
+ public static String updateCheckUrl = "https://www.free-decompiler.com/flash/update/check/?currentVersion=¤tRevision=¤tVersionMajor=¤tVersionMinor=¤tVersionRelease=¤tVersionBuild=¤tNightly=";
+
+ /**
+ * URL for doing update
+ */
+ public static String updateUrl = "https://www.free-decompiler.com/flash/update/update/?currentVersion=¤tRevision=¤tVersionMajor=¤tVersionMinor=¤tVersionRelease=¤tVersionBuild=¤tNightly=";
+
+ static {
+ loadProperties();
+ }
+
+ private static void loadProperties() {
+ Properties prop = new Properties();
+ try {
+ prop.load(ApplicationInfo.class.getResourceAsStream("/project.properties"));
+ version = prop.getProperty("version");
+ revision = prop.getProperty("build");
+ version_major = Integer.parseInt(prop.getProperty("version.major"));
+ version_minor = Integer.parseInt(prop.getProperty("version.minor"));
+ version_release = Integer.parseInt(prop.getProperty("version.release"));
+ version_build = Integer.parseInt(prop.getProperty("version.build"));
+ nightly = prop.getProperty("nightly").equals("true");
+ if (nightly) {
+ version = version + " nightly build " + version_build;
+ }
+ } catch (IOException | NullPointerException | NumberFormatException ex) {
+ // ignore
+ version = "unknown";
+ }
+ try {
+ updateCheckUrl = updateCheckUrl
+ .replace("", URLEncoder.encode(revision, "UTF-8"))
+ .replace("", URLEncoder.encode(version, "UTF-8"))
+ .replace("", "" + version_major)
+ .replace("", "" + version_minor)
+ .replace("", "" + version_release)
+ .replace("", "" + version_build)
+ .replace("", nightly ? "1" : "0");
+ updateUrl = updateUrl
+ .replace("", URLEncoder.encode(revision, "UTF-8"))
+ .replace("", URLEncoder.encode(version, "UTF-8"))
+ .replace("", "" + version_major)
+ .replace("", "" + version_minor)
+ .replace("", "" + version_release)
+ .replace("", "" + version_build)
+ .replace("", nightly ? "1" : "0");
+ } catch (UnsupportedEncodingException e) {
+
+ }
+ applicationVerName = APPLICATION_NAME + " v." + version;
+ shortApplicationVerName = SHORT_APPLICATION_NAME + " v." + version;
+ }
+}
diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/ReadOnlyTagList.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/ReadOnlyTagList.java
index 7edda7b65..faf327b5c 100644
--- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/ReadOnlyTagList.java
+++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/ReadOnlyTagList.java
@@ -1,62 +1,62 @@
-/*
- * Copyright (C) 2010-2016 JPEXS, All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3.0 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library.
- */
-package com.jpexs.decompiler.flash;
-
-import com.jpexs.decompiler.flash.tags.Tag;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- *
- * @author JPEXS
- */
-public class ReadOnlyTagList implements Iterable {
-
- public static final ReadOnlyTagList EMPTY = new ReadOnlyTagList(new ArrayList<>());
-
- private final List list;
-
- public ReadOnlyTagList(List list) {
- this.list = list;
- }
-
- @Override
- public Iterator iterator() {
- return list.iterator();
- }
-
- public int size() {
- return list.size();
- }
-
- public boolean isEmpty() {
- return list.isEmpty();
- }
-
- public Tag get(int index) {
- return list.get(index);
- }
-
- public int indexOf(Tag tag) {
- return list.indexOf(tag);
- }
-
- public ArrayList toArrayList() {
- return new ArrayList<>(list);
- }
-}
+/*
+ * Copyright (C) 2010-2016 JPEXS, All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3.0 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.
+ */
+package com.jpexs.decompiler.flash;
+
+import com.jpexs.decompiler.flash.tags.Tag;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ *
+ * @author JPEXS
+ */
+public class ReadOnlyTagList implements Iterable {
+
+ public static final ReadOnlyTagList EMPTY = new ReadOnlyTagList(new ArrayList<>());
+
+ private final List list;
+
+ public ReadOnlyTagList(List list) {
+ this.list = list;
+ }
+
+ @Override
+ public Iterator iterator() {
+ return list.iterator();
+ }
+
+ public int size() {
+ return list.size();
+ }
+
+ public boolean isEmpty() {
+ return list.isEmpty();
+ }
+
+ public Tag get(int index) {
+ return list.get(index);
+ }
+
+ public int indexOf(Tag tag) {
+ return list.indexOf(tag);
+ }
+
+ public ArrayList toArrayList() {
+ return new ArrayList<>(list);
+ }
+}
diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java
index 9fc2a1482..7ade5e28f 100644
--- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java
+++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java
@@ -1,3651 +1,3651 @@
-/*
- * Copyright (C) 2010-2016 JPEXS, All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3.0 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library.
- */
-package com.jpexs.decompiler.flash;
-
-import SevenZip.Compression.LZMA.Decoder;
-import SevenZip.Compression.LZMA.Encoder;
-import com.jpexs.debugger.flash.SWD;
-import com.jpexs.decompiler.flash.abc.ABC;
-import com.jpexs.decompiler.flash.abc.CachedDecompilation;
-import com.jpexs.decompiler.flash.abc.ClassPath;
-import com.jpexs.decompiler.flash.abc.RenameType;
-import com.jpexs.decompiler.flash.abc.ScriptPack;
-import com.jpexs.decompiler.flash.abc.avm2.AVM2Code;
-import com.jpexs.decompiler.flash.abc.avm2.deobfuscation.DeobfuscationLevel;
-import com.jpexs.decompiler.flash.abc.avm2.model.GetLexAVM2Item;
-import com.jpexs.decompiler.flash.abc.avm2.model.InitPropertyAVM2Item;
-import com.jpexs.decompiler.flash.abc.avm2.model.NameValuePair;
-import com.jpexs.decompiler.flash.abc.avm2.model.NewArrayAVM2Item;
-import com.jpexs.decompiler.flash.abc.avm2.model.NewObjectAVM2Item;
-import com.jpexs.decompiler.flash.abc.avm2.model.SetPropertyAVM2Item;
-import com.jpexs.decompiler.flash.abc.avm2.model.StringAVM2Item;
-import com.jpexs.decompiler.flash.abc.types.ConvertData;
-import com.jpexs.decompiler.flash.abc.types.MethodBody;
-import com.jpexs.decompiler.flash.abc.types.Multiname;
-import com.jpexs.decompiler.flash.abc.types.ScriptInfo;
-import com.jpexs.decompiler.flash.abc.types.traits.Trait;
-import com.jpexs.decompiler.flash.abc.types.traits.TraitClass;
-import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter;
-import com.jpexs.decompiler.flash.action.Action;
-import com.jpexs.decompiler.flash.action.ActionGraphSource;
-import com.jpexs.decompiler.flash.action.ActionList;
-import com.jpexs.decompiler.flash.action.ActionListReader;
-import com.jpexs.decompiler.flash.action.ActionLocalData;
-import com.jpexs.decompiler.flash.action.CachedScript;
-import com.jpexs.decompiler.flash.action.model.ConstantPool;
-import com.jpexs.decompiler.flash.action.model.DirectValueActionItem;
-import com.jpexs.decompiler.flash.action.model.FunctionActionItem;
-import com.jpexs.decompiler.flash.action.model.GetMemberActionItem;
-import com.jpexs.decompiler.flash.action.model.GetVariableActionItem;
-import com.jpexs.decompiler.flash.action.model.clauses.ClassActionItem;
-import com.jpexs.decompiler.flash.action.model.clauses.InterfaceActionItem;
-import com.jpexs.decompiler.flash.action.swf4.ActionEquals;
-import com.jpexs.decompiler.flash.action.swf4.ActionGetVariable;
-import com.jpexs.decompiler.flash.action.swf4.ActionIf;
-import com.jpexs.decompiler.flash.action.swf4.ActionPush;
-import com.jpexs.decompiler.flash.action.swf4.ActionSetVariable;
-import com.jpexs.decompiler.flash.action.swf4.ConstantIndex;
-import com.jpexs.decompiler.flash.action.swf5.ActionCallFunction;
-import com.jpexs.decompiler.flash.action.swf5.ActionCallMethod;
-import com.jpexs.decompiler.flash.action.swf5.ActionConstantPool;
-import com.jpexs.decompiler.flash.action.swf5.ActionDefineFunction;
-import com.jpexs.decompiler.flash.action.swf5.ActionDefineLocal;
-import com.jpexs.decompiler.flash.action.swf5.ActionDefineLocal2;
-import com.jpexs.decompiler.flash.action.swf5.ActionEquals2;
-import com.jpexs.decompiler.flash.action.swf5.ActionGetMember;
-import com.jpexs.decompiler.flash.action.swf5.ActionNewMethod;
-import com.jpexs.decompiler.flash.action.swf5.ActionNewObject;
-import com.jpexs.decompiler.flash.action.swf5.ActionSetMember;
-import com.jpexs.decompiler.flash.action.swf7.ActionDefineFunction2;
-import com.jpexs.decompiler.flash.configuration.Configuration;
-import com.jpexs.decompiler.flash.dumpview.DumpInfo;
-import com.jpexs.decompiler.flash.dumpview.DumpInfoSwfNode;
-import com.jpexs.decompiler.flash.ecma.Null;
-import com.jpexs.decompiler.flash.exporters.commonshape.Matrix;
-import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode;
-import com.jpexs.decompiler.flash.exporters.script.AS2ScriptExporter;
-import com.jpexs.decompiler.flash.exporters.script.AS3ScriptExporter;
-import com.jpexs.decompiler.flash.exporters.settings.ScriptExportSettings;
-import com.jpexs.decompiler.flash.exporters.shape.ShapeExportData;
-import com.jpexs.decompiler.flash.helpers.HighlightedText;
-import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter;
-import com.jpexs.decompiler.flash.helpers.NulWriter;
-import com.jpexs.decompiler.flash.helpers.SWFDecompilerPlugin;
-import com.jpexs.decompiler.flash.helpers.collections.MyEntry;
-import com.jpexs.decompiler.flash.helpers.hilight.Highlighting;
-import com.jpexs.decompiler.flash.tags.ABCContainerTag;
-import com.jpexs.decompiler.flash.tags.DebugIDTag;
-import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag;
-import com.jpexs.decompiler.flash.tags.DefineSoundTag;
-import com.jpexs.decompiler.flash.tags.DefineSpriteTag;
-import com.jpexs.decompiler.flash.tags.DoInitActionTag;
-import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag;
-import com.jpexs.decompiler.flash.tags.EnableDebuggerTag;
-import com.jpexs.decompiler.flash.tags.EnableTelemetryTag;
-import com.jpexs.decompiler.flash.tags.EndTag;
-import com.jpexs.decompiler.flash.tags.ExportAssetsTag;
-import com.jpexs.decompiler.flash.tags.FileAttributesTag;
-import com.jpexs.decompiler.flash.tags.JPEGTablesTag;
-import com.jpexs.decompiler.flash.tags.MetadataTag;
-import com.jpexs.decompiler.flash.tags.ProtectTag;
-import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag;
-import com.jpexs.decompiler.flash.tags.ShowFrameTag;
-import com.jpexs.decompiler.flash.tags.SymbolClassTag;
-import com.jpexs.decompiler.flash.tags.Tag;
-import com.jpexs.decompiler.flash.tags.TagStub;
-import com.jpexs.decompiler.flash.tags.VideoFrameTag;
-import com.jpexs.decompiler.flash.tags.base.ASMSource;
-import com.jpexs.decompiler.flash.tags.base.ASMSourceContainer;
-import com.jpexs.decompiler.flash.tags.base.BoundedTag;
-import com.jpexs.decompiler.flash.tags.base.ButtonTag;
-import com.jpexs.decompiler.flash.tags.base.CharacterIdTag;
-import com.jpexs.decompiler.flash.tags.base.CharacterTag;
-import com.jpexs.decompiler.flash.tags.base.DrawableTag;
-import com.jpexs.decompiler.flash.tags.base.Exportable;
-import com.jpexs.decompiler.flash.tags.base.FontTag;
-import com.jpexs.decompiler.flash.tags.base.ImageTag;
-import com.jpexs.decompiler.flash.tags.base.ImportTag;
-import com.jpexs.decompiler.flash.tags.base.MorphShapeTag;
-import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag;
-import com.jpexs.decompiler.flash.tags.base.RemoveTag;
-import com.jpexs.decompiler.flash.tags.base.RenderContext;
-import com.jpexs.decompiler.flash.tags.base.ShapeTag;
-import com.jpexs.decompiler.flash.tags.base.SoundTag;
-import com.jpexs.decompiler.flash.tags.base.TextTag;
-import com.jpexs.decompiler.flash.tags.enums.ImageFormat;
-import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont;
-import com.jpexs.decompiler.flash.timeline.AS2Package;
-import com.jpexs.decompiler.flash.timeline.Frame;
-import com.jpexs.decompiler.flash.timeline.FrameScript;
-import com.jpexs.decompiler.flash.timeline.TagScript;
-import com.jpexs.decompiler.flash.timeline.Timeline;
-import com.jpexs.decompiler.flash.timeline.Timelined;
-import com.jpexs.decompiler.flash.treeitems.SWFList;
-import com.jpexs.decompiler.flash.treeitems.TreeItem;
-import com.jpexs.decompiler.flash.types.ColorTransform;
-import com.jpexs.decompiler.flash.types.MATRIX;
-import com.jpexs.decompiler.flash.types.RECT;
-import com.jpexs.decompiler.flash.types.SHAPE;
-import com.jpexs.decompiler.flash.types.annotations.Internal;
-import com.jpexs.decompiler.flash.types.annotations.SWFField;
-import com.jpexs.decompiler.flash.xfl.FLAVersion;
-import com.jpexs.decompiler.flash.xfl.XFLConverter;
-import com.jpexs.decompiler.flash.xfl.XFLExportSettings;
-import com.jpexs.decompiler.graph.DottedChain;
-import com.jpexs.decompiler.graph.Graph;
-import com.jpexs.decompiler.graph.GraphSourceItem;
-import com.jpexs.decompiler.graph.GraphSourceItemContainer;
-import com.jpexs.decompiler.graph.GraphTargetItem;
-import com.jpexs.decompiler.graph.ScopeStack;
-import com.jpexs.decompiler.graph.TranslateStack;
-import com.jpexs.decompiler.graph.model.IfItem;
-import com.jpexs.decompiler.graph.model.LocalData;
-import com.jpexs.helpers.ByteArrayRange;
-import com.jpexs.helpers.Cache;
-import com.jpexs.helpers.Helper;
-import com.jpexs.helpers.NulStream;
-import com.jpexs.helpers.ProgressListener;
-import com.jpexs.helpers.SerializableImage;
-import com.jpexs.helpers.utf8.Utf8Helper;
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.geom.AffineTransform;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.EmptyStackException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.zip.DeflaterOutputStream;
-import java.util.zip.InflaterInputStream;
-
-/**
- * Class representing SWF file
- *
- * @author JPEXS
- */
-public final class SWF implements SWFContainerItem, Timelined {
-
- // big object for testing cleanup
- //BigObject bigObj = new BigObject();
- /**
- * Default version of SWF file format
- */
- public static final int DEFAULT_VERSION = 10;
-
- /**
- * Maximum SWF file format version Needs to be fixed when SWF versions
- * reaches this value
- */
- public static final int MAX_VERSION = 32;
-
- /**
- * Tags inside of file
- */
- @SWFField
- private List tags = new ArrayList<>();
-
- @Internal
- public ReadOnlyTagList readOnlyTags;
-
- public boolean hasEndTag = true;
-
- /**
- * ExportRectangle for the display
- */
- public RECT displayRect;
-
- /**
- * Movie frame rate
- */
- public float frameRate;
-
- /**
- * Number of frames in movie
- */
- public int frameCount;
-
- /**
- * Version of SWF
- */
- public int version;
-
- /**
- * Uncompressed size of the file
- */
- @Internal
- public long fileSize;
-
- /**
- * Used compression mode
- */
- public SWFCompression compression = SWFCompression.NONE;
-
- /**
- * Compressed size of the file (LZMA)
- */
- @Internal
- public long compressedSize;
-
- /**
- * LZMA Properties
- */
- public byte[] lzmaProperties;
-
- @Internal
- public byte[] uncompressedData;
-
- @Internal
- public byte[] originalUncompressedData;
-
- /**
- * ScaleForm GFx
- */
- public boolean gfx = false;
-
- @Internal
- public SWFList swfList;
-
- @Internal
- private String file;
-
- @Internal
- private String fileTitle;
-
- @Internal
- private volatile Map characters;
-
- @Internal
- private volatile Map> characterIdTags;
-
- @Internal
- private volatile Map> dependentCharacters;
-
- @Internal
- private volatile List abcList;
-
- @Internal
- private volatile JPEGTablesTag jtt;
-
- @Internal
- public Map sourceFontNamesMap = new HashMap<>();
-
- public static final double unitDivisor = 20;
-
- private static final Logger logger = Logger.getLogger(SWF.class.getName());
-
- @Internal
- private boolean isModified;
-
- @Internal
- private Timeline timeline;
-
- @Internal
- public DumpInfoSwfNode dumpInfo;
-
- @Internal
- public DefineBinaryDataTag binaryData;
-
- @Internal
- private final HashMap deobfuscated = new HashMap<>();
-
- @Internal
- private final IdentifiersDeobfuscation deobfuscation = new IdentifiersDeobfuscation();
-
- @Internal
- private final Cache frameCache = Cache.getInstance(false, false, "frame");
-
- @Internal
- private final Cache rectCache = Cache.getInstance(true, true, "rect");
-
- @Internal
- private final Cache shapeExportDataCache = Cache.getInstance(true, true, "shapeExportData");
-
- @Internal
- private final Cache soundCache = Cache.getInstance(false, false, "sound");
-
- @Internal
- private final Cache as2PcodeCache = Cache.getInstance(true, true, "as2pcode");
-
- @Internal
- private final Cache as2Cache = Cache.getInstance(true, false, "as2");
-
- @Internal
- private final Cache as3Cache = Cache.getInstance(true, false, "as3");
-
- public static List swfSignatures = Arrays.asList(
- "FWS", // Uncompressed Flash
- "CWS", // ZLib compressed Flash
- "ZWS", // LZMA compressed Flash
- "GFX", // Uncompressed ScaleForm GFx
- "CFX", // Compressed ScaleForm GFx
- "ABC" // Non-standard LZMA compressed Flash
- );
-
- public void updateCharacters() {
- characters = null;
- characterIdTags = null;
- }
-
- public void clearTagSwfs() {
- resetTimelines(this);
- updateCharacters();
-
- for (Tag tag : getTags()) {
- if (tag instanceof DefineSpriteTag) {
- DefineSpriteTag spriteTag = (DefineSpriteTag) tag;
- for (Tag tag1 : spriteTag.getTags()) {
- tag1.setSwf(null);
- }
-
- for (int i = spriteTag.getTags().size() - 1; i >= 0; i--) {
- spriteTag.removeTag(i);
- }
- }
-
- if (tag instanceof DefineBinaryDataTag) {
- DefineBinaryDataTag binaryTag = (DefineBinaryDataTag) tag;
- if (binaryTag.innerSwf != null) {
- binaryTag.innerSwf.clearTagSwfs();
- }
- }
-
- tag.setSwf(null);
- }
-
- tags.clear();
- if (abcList != null) {
- abcList.clear();
- }
-
- if (swfList != null) {
- swfList.swfs.clear();
- }
-
- as2PcodeCache.clear();
- as2Cache.clear();
- as3Cache.clear();
- frameCache.clear();
- soundCache.clear();
-
- timeline = null;
- clearDumpInfo(dumpInfo);
- dumpInfo = null;
- jtt = null;
- binaryData = null;
- }
-
- private void clearDumpInfo(DumpInfo di) {
- for (DumpInfo childInfo : di.getChildInfos()) {
- clearDumpInfo(childInfo);
- }
-
- di.getChildInfos().clear();
- }
-
- public Map getCharacters() {
- if (characters == null) {
- synchronized (this) {
- if (characters == null) {
- Map chars = new HashMap<>();
- Map> charIdtags = new HashMap<>();
- parseCharacters(getTags(), chars, charIdtags);
- characters = Collections.unmodifiableMap(chars);
- characterIdTags = Collections.unmodifiableMap(charIdtags);
- }
- }
- }
-
- return characters;
- }
-
- public List getCharacterIdTags(int characterId) {
- if (characterIdTags == null) {
- getCharacters();
- }
-
- return characterIdTags.get(characterId);
- }
-
- public CharacterIdTag getCharacterIdTag(int characterId, int tagId) {
- List characterIdTags = getCharacterIdTags(characterId);
- if (characterIdTags != null) {
- for (CharacterIdTag t : characterIdTags) {
- if (((Tag) t).getId() == tagId) {
- if (t.getCharacterId() == characterId) {
- return t;
- }
- }
- }
- }
-
- return null;
- }
-
- public Map> getDependentCharacters() {
- if (dependentCharacters == null) {
- synchronized (this) {
- if (dependentCharacters == null) {
- Map> dep = new HashMap<>();
- for (Tag tag : getTags()) {
- if (tag instanceof CharacterTag) {
- int characterId = ((CharacterTag) tag).getCharacterId();
- Set needed = new HashSet<>();
- tag.getNeededCharacters(needed);
- for (Integer needed1 : needed) {
- Set s = dep.get(needed1);
- if (s == null) {
- s = new HashSet<>();
- dep.put(needed1, s);
- }
-
- s.add(characterId);
- }
- }
- }
-
- dependentCharacters = dep;
- }
- }
- }
-
- return dependentCharacters;
- }
-
- public Set getDependentCharacters(int characterId) {
- Set visited = new HashSet<>();
-
- Set dependents2 = new LinkedHashSet<>();
- Set deps = getDependentCharacters().get(characterId);
- if (deps != null) {
- dependents2.addAll(deps);
- }
-
- while (visited.size() != dependents2.size()) {
- for (int chId : dependents2) {
- if (!visited.contains(chId)) {
- visited.add(chId);
- if (getCharacters().containsKey(chId)) {
- deps = getDependentCharacters().get(chId);
- if (deps != null) {
- dependents2.addAll(deps);
- }
-
- break;
- }
- }
- }
- }
-
- Set dependents = new LinkedHashSet<>();
- for (Integer chId : dependents2) {
- if (getCharacters().containsKey(chId)) {
- dependents.add(chId);
- }
- }
-
- return dependents;
- }
-
- public CharacterTag getCharacter(int characterId) {
- return getCharacters().get(characterId);
- }
-
- public String getExportName(int characterId) {
- CharacterTag characterTag = getCharacters().get(characterId);
- String exportName = characterTag != null ? characterTag.getExportName() : null;
- return exportName;
- }
-
- public FontTag getFontByClass(String fontClass) {
- if (fontClass == null) {
- return null;
- }
- for (Tag t : getTags()) {
- if (t instanceof FontTag) {
- if (fontClass.equals(((FontTag) t).getClassName())) {
- return (FontTag) t;
- }
- }
- }
- return null;
- }
-
- public FontTag getFont(int fontId) {
- CharacterTag characterTag = getCharacters().get(fontId);
- if (characterTag instanceof FontTag) {
- return (FontTag) characterTag;
- }
-
- if (characterTag != null) {
- logger.log(Level.SEVERE, "CharacterTag should be a FontTag. characterId: {0}", fontId);
- }
-
- return null;
- }
-
- public ImageTag getImage(int imageId) {
- CharacterTag characterTag = getCharacters().get(imageId);
- if (characterTag instanceof ImageTag) {
- return (ImageTag) characterTag;
- }
-
- if (characterTag != null) {
- logger.log(Level.SEVERE, "CharacterTag should be an ImageTag. characterId: {0}", imageId);
- }
-
- return null;
- }
-
- public DefineSoundTag getSound(int soundId) {
- CharacterTag characterTag = getCharacters().get(soundId);
- if (characterTag instanceof DefineSoundTag) {
- return (DefineSoundTag) characterTag;
- }
-
- if (characterTag != null) {
- logger.log(Level.SEVERE, "CharacterTag should be a DefineSoundTag. characterId: {0}", soundId);
- }
-
- return null;
- }
-
- public TextTag getText(int textId) {
- CharacterTag characterTag = getCharacters().get(textId);
- if (characterTag instanceof TextTag) {
- return (TextTag) characterTag;
- }
-
- if (characterTag != null) {
- logger.log(Level.SEVERE, "CharacterTag should be a TextTag. characterId: {0}", textId);
- }
-
- return null;
- }
-
- public List getAbcList() {
- if (abcList == null) {
- synchronized (this) {
- if (abcList == null) {
- ArrayList newAbcList = new ArrayList<>();
- getAbcTags(getTags(), newAbcList);
- abcList = newAbcList;
- }
- }
- }
-
- return abcList;
- }
-
- public boolean isAS3() {
- FileAttributesTag fileAttributes = getFileAttributes();
- return (fileAttributes != null && fileAttributes.actionScript3) || (fileAttributes == null && !getAbcList().isEmpty());
- }
-
- public MetadataTag getMetadata() {
- for (Tag t : getTags()) {
- if (t instanceof MetadataTag) {
- return (MetadataTag) t;
- }
- }
-
- return null;
- }
-
- public FileAttributesTag getFileAttributes() {
- for (Tag t : getTags()) {
- if (t instanceof FileAttributesTag) {
- return (FileAttributesTag) t;
- }
- }
-
- return null;
- }
-
- public SetBackgroundColorTag getBackgroundColor() {
- for (Tag t : getTags()) {
- if (t instanceof SetBackgroundColorTag) {
- return (SetBackgroundColorTag) t;
- }
- }
-
- return null;
- }
-
- public EnableTelemetryTag getEnableTelemetry() {
- for (Tag t : getTags()) {
- if (t instanceof EnableTelemetryTag) {
- return (EnableTelemetryTag) t;
- }
- }
- return null;
- }
-
- public int getNextCharacterId() {
- int max = 0;
- Set ids = new HashSet<>(getCharacters().keySet());
- for (Tag t : tags) {
- if (t instanceof ImportTag) {
- ids.addAll(((ImportTag) t).getAssets().keySet());
- }
- }
- for (int characterId : ids) {
- if (characterId > max) {
- max = characterId;
- }
- }
-
- return max + 1;
- }
-
- public synchronized JPEGTablesTag getJtt() {
- if (jtt == null) {
- synchronized (this) {
- if (jtt == null) {
- for (Tag t : getTags()) {
- if (t instanceof JPEGTablesTag) {
- jtt = (JPEGTablesTag) t;
- break;
- }
- }
- }
- }
- }
-
- return jtt;
- }
-
- public String getDocumentClass() {
- for (Tag t : getTags()) {
- if (t instanceof SymbolClassTag) {
- SymbolClassTag sc = (SymbolClassTag) t;
- for (int i = 0; i < sc.tags.size(); i++) {
- if (sc.tags.get(i) == 0) {
- return sc.names.get(i);
- }
- }
- }
- }
-
- return null;
- }
-
- public void fixCharactersOrder(boolean checkAll) {
- Set addedCharacterIds = new HashSet<>();
- Set movedTags = new HashSet<>();
- for (int i = 0; i < tags.size(); i++) {
- Tag tag = tags.get(i);
- if (checkAll || tag.isModified()) {
- Set needed = new HashSet<>();
- tag.getNeededCharacters(needed);
- if (tag instanceof CharacterTag) {
- CharacterTag characterTag = (CharacterTag) tag;
- needed.remove(characterTag.getCharacterId());
- }
- boolean moved = false;
- for (Integer id : needed) {
- if (!addedCharacterIds.contains(id)) {
- CharacterTag neededCharacter = getCharacter(id);
- if (neededCharacter == null) {
- continue;
- }
-
- if (movedTags.contains(neededCharacter)) {
- logger.log(Level.SEVERE, "Fixing characters order failed, recursion detected.");
- return;
- }
-
- // move the needed character to the current position
- tags.remove(neededCharacter);
- tags.add(i, neededCharacter);
- movedTags.add(neededCharacter);
- moved = true;
- }
- }
-
- if (moved) {
- i--;
- continue;
- }
- }
- if (tag instanceof CharacterTag) {
- addedCharacterIds.add(((CharacterTag) tag).getCharacterId());
- }
- }
- }
-
- public void resetTimelines(Timelined timelined) {
- timelined.resetTimeline();
- if (timelined instanceof SWF) {
- for (Tag t : ((SWF) timelined).getTags()) {
- if (t instanceof Timelined) {
- resetTimelines((Timelined) t);
- }
- }
- }
- }
-
- private void parseCharacters(Iterable list, Map characters, Map> characterIdTags) {
- for (Tag t : list) {
- if (t instanceof CharacterIdTag) {
- int characterId = ((CharacterIdTag) t).getCharacterId();
- if (t instanceof CharacterTag) {
- if (characters.containsKey(characterId)) {
- logger.log(Level.SEVERE, "SWF already contains characterId={0}", characterId);
- }
-
- if (characterId != 0) {
- characters.put(characterId, (CharacterTag) t);
- characterIdTags.put(characterId, new ArrayList<>());
- }
- } else if (characterIdTags.containsKey(characterId)) {
- characterIdTags.get(characterId).add((CharacterIdTag) t);
- }
- }
-
- if (t instanceof DefineSpriteTag) {
- parseCharacters(((DefineSpriteTag) t).getTags(), characters, characterIdTags);
- }
- }
- }
-
- /**
- * Unresolve recursive sprites
- */
- private void checkInvalidSprites() {
- for (int i = 0; i < tags.size(); i++) {
- Tag t = tags.get(i);
- if (t instanceof DefineSpriteTag) {
- if (!isSpriteValid((DefineSpriteTag) t, new ArrayList<>())) {
- tags.set(i, new TagStub(this, t.getId(), "InvalidSprite", t.getOriginalRange(), null));
- }
- }
- }
- }
-
- private boolean isSpriteValid(DefineSpriteTag sprite, List path) {
- if (path.contains(sprite.spriteId)) {
- return false;
- }
- path.add(sprite.spriteId);
- for (Tag t : sprite.getTags()) {
- if (t instanceof DefineSpriteTag) {
- if (!isSpriteValid((DefineSpriteTag) t, path)) {
- return false;
- }
- }
- }
- path.remove((Integer) sprite.spriteId);
- return true;
- }
-
- @Override
- public Timeline getTimeline() {
- if (timeline == null) {
- timeline = new Timeline(this);
- }
- return timeline;
- }
-
- @Override
- public void resetTimeline() {
- if (timeline != null) {
- timeline.reset(this);
- }
- }
-
- /**
- * Gets all tags with specified id
- *
- * @param tagId Identificator of tag type
- * @return List of tags
- */
- public List getTagData(int tagId) {
- List ret = new ArrayList<>();
- for (Tag tag : getTags()) {
- if (tag.getId() == tagId) {
- ret.add(tag);
- }
- }
- return ret;
- }
-
- /**
- * Saves this SWF into new file
- *
- * @param os OutputStream to save SWF in
- * @throws IOException
- */
- public void saveTo(OutputStream os) throws IOException {
- byte[] uncompressedData = saveToByteArray();
- compress(new ByteArrayInputStream(uncompressedData), os, compression, lzmaProperties);
- }
-
- public byte[] getHeaderBytes() {
- return getHeaderBytes(compression, gfx);
- }
-
- private static byte[] getHeaderBytes(SWFCompression compression, boolean gfx) {
- if (compression == SWFCompression.LZMA_ABC) {
- return new byte[]{'A', 'B', 'C'};
- }
-
- byte[] ret = new byte[3];
-
- if (compression == SWFCompression.LZMA) {
- ret[0] = 'Z';
- } else if (compression == SWFCompression.ZLIB) {
- ret[0] = 'C';
- } else if (gfx) {
- ret[0] = 'G';
- } else {
- ret[0] = 'F';
- }
-
- if (gfx) {
- ret[1] = 'F';
- ret[2] = 'X';
- } else {
- ret[1] = 'W';
- ret[2] = 'S';
- }
-
- return ret;
- }
-
- private byte[] saveToByteArray() throws IOException {
- fixCharactersOrder(false);
-
- byte[] data;
- try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
- SWFOutputStream sos = new SWFOutputStream(baos, version)) {
- sos.write(getHeaderBytes(SWFCompression.NONE, gfx));
- sos.writeUI8(version);
- sos.writeUI32(0); // placeholder for file length
- sos.writeRECT(displayRect);
- sos.writeFIXED8(frameRate);
- sos.writeUI16(frameCount);
-
- sos.writeTags(getLocalTags());
- if (hasEndTag) {
- sos.writeUI16(0);
- }
-
- data = baos.toByteArray();
- }
-
- // update file size
- try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
- SWFOutputStream sos = new SWFOutputStream(baos, version)) {
- sos.writeUI32(data.length);
- byte[] lengthData = baos.toByteArray();
- System.arraycopy(lengthData, 0, data, 4, lengthData.length);
- }
-
- return data;
- }
-
- /**
- * Compress SWF file
- *
- * @param is InputStream
- * @param os OutputStream to save SWF in
- * @param compression
- * @param lzmaProperties
- * @throws IOException
- */
- private static void compress(InputStream is, OutputStream os, SWFCompression compression, byte[] lzmaProperties) throws IOException {
- byte[] hdr = new byte[8];
-
- is.mark(8);
-
- // SWFheader: signature, version and fileSize
- if (is.read(hdr) != 8) {
- throw new SwfOpenException("SWF header is too short");
- }
-
- boolean uncompressed = hdr[0] == 'F' || hdr[0] == 'G'; // FWS or GFX
- if (!uncompressed) {
- // fisrt decompress, then compress to the given format
- is.reset();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- decompress(is, baos, false);
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- compress(bais, os, compression, lzmaProperties);
- return;
- }
-
- boolean gfx = hdr[1] == 'F' && hdr[2] == 'X';
- int version = hdr[3];
- long fileSize;
- try (SWFInputStream sis = new SWFInputStream(null, Arrays.copyOfRange(hdr, 4, 8), 4, 4)) {
- fileSize = sis.readUI32("fileSize");
- }
-
- SWFOutputStream sos = new SWFOutputStream(os, version);
- sos.write(getHeaderBytes(compression, gfx));
- sos.writeUI8(version);
- sos.writeUI32(fileSize);
-
- if (compression == SWFCompression.LZMA || compression == SWFCompression.LZMA_ABC) {
- long uncompressedLength = fileSize - 8;
- Encoder enc = new Encoder();
- if (lzmaProperties == null) {
- // todo: the bytes are from a sample swf
- lzmaProperties = new byte[]{93, 0, 0, 32, 0};
- }
-
- int val = lzmaProperties[0] & 0xFF;
- int lc = val % 9;
- int remainder = val / 9;
- int lp = remainder % 5;
- int pb = remainder / 5;
- int dictionarySize = 0;
- for (int i = 0; i < 4; i++) {
- dictionarySize += ((int) (lzmaProperties[1 + i]) & 0xFF) << (i * 8);
- }
- if (Configuration.lzmaFastBytes.get() > 0) {
- enc.SetNumFastBytes(Configuration.lzmaFastBytes.get());
- }
- enc.SetDictionarySize(dictionarySize);
- enc.SetLcLpPb(lc, lp, pb);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- enc.SetEndMarkerMode(true);
- enc.Code(is, baos, -1, -1, null);
- byte[] data = baos.toByteArray();
- if (compression == SWFCompression.LZMA) {
- byte[] udata = new byte[4];
- udata[0] = (byte) (data.length & 0xFF);
- udata[1] = (byte) ((data.length >> 8) & 0xFF);
- udata[2] = (byte) ((data.length >> 16) & 0xFF);
- udata[3] = (byte) ((data.length >> 24) & 0xFF);
- os.write(udata);
- }
- enc.WriteCoderProperties(os);
- if (compression == SWFCompression.LZMA_ABC) {
- byte[] udata = new byte[8];
- udata[0] = (byte) (uncompressedLength & 0xFF);
- udata[1] = (byte) ((uncompressedLength >> 8) & 0xFF);
- udata[2] = (byte) ((uncompressedLength >> 16) & 0xFF);
- udata[3] = (byte) ((uncompressedLength >> 24) & 0xFF);
- udata[4] = (byte) ((uncompressedLength >> 32) & 0xFF);
- udata[5] = (byte) ((uncompressedLength >> 40) & 0xFF);
- udata[6] = (byte) ((uncompressedLength >> 48) & 0xFF);
- udata[7] = (byte) ((uncompressedLength >> 56) & 0xFF);
- os.write(udata);
- }
- os.write(data);
- } else if (compression == SWFCompression.ZLIB) {
- DeflaterOutputStream dos = new DeflaterOutputStream(os);
- try {
- Helper.copyStream(is, dos);
- } finally {
- dos.finish();
- }
- } else {
- Helper.copyStream(is, os);
- }
- }
-
- @Override
- public boolean isModified() {
- if (isModified) {
- return true;
- }
-
- for (Tag tag : getTags()) {
- if (tag.isModified()) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public void setModified(boolean value) {
- isModified = value;
- }
-
- public void clearModified() {
- for (Tag tag : getTags()) {
- if (tag.isModified()) {
- tag.createOriginalData();
- tag.setModified(false);
- }
- }
-
- isModified = false;
-
- try {
- uncompressedData = saveToByteArray();
- } catch (IOException ex) {
- logger.log(Level.SEVERE, "Cannot save SWF", ex);
- }
- }
-
- /**
- * Constructs an empty SWF
- */
- public SWF() {
- version = SWF.DEFAULT_VERSION;
- displayRect = new RECT(0, 1, 0, 1);
- }
-
- /**
- * Construct SWF from stream
- *
- * @param is Stream to read SWF from
- * @param parallelRead Use parallel threads?
- * @throws IOException
- * @throws java.lang.InterruptedException
- */
- public SWF(InputStream is, boolean parallelRead) throws IOException, InterruptedException {
- this(is, null, null, null, parallelRead, false, true);
- }
-
- /**
- * Construct SWF from stream
- *
- * @param is Stream to read SWF from
- * @param parallelRead Use parallel threads?
- * @param lazy
- * @throws IOException
- * @throws java.lang.InterruptedException
- */
- public SWF(InputStream is, boolean parallelRead, boolean lazy) throws IOException, InterruptedException {
- this(is, null, null, null, parallelRead, false, lazy);
- }
-
- /**
- * Construct SWF from stream
- *
- * @param is Stream to read SWF from
- * @param file Path to the file
- * @param fileTitle Title of the SWF
- * @param parallelRead Use parallel threads?
- * @throws IOException
- * @throws java.lang.InterruptedException
- */
- public SWF(InputStream is, String file, String fileTitle, boolean parallelRead) throws IOException, InterruptedException {
- this(is, file, fileTitle, null, parallelRead, false, true);
- }
-
- /**
- * Construct SWF from stream
- *
- * @param is Stream to read SWF from
- * @param listener
- * @param parallelRead Use parallel threads?
- * @throws IOException
- * @throws java.lang.InterruptedException
- */
- public SWF(InputStream is, ProgressListener listener, boolean parallelRead) throws IOException, InterruptedException {
- this(is, null, null, listener, parallelRead, false, true);
- }
-
- /**
- * Construct SWF from stream
- *
- * @param is Stream to read SWF from
- * @param file Path to the file
- * @param fileTitle Title of the SWF
- * @param listener
- * @param parallelRead Use parallel threads?
- * @throws IOException
- * @throws java.lang.InterruptedException
- */
- public SWF(InputStream is, String file, String fileTitle, ProgressListener listener, boolean parallelRead) throws IOException, InterruptedException {
- this(is, file, fileTitle, listener, parallelRead, false, true);
- }
-
- /**
- * Faster constructor to check SWF only
- *
- * @param is
- * @throws java.io.IOException
- */
- public SWF(InputStream is) throws IOException {
- decompress(is, new NulStream(), true);
- }
-
- public SWF(InputStream is, String file, String fileTitle, ProgressListener listener, boolean parallelRead, boolean checkOnly, boolean lazy) throws IOException, InterruptedException {
- this(is, file, fileTitle, listener, parallelRead, checkOnly, lazy, null);
- }
-
- /**
- * Construct SWF from stream
- *
- * @param is Stream to read SWF from
- * @param file Path to the file
- * @param fileTitle Title of the SWF
- * @param listener
- * @param parallelRead Use parallel threads?
- * @param checkOnly Check only file validity
- * @param lazy
- * @param resolver Resolver for imported tags
- * @throws IOException
- * @throws java.lang.InterruptedException
- */
- public SWF(InputStream is, String file, String fileTitle, ProgressListener listener, boolean parallelRead, boolean checkOnly, boolean lazy, UrlResolver resolver) throws IOException, InterruptedException {
- this.file = file;
- this.fileTitle = fileTitle;
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- SWFHeader header = decompress(is, baos, true);
- gfx = header.gfx;
- compression = header.compression;
- lzmaProperties = header.lzmaProperties;
- uncompressedData = baos.toByteArray();
- originalUncompressedData = uncompressedData;
-
- SWFInputStream sis = new SWFInputStream(this, uncompressedData);
- dumpInfo = new DumpInfoSwfNode(this, "rootswf", "", null, 0, 0);
- sis.dumpInfo = dumpInfo;
- sis.skipBytesEx(3, "signature"); // skip siganture
- version = sis.readUI8("version");
- fileSize = sis.readUI32("fileSize");
- dumpInfo.lengthBytes = fileSize;
- if (listener != null) {
- sis.addPercentListener(listener);
- }
- sis.setPercentMax(fileSize);
- displayRect = sis.readRECT("displayRect");
- frameRate = sis.readFIXED8("frameRate");
- frameCount = sis.readUI16("frameCount");
- List tags = sis.readTagList(this, 0, parallelRead, true, !checkOnly, lazy);
- if (tags.size() > 0 && tags.get(tags.size() - 1).getId() == EndTag.ID) {
- tags.remove(tags.size() - 1);
- } else {
- hasEndTag = false;
- }
- this.tags = tags;
- readOnlyTags = null;
- if (!checkOnly) {
- checkInvalidSprites();
- updateCharacters();
- assignExportNamesToSymbols();
- assignClassesToSymbols();
- if (resolver != null) {
- resolveImported(resolver);
- }
- SWFDecompilerPlugin.fireSwfParsed(this);
- } else {
- boolean hasNonUnknownTag = false;
- for (Tag tag : tags) {
- if (tag.getOriginalDataLength() > 0 && Tag.getRequiredTags().contains(tag.getId())) {
- hasNonUnknownTag = true;
- }
- }
- if (!hasNonUnknownTag) {
- throw new IOException("Invalid SWF file. No known tag found.");
- }
- }
-
- if (Configuration.autoRenameIdentifiers.get()) {
- deobfuscateIdentifiers(RenameType.TYPENUMBER);
- assignClassesToSymbols();
- clearScriptCache();
- }
-
- getASMs(true); // Add scriptNames to ASMs
- }
-
- private void resolveImported(UrlResolver resolver) {
- for (int p = 0; p < tags.size(); p++) {
- Tag t = tags.get(p);
- if (t instanceof ImportTag) {
- ImportTag importTag = (ImportTag) t;
-
- SWF iSwf = resolver.resolveUrl(importTag.getUrl());
- if (iSwf != null) {
- Map exportedMap1 = new HashMap<>();
- Map classesMap1 = new HashMap<>();
-
- for (Tag t2 : iSwf.tags) {
- if (t2 instanceof ExportAssetsTag) {
- ExportAssetsTag sc = (ExportAssetsTag) t2;
- Map m2 = sc.getTagToNameMap();
- for (int key : m2.keySet()) {
- if (!exportedMap1.containsKey(key)) {
- exportedMap1.put(key, m2.get(key));
- }
- }
- }
- if (t2 instanceof SymbolClassTag) {
- SymbolClassTag sc = (SymbolClassTag) t2;
- Map m2 = sc.getTagToNameMap();
- for (int key : m2.keySet()) {
- if (!classesMap1.containsKey(key)) {
- classesMap1.put(key, m2.get(key));
- }
- }
- }
- }
- Map exportedMap2 = new HashMap<>();
- for (int k : exportedMap1.keySet()) {
- exportedMap2.put(exportedMap1.get(k), k);
- }
-
- Map classesMap2 = new HashMap<>();
- for (int k : classesMap1.keySet()) {
- classesMap2.put(classesMap1.get(k), k);
- }
-
- Map importedMap1 = importTag.getAssets();
- Map importedMap2 = new HashMap<>();
- for (int k : importedMap1.keySet()) {
- importedMap2.put(importedMap1.get(k), k);
- }
-
- int pos = 0;
- for (String key : importedMap2.keySet()) {
- if (!exportedMap2.containsKey(key)) {
- continue; //?
- }
- int exportedId = exportedMap2.get(key);
- int importedId = importedMap2.get(key);
- for (Tag cht : iSwf.tags) {
- if ((cht instanceof CharacterIdTag) && (((CharacterIdTag) cht).getCharacterId() == exportedId) && !(cht instanceof PlaceObjectTypeTag) && !(cht instanceof RemoveTag)) {
- CharacterIdTag ch = (CharacterIdTag) cht;
- cht.setSwf(this);
- ch.setCharacterId(importedId);
- cht.setImported(true);
- tags.add(p + 1 + pos, cht);
- pos++;
- }
- }
- }
-
- int newId = getNextCharacterId();
- pos = 0;
- for (String key : classesMap2.keySet()) {
- int exportedId = classesMap2.get(key);
- int importedId = newId++;
- for (Tag cht : iSwf.tags) {
- if ((cht instanceof CharacterIdTag) && (((CharacterIdTag) cht).getCharacterId() == exportedId) && !(cht instanceof PlaceObjectTypeTag) && !(cht instanceof RemoveTag)) {
- CharacterIdTag ch = (CharacterIdTag) cht;
- cht.setSwf(this);
- ch.setCharacterId(importedId);
- cht.setImported(true);
- tags.add(p + 1 + pos, cht);
- pos++;
- }
- }
- }
- updateCharacters();
- }
- }
- }
- }
-
- @Override
- public SWF getSwf() {
- return this;
- }
-
- public SWF getRootSwf() {
- SWF result = this;
- while (result.binaryData != null) {
- result = result.binaryData.getSwf();
- }
-
- return result;
- }
-
- public String getFile() {
- return file;
- }
-
- /**
- * Get title of the file
- *
- * @return file title
- */
- public String getFileTitle() {
- if (fileTitle != null) {
- return fileTitle;
- }
- return file;
- }
-
- public String getShortFileName() {
- String title = getFileTitle();
- if (title == null) {
- return "";
- }
- return new File(title).getName();
- }
-
- public void setFile(String file) {
- this.file = file;
- fileTitle = null;
- }
-
- public Date getFileModificationDate() {
- try {
- if (swfList != null && swfList.sourceInfo != null) {
- String fileName = swfList.sourceInfo.getFile();
- if (fileName != null) {
- long lastModified = new File(fileName).lastModified();
- if (lastModified > 0) {
- return new Date(lastModified);
- }
- }
- }
- } catch (SecurityException sex) {
- }
-
- return new Date();
- }
-
- private static void getAbcTags(Iterable list, List actionScripts) {
- for (Tag t : list) {
- if (t instanceof DefineSpriteTag) {
- getAbcTags(((DefineSpriteTag) t).getTags(), actionScripts);
- }
- if (t instanceof ABCContainerTag) {
- actionScripts.add((ABCContainerTag) t);
- }
- }
- }
-
- public void assignExportNamesToSymbols() {
- HashMap exportNames = new HashMap<>();
- for (Tag t : getTags()) {
- if (t instanceof ExportAssetsTag) {
- ExportAssetsTag eat = (ExportAssetsTag) t;
- for (int i = 0; i < eat.tags.size(); i++) {
- Integer tagId = eat.tags.get(i);
- String name = eat.names.get(i);
- if ((!exportNames.containsKey(tagId)) && (!exportNames.containsValue(name))) {
- exportNames.put(tagId, name);
- }
- }
- }
- }
- for (Tag t : getTags()) {
- if (t instanceof CharacterTag) {
- CharacterTag ct = (CharacterTag) t;
- if (exportNames.containsKey(ct.getCharacterId())) {
- ct.setExportName(exportNames.get(ct.getCharacterId()));
- }
- }
- }
- }
-
- public void assignClassesToSymbols() {
- HashMap classes = new HashMap<>();
- for (Tag t : getTags()) {
- if (t instanceof SymbolClassTag) {
- SymbolClassTag sct = (SymbolClassTag) t;
- for (int i = 0; i < sct.tags.size(); i++) {
- if ((!classes.containsKey(sct.tags.get(i))) && (!classes.containsValue(sct.names.get(i)))) {
- classes.put(sct.tags.get(i), sct.names.get(i));
- }
- }
- }
- }
- for (Tag t : getTags()) {
- if (t instanceof CharacterTag) {
- CharacterTag ct = (CharacterTag) t;
- if (classes.containsKey(ct.getCharacterId())) {
- ct.setClassName(classes.get(ct.getCharacterId()));
- }
- }
- }
- }
-
- /**
- * Compress SWF file
- *
- * @param fis Input stream
- * @param fos Output stream
- * @param compression
- * @return True on success
- */
- public static boolean compress(InputStream fis, OutputStream fos, SWFCompression compression) {
- try {
- compress(fis, fos, compression, null);
- } catch (IOException ex) {
- return false;
- }
- return true;
- }
-
- public static boolean decompress(InputStream fis, OutputStream fos) {
- try {
- decompress(fis, fos, false);
- return true;
- } catch (IOException ex) {
- return false;
- }
- }
-
- private static void decodeLZMAStream(InputStream is, OutputStream os, byte[] lzmaProperties, long fileSize) throws IOException {
- Decoder decoder = new Decoder();
- if (!decoder.SetDecoderProperties(lzmaProperties)) {
- throw new IOException("LZMA:Incorrect stream properties");
- }
- if (!decoder.Code(is, os, fileSize - 8)) {
- throw new IOException("LZMA:Error in data stream");
- }
- }
-
- private static SWFHeader decompress(InputStream is, OutputStream os, boolean allowUncompressed) throws IOException {
- byte[] hdr = new byte[8];
-
- // SWFheader: signature, version and fileSize
- if (is.read(hdr) != 8) {
- throw new SwfOpenException("SWF header is too short");
- }
-
- String signature = new String(hdr, 0, 3, Utf8Helper.charset);
- if (!swfSignatures.contains(signature)) {
- throw new SwfOpenException("Invalid SWF file, wrong signature.");
- }
-
- int version = hdr[3];
- long fileSize;
- try (SWFInputStream sis = new SWFInputStream(null, Arrays.copyOfRange(hdr, 4, 8), 4, 4)) {
- fileSize = sis.readUI32("fileSize");
- }
-
- SWFHeader header = new SWFHeader();
- header.version = version;
- header.fileSize = fileSize;
- header.gfx = hdr[1] == 'F' && hdr[2] == 'X';
-
- try (SWFOutputStream sos = new SWFOutputStream(os, version)) {
- sos.write(getHeaderBytes(SWFCompression.NONE, header.gfx));
- sos.writeUI8(version);
- sos.writeUI32(fileSize);
-
- switch (hdr[0]) {
- case 'C': { // CWS, CFX
- Helper.copyStream(new InflaterInputStream(is), os, fileSize - 8);
- header.compression = SWFCompression.ZLIB;
- break;
- }
- case 'Z': { // ZWS
- byte[] lzmaprop = new byte[9];
- is.read(lzmaprop);
- try (SWFInputStream sis = new SWFInputStream(null, lzmaprop)) {
- sis.readUI32("LZMAsize"); // compressed LZMA data size = compressed SWF - 17 byte,
- // where 17 = 8 byte header + this 4 byte + 5 bytes decoder properties
-
- int propertiesSize = 5;
- byte[] lzmaProperties = sis.readBytes(propertiesSize, "lzmaproperties");
- if (lzmaProperties.length != propertiesSize) {
- throw new IOException("LZMA:input .lzma file is too short");
- }
-
- decodeLZMAStream(is, os, lzmaProperties, fileSize);
-
- header.compression = SWFCompression.LZMA;
- header.lzmaProperties = lzmaProperties;
- }
- break;
- }
- case 'A': { // ABC
- byte[] lzmaProperties = new byte[5];
- is.read(lzmaProperties);
- byte[] uncompressedLength = new byte[8];
- is.read(uncompressedLength);
-
- decodeLZMAStream(is, os, lzmaProperties, fileSize);
-
- header.compression = SWFCompression.LZMA_ABC;
- header.lzmaProperties = lzmaProperties;
- break;
- }
- default: { // FWS, GFX
- if (allowUncompressed) {
- Helper.copyStream(is, os, fileSize - 8);
- } else {
- throw new IOException("SWF is not compressed");
- }
- }
- }
-
- return header;
- }
- }
-
- public static boolean renameInvalidIdentifiers(RenameType renameType, InputStream fis, OutputStream fos) {
- try {
- SWF swf = new SWF(fis, Configuration.parallelSpeedUp.get());
- int cnt = swf.deobfuscateIdentifiers(renameType);
- swf.assignClassesToSymbols();
- System.out.println(cnt + " identifiers renamed.");
- swf.saveTo(fos);
- } catch (InterruptedException | IOException ex) {
- return false;
- }
- return true;
- }
-
- public List getScriptPacksByClassNames(List classNames) throws Exception {
- Set resultSet = new HashSet<>();
-
- List abcList = getAbcList();
- List allAbcList = new ArrayList<>();
- for (int i = 0; i < abcList.size(); i++) {
- allAbcList.add(abcList.get(i).getABC());
- }
-
- for (String className : classNames) {
- for (int i = 0; i < abcList.size(); i++) {
- ABC abc = abcList.get(i).getABC();
- List scrs = abc.findScriptPacksByPath(className, allAbcList);
- for (int j = 0; j < scrs.size(); j++) {
- ScriptPack scr = scrs.get(j);
- resultSet.add(scr);
- }
- }
- }
-
- return new ArrayList<>(resultSet);
- }
-
- private List uniqueAS3Packs(List packs) {
- List ret = new ArrayList<>();
- Set classPaths = new HashSet<>();
- for (ScriptPack item : packs) {
- ClassPath key = item.getClassPath();
- if (classPaths.contains(key)) {
- logger.log(Level.SEVERE, "Duplicate pack path found (" + key + ")!");
- } else {
- classPaths.add(key);
- ret.add(item);
- }
- }
- return ret;
- }
-
- public List getAS3Packs() {
- List packs = new ArrayList<>();
-
- List abcList = getAbcList();
- List allAbcList = new ArrayList<>();
- for (int i = 0; i < abcList.size(); i++) {
- allAbcList.add(abcList.get(i).getABC());
- }
-
- for (ABCContainerTag abcTag : abcList) {
- packs.addAll(abcTag.getABC().getScriptPacks(null, allAbcList));
- }
- return uniqueAS3Packs(packs);
- }
-
- @Override
- public RECT getRect() {
- return displayRect;
- }
-
- @Override
- public RECT getRect(Set added) {
- return displayRect;
- }
-
- public EventListener getExportEventListener() {
- EventListener evl = new EventListener() {
- @Override
- public void handleExportingEvent(String type, int index, int count, Object data) {
- for (EventListener listener : listeners) {
- listener.handleExportingEvent(type, index, count, data);
- }
- }
-
- @Override
- public void handleExportedEvent(String type, int index, int count, Object data) {
- for (EventListener listener : listeners) {
- listener.handleExportedEvent(type, index, count, data);
- }
- }
-
- @Override
- public void handleEvent(String event, Object data) {
- informListeners(event, data);
- }
- };
-
- return evl;
- }
-
- public List exportActionScript(AbortRetryIgnoreHandler handler, String outdir, ScriptExportSettings exportSettings, boolean parallel, EventListener evl) throws IOException {
- return exportActionScript(handler, outdir, null, exportSettings, parallel, evl, true, true);
- }
-
- public List exportActionScript(AbortRetryIgnoreHandler handler, String outdir, List as3scripts, ScriptExportSettings exportSettings, boolean parallel, EventListener evl, boolean as2, boolean as3) throws IOException {
- List ret = new ArrayList<>();
-
- if (isAS3()) {
- if (as3) {
- ret.addAll(new AS3ScriptExporter().exportActionScript3(this, handler, outdir, as3scripts, exportSettings, parallel, evl));
- }
- } else if (as2) {
- ret.addAll(new AS2ScriptExporter().exportAS2Scripts(handler, outdir, getASMs(true), exportSettings, parallel, evl));
- }
- return ret;
- }
-
- public Map getASMs(boolean exportFileNames) {
- return getASMs(exportFileNames, new ArrayList<>(), true);
- }
-
- public Map getASMs(boolean exportFileNames, List nodesToExport, boolean exportAll) {
- Map asmsToExport = new HashMap<>();
- for (TreeItem treeItem : getFirstLevelASMNodes(null)) {
- getASMs(exportFileNames, treeItem, nodesToExport, exportAll, asmsToExport, File.separator + getASMPath(exportFileNames, treeItem));
- }
-
- return asmsToExport;
- }
-
- private void getASMs(boolean exportFileNames, TreeItem treeItem, List nodesToExport, boolean exportAll, Map asmsToExport, String path) {
- boolean exportNode = nodesToExport.contains(treeItem);
- TreeItem realItem = treeItem instanceof TagScript ? ((TagScript) treeItem).getTag() : treeItem;
- if (realItem instanceof ASMSource && (exportAll || exportNode)) {
- String npath = path;
- String exPath = path;
- int ppos = 1;
- while (asmsToExport.containsKey(npath)) {
- ppos++;
- npath = path + (exportFileNames ? "[" + ppos + "]" : "_" + ppos);
- exPath = path + "[" + ppos + "]";
- }
- ((ASMSource) realItem).setScriptName(exPath);
- asmsToExport.put(npath, (ASMSource) realItem);
- }
-
- if (treeItem instanceof TagScript) {
- TagScript tagScript = (TagScript) treeItem;
- for (TreeItem subItem : tagScript.getFrames()) {
- getASMs(exportFileNames, subItem, nodesToExport, exportAll, asmsToExport, path + File.separator + getASMPath(exportFileNames, subItem));
- }
- } else if (treeItem instanceof FrameScript) {
- FrameScript frameScript = (FrameScript) treeItem;
- Frame parentFrame = frameScript.getFrame();
- for (TreeItem subItem : parentFrame.actionContainers) {
- getASMs(exportFileNames, getASMWrapToTagScript(subItem), nodesToExport, exportAll || exportNode, asmsToExport, path + File.separator + getASMPath(exportFileNames, subItem));
- }
- for (TreeItem subItem : parentFrame.actions) {
- getASMs(exportFileNames, getASMWrapToTagScript(subItem), nodesToExport, exportAll || exportNode, asmsToExport, path + File.separator + getASMPath(exportFileNames, subItem));
- }
- } else if (treeItem instanceof AS2Package) {
- AS2Package as2Package = (AS2Package) treeItem;
- for (TreeItem subItem : as2Package.subPackages.values()) {
- getASMs(exportFileNames, subItem, nodesToExport, exportAll, asmsToExport, path + File.separator + getASMPath(exportFileNames, subItem));
- }
- for (TreeItem subItem : as2Package.scripts.values()) {
- getASMs(exportFileNames, subItem, nodesToExport, exportAll, asmsToExport, path + File.separator + getASMPath(exportFileNames, subItem));
- }
- }
- }
-
- private String getASMPath(boolean exportFileName, TreeItem treeItem) {
- if (!exportFileName) {
- return treeItem.toString();
- }
-
- String result;
- if (treeItem instanceof Exportable) {
- result = ((Exportable) treeItem).getExportFileName();
- } else {
- result = treeItem.toString();
- }
-
- return Helper.makeFileName(result);
- }
-
- private TreeItem getASMWrapToTagScript(TreeItem treeItem) {
- if (treeItem instanceof Tag) {
- Tag resultTag = (Tag) treeItem;
- List subNodes = new ArrayList<>();
- if (treeItem instanceof ASMSourceContainer) {
- for (ASMSource item : ((ASMSourceContainer) treeItem).getSubItems()) {
- subNodes.add(item);
- }
- }
-
- TagScript tagScript = new TagScript(treeItem.getSwf(), resultTag, subNodes);
- return tagScript;
- }
-
- return treeItem;
- }
-
- public List getFirstLevelASMNodes(Map tagScriptCache) {
- Timeline timeline = getTimeline();
- List subNodes = new ArrayList<>();
- List subFrames = new ArrayList<>();
- subNodes.addAll(timeline.getAS2RootPackage().subPackages.values());
- subNodes.addAll(timeline.getAS2RootPackage().scripts.values());
-
- for (Tag tag : timeline.otherTags) {
- boolean hasInnerFrames = false;
- List tagSubNodes = new ArrayList<>();
- if (tag instanceof Timelined) {
- Timeline timeline2 = ((Timelined) tag).getTimeline();
- for (Frame frame : timeline2.getFrames()) {
- if (!frame.actions.isEmpty() || !frame.actionContainers.isEmpty()) {
- FrameScript frameScript = new FrameScript(this, frame);
- tagSubNodes.add(frameScript);
- hasInnerFrames = true;
- }
- }
- }
-
- if (tag instanceof ASMSourceContainer) {
- for (ASMSource asm : ((ASMSourceContainer) tag).getSubItems()) {
- tagSubNodes.add(asm);
- }
- }
-
- if (!tagSubNodes.isEmpty()) {
- TagScript ts = new TagScript(this, tag, tagSubNodes);
- if (tagScriptCache != null) {
- tagScriptCache.put(tag, ts);
- }
- if (hasInnerFrames) {
- subFrames.add(ts);
- } else {
- subNodes.add(ts);
- }
- }
- }
-
- subNodes.addAll(subFrames);
- for (Frame frame : timeline.getFrames()) {
- if (!frame.actions.isEmpty() || !frame.actionContainers.isEmpty()) {
- FrameScript frameScript = new FrameScript(this, frame);
- subNodes.add(frameScript);
- }
- }
-
- return subNodes;
- }
-
- private final HashSet listeners = new HashSet<>();
-
- public final void addEventListener(EventListener listener) {
- listeners.add(listener);
- for (Tag t : getTags()) {
- if (t instanceof ABCContainerTag) {
- (((ABCContainerTag) t).getABC()).addEventListener(listener);
- }
- }
- }
-
- public final void removeEventListener(EventListener listener) {
- listeners.remove(listener);
- for (Tag t : getTags()) {
- if (t instanceof ABCContainerTag) {
- (((ABCContainerTag) t).getABC()).removeEventListener(listener);
- }
- }
- }
-
- protected void informListeners(String event, Object data) {
- for (EventListener listener : listeners) {
- listener.handleEvent(event, data);
- }
- }
-
- public static void populateVideoFrames(int streamId, Iterable tags, HashMap output) {
- for (Tag t : tags) {
- if (t instanceof VideoFrameTag) {
- VideoFrameTag videoFrameTag = (VideoFrameTag) t;
- if (videoFrameTag.streamID == streamId) {
- output.put(videoFrameTag.frameNum, (VideoFrameTag) t);
- }
- }
- if (t instanceof DefineSpriteTag) {
- populateVideoFrames(streamId, ((DefineSpriteTag) t).getTags(), output);
- }
- }
- }
-
- private static void writeLE(OutputStream os, long val, int size) throws IOException {
- for (int i = 0; i < size; i++) {
- os.write((int) (val & 0xff));
- val >>= 8;
- }
- }
-
- public static void createWavFromPcmData(OutputStream fos, int soundRateHz, boolean soundSize, boolean soundType, byte[] data) throws IOException {
- ByteArrayOutputStream subChunk1Data = new ByteArrayOutputStream();
- int audioFormat = 1; // PCM
- writeLE(subChunk1Data, audioFormat, 2);
- int numChannels = soundType ? 2 : 1;
- writeLE(subChunk1Data, numChannels, 2);
- int[] rateMap = {5512, 11025, 22050, 44100};
- int sampleRate = soundRateHz; // rateMap[soundRate];
- writeLE(subChunk1Data, sampleRate, 4);
- int bitsPerSample = soundSize ? 16 : 8;
- int byteRate = sampleRate * numChannels * bitsPerSample / 8;
- writeLE(subChunk1Data, byteRate, 4);
- int blockAlign = numChannels * bitsPerSample / 8;
- writeLE(subChunk1Data, blockAlign, 2);
- writeLE(subChunk1Data, bitsPerSample, 2);
-
- ByteArrayOutputStream chunks = new ByteArrayOutputStream();
- chunks.write(Utf8Helper.getBytes("fmt "));
- byte[] subChunk1DataBytes = subChunk1Data.toByteArray();
- writeLE(chunks, subChunk1DataBytes.length, 4);
- chunks.write(subChunk1DataBytes);
-
- chunks.write(Utf8Helper.getBytes("data"));
- writeLE(chunks, data.length, 4);
- chunks.write(data);
-
- fos.write(Utf8Helper.getBytes("RIFF"));
- byte[] chunkBytes = chunks.toByteArray();
- writeLE(fos, 4 + chunkBytes.length, 4);
- fos.write(Utf8Helper.getBytes("WAVE"));
- fos.write(chunkBytes);
- }
-
- public static String getTypePrefix(CharacterTag c) {
- if (c instanceof ShapeTag) {
- return "shape";
- }
- if (c instanceof MorphShapeTag) {
- return "morphshape";
- }
- if (c instanceof DefineSpriteTag) {
- return "sprite";
- }
- if (c instanceof TextTag) {
- return "text";
- }
- if (c instanceof ButtonTag) {
- return "button";
- }
- if (c instanceof FontTag) {
- return "font";
- }
- if (c instanceof ImageTag) {
- return "image";
- }
- return "character";
- }
-
- public static void writeLibrary(SWF fswf, Set library, OutputStream fos) throws IOException {
- for (int c : library) {
- CharacterTag ch = fswf.getCharacter(c);
- if (ch instanceof FontTag) {
- StringBuilder sb = new StringBuilder();
- sb.append("function ").append(getTypePrefix(ch)).append(c).append("(ctx,ch,textColor){\r\n");
- ((FontTag) ch).toHtmlCanvas(sb, 1);
- sb.append("}\r\n\r\n");
- fos.write(Utf8Helper.getBytes(sb.toString()));
- } else {
- if (ch instanceof ImageTag) {
- ImageTag image = (ImageTag) ch;
- ImageFormat format = image.getImageFormat();
- byte[] imageData = Helper.readStream(image.getImageData());
- String base64ImgData = Helper.byteArrayToBase64String(imageData);
- fos.write(Utf8Helper.getBytes("var imageObj" + c + " = document.createElement(\"img\");\r\nimageObj" + c + ".src=\"data:image/" + format + ";base64," + base64ImgData + "\";\r\n"));
- }
- fos.write(Utf8Helper.getBytes("function " + getTypePrefix(ch) + c + "(ctx,ctrans,frame,ratio,time){\r\n"));
- if (ch instanceof DrawableTag) {
- StringBuilder sb = new StringBuilder();
- ((DrawableTag) ch).toHtmlCanvas(sb, 1);
- fos.write(Utf8Helper.getBytes(sb.toString()));
- }
- fos.write(Utf8Helper.getBytes("}\r\n\r\n"));
- }
- }
- }
-
- private static void getVariables(ConstantPool constantPool, BaseLocalData localData, TranslateStack stack, List output, ActionGraphSource code, int ip, List> variables, List functions, HashMap strings, List visited, HashMap usageTypes, String path) throws InterruptedException {
- boolean debugMode = false;
- while ((ip > -1) && ip < code.size()) {
- if (visited.contains(ip)) {
- break;
- }
- GraphSourceItem ins = code.get(ip);
-
- if (debugMode) {
- System.err.println("Visit " + ip + ": ofs" + Helper.formatAddress(((Action) ins).getAddress()) + ":" + ((Action) ins).getASMSource(new ActionList(), new HashSet<>(), ScriptExportMode.PCODE) + " stack:" + Helper.stackToString(stack, LocalData.create(new ConstantPool())));
- }
- if (ins.isExit()) {
- break;
- }
- if (ins.isIgnored()) {
- ip++;
- continue;
- }
-
- String usageType = "name";
- GraphTargetItem name = null;
- if ((ins instanceof ActionGetVariable)
- || (ins instanceof ActionGetMember)
- || (ins instanceof ActionDefineLocal2)
- || (ins instanceof ActionNewMethod)
- || (ins instanceof ActionNewObject)
- || (ins instanceof ActionCallMethod)
- || (ins instanceof ActionCallFunction)) {
- if (stack.isEmpty()) {
- break;
- }
- name = stack.peek();
- }
-
- if ((ins instanceof ActionGetVariable) || (ins instanceof ActionDefineLocal2)) {
- usageType = "variable";
- }
- if (ins instanceof ActionGetMember) {
- usageType = "member";
- }
- if ((ins instanceof ActionNewMethod) || (ins instanceof ActionNewObject)) {
- usageType = "class";
- }
- if (ins instanceof ActionCallMethod) {
- usageType = "function"; // can there be method?
- }
- if (ins instanceof ActionCallFunction) {
- usageType = "function";
- }
-
- if ((ins instanceof ActionDefineFunction) || (ins instanceof ActionDefineFunction2)) {
- functions.add(ins);
- }
-
- if (ins instanceof GraphSourceItemContainer) {
- GraphSourceItemContainer cnt = (GraphSourceItemContainer) ins;
- List cntSizes = cnt.getContainerSizes();
- long addr = code.pos2adr(ip + 1);
- ip = code.adr2pos(addr);
- String cntName = cnt.getName();
- for (Long size : cntSizes) {
- if (size == 0) {
- continue;
- }
- ip = code.adr2pos(addr);
- addr += size;
- int nextip = code.adr2pos(addr);
- getVariables(variables, functions, strings, usageTypes, new ActionGraphSource(code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName));
- ip = nextip;
- }
- List> r = new ArrayList<>();
- r.add(new ArrayList<>());
- r.add(new ArrayList<>());
- r.add(new ArrayList<>());
- ((GraphSourceItemContainer) ins).translateContainer(r, ins, stack, output, new HashMap<>(), new HashMap<>(), new HashMap<>());
- continue;
- }
-
- if ((ins instanceof ActionSetVariable) || (ins instanceof ActionSetMember) || (ins instanceof ActionDefineLocal)) {
- if (stack.size() < 2) {
- break;
- }
- name = stack.get(stack.size() - 2);
- }
-
- if ((ins instanceof ActionSetVariable) || (ins instanceof ActionDefineLocal)) {
- usageType = "variable";
- }
-
- if (ins instanceof ActionSetMember) {
- usageType = "member";
- }
-
- if (name instanceof DirectValueActionItem) {
- variables.add(new MyEntry<>((DirectValueActionItem) name, constantPool));
- usageTypes.put((DirectValueActionItem) name, usageType);
- }
-
- // for..in return
- if (((ins instanceof ActionEquals) || (ins instanceof ActionEquals2)) && (stack.size() == 1) && (stack.peek() instanceof DirectValueActionItem)) {
- stack.push(new DirectValueActionItem(null, null, 0, Null.INSTANCE, new ArrayList<>()));
- }
-
- if (ins instanceof ActionConstantPool) {
- constantPool = new ConstantPool(((ActionConstantPool) ins).constantPool);
- }
- int staticOperation = Graph.SOP_USE_STATIC; //(Boolean) Configuration.getConfig("autoDeobfuscate", true) ? Graph.SOP_SKIP_STATIC : Graph.SOP_USE_STATIC;
-
- int requiredStackSize = ins.getStackPopCount(localData, stack);
- if (stack.size() < requiredStackSize) {
- // probably obfucated code, never executed branch
- break;
- }
-
- ins.translate(localData, stack, output, staticOperation, path);
- if (ins.isExit()) {
- break;
- }
-
- if (ins instanceof ActionPush) {
- if (!stack.isEmpty()) {
- GraphTargetItem top = stack.peek();
- if (top instanceof DirectValueActionItem) {
- DirectValueActionItem dvt = (DirectValueActionItem) top;
- if ((dvt.value instanceof String) || (dvt.value instanceof ConstantIndex)) {
- if (constantPool == null) {
- constantPool = new ConstantPool(dvt.constants);
- }
- strings.put(dvt, constantPool);
- }
- }
- }
- }
-
- if (ins.isBranch() || ins.isJump()) {
- if (ins instanceof ActionIf) {
- if (stack.isEmpty()) {
- break;
- }
- stack.pop();
- }
- visited.add(ip);
- List branches = ins.getBranches(code);
- for (int b : branches) {
- TranslateStack brStack = (TranslateStack) stack.clone();
- if (b >= 0) {
- getVariables(constantPool, localData, brStack, output, code, b, variables, functions, strings, visited, usageTypes, path);
- } else if (debugMode) {
- System.out.println("Negative branch:" + b);
- }
- }
- // }
- break;
- }
- ip++;
- }
- }
-
- private static void getVariables(List> variables, List functions, HashMap strings, HashMap usageTypes, ActionGraphSource code, int addr, String path) throws InterruptedException {
- ActionLocalData localData = new ActionLocalData();
- getVariables(null, localData, new TranslateStack(path), new ArrayList<>(), code, code.adr2pos(addr), variables, functions, strings, new ArrayList<>(), usageTypes, path);
- }
-
- private List> getVariables(List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes, ASMSource src, String path) throws InterruptedException {
- List> ret = new ArrayList<>();
- ActionList actions = src.getActions();
- actionsMap.put(src, actions);
- getVariables(variables, functions, strings, usageTypes, new ActionGraphSource(actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path);
- return ret;
- }
-
- private void getVariables(Iterable tags, String path, List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes) throws InterruptedException {
- List processed = new ArrayList<>();
- for (Tag t : tags) {
- String subPath = path + "/" + t.toString();
- if (t instanceof ASMSource) {
- addVariable((ASMSource) t, subPath, processed, variables, actionsMap, functions, strings, usageTypes);
- }
- if (t instanceof ASMSourceContainer) {
- List processed2 = new ArrayList<>();
- for (ASMSource asm : ((ASMSourceContainer) t).getSubItems()) {
- addVariable(asm, subPath + "/" + asm.toString(), processed2, variables, actionsMap, functions, strings, usageTypes);
- }
- }
- if (t instanceof DefineSpriteTag) {
- getVariables(((DefineSpriteTag) t).getTags(), path + "/" + t.toString(), variables, actionsMap, functions, strings, usageTypes);
- }
- }
- }
-
- private void addVariable(ASMSource asm, String path, List processed, List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes) throws InterruptedException {
- int pos = 1;
- String infPath2 = path;
- while (processed.contains(infPath2)) {
- pos++;
- infPath2 = path + "[" + pos + "]";
- }
- processed.add(infPath2);
- informListeners("getVariables", infPath2);
- getVariables(variables, actionsMap, functions, strings, usageTypes, asm, path);
- }
-
- public boolean as3StringConstantExists(String str) {
- for (ABCContainerTag abcTag : getAbcList()) {
- ABC abc = abcTag.getABC();
- for (int i = 1; i < abc.constants.getStringCount(); i++) {
- if (abc.constants.getString(i).equals(str)) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- public void fixAS3Code() {
- for (ABCContainerTag abcTag : getAbcList()) {
- ABC abc = abcTag.getABC();
- for (MethodBody body : abc.bodies) {
- AVM2Code code = body.getCode();
- body.setCodeBytes(code.getBytes());
- }
-
- ((Tag) abcTag).setModified(true);
- }
- }
-
- public int deobfuscateAS3Identifiers(RenameType renameType) {
- for (Tag tag : getTags()) {
- if (tag instanceof ABCContainerTag) {
- ((ABCContainerTag) tag).getABC().deobfuscateIdentifiers(deobfuscated, renameType, true);
- tag.setModified(true);
- }
- }
- for (Tag tag : getTags()) {
- if (tag instanceof ABCContainerTag) {
- ((ABCContainerTag) tag).getABC().deobfuscateIdentifiers(deobfuscated, renameType, false);
- tag.setModified(true);
- }
- }
- for (Tag tag : getTags()) {
- if (tag instanceof SymbolClassTag) {
- SymbolClassTag sc = (SymbolClassTag) tag;
- for (int i = 0; i < sc.names.size(); i++) {
- String newname = deobfuscation.deobfuscateNameWithPackage(true, sc.names.get(i), deobfuscated, renameType, deobfuscated);
- if (newname != null) {
- sc.names.set(i, newname);
- }
- }
- sc.setModified(true);
- }
- }
- deobfuscation.deobfuscateInstanceNames(true, deobfuscated, renameType, getTags(), new HashMap<>());
- return deobfuscated.size();
- }
-
- public int deobfuscateIdentifiers(RenameType renameType) throws InterruptedException {
- FileAttributesTag fileAttributes = getFileAttributes();
- if (fileAttributes == null) {
- int cnt = 0;
- cnt += deobfuscateAS2Identifiers(renameType);
- cnt += deobfuscateAS3Identifiers(renameType);
- return cnt;
- } else if (fileAttributes.actionScript3) {
- return deobfuscateAS3Identifiers(renameType);
- } else {
- return deobfuscateAS2Identifiers(renameType);
- }
- }
-
- public void renameAS2Identifier(String identifier, String newname) throws InterruptedException {
- Map selected = new HashMap<>();
- selected.put(DottedChain.parse(identifier), DottedChain.parse(newname));
- renameAS2Identifiers(null, selected);
- }
-
- private int deobfuscateAS2Identifiers(RenameType renameType) throws InterruptedException {
- return renameAS2Identifiers(renameType, null);
- }
-
- private int renameAS2Identifiers(RenameType renameType, Map selected) throws InterruptedException {
- HashMap actionsMap = new HashMap<>();
- List allFunctions = new ArrayList<>();
- List> allVariableNames = new ArrayList<>();
- HashMap allStrings = new HashMap<>();
- HashMap usageTypes = new HashMap<>();
-
- int ret = 0;
- getVariables(getTags(), "", allVariableNames, actionsMap, allFunctions, allStrings, usageTypes);
- informListeners("rename", "");
- int fc = 0;
- for (MyEntry it : allVariableNames) {
- String name = it.getKey().toStringNoH(it.getValue());
- deobfuscation.allVariableNamesStr.add(name);
- }
-
- informListeners("rename", "classes");
- int classCount = 0;
- for (Tag t : getTags()) {
- if (t instanceof DoInitActionTag) {
- classCount++;
- }
- }
- int cnt = 0;
- for (Tag t : getTags()) {
- if (t instanceof DoInitActionTag) {
- cnt++;
- informListeners("rename", "class " + cnt + "/" + classCount);
- DoInitActionTag dia = (DoInitActionTag) t;
- String exportName = getExportName(dia.spriteId);
- exportName = exportName != null ? exportName : "_unk_";
- final String pkgPrefix = "__Packages.";
- String[] classNameParts = null;
- if (exportName.startsWith(pkgPrefix)) {
- String className = exportName.substring(pkgPrefix.length());
- if (className.contains(".")) {
- classNameParts = className.split("\\.");
- } else {
- classNameParts = new String[]{className};
- }
- }
- int staticOperation = Graph.SOP_USE_STATIC; //(Boolean) Configuration.getConfig("autoDeobfuscate", true) ? Graph.SOP_SKIP_STATIC : Graph.SOP_USE_STATIC;
- List dec;
- try {
- dec = Action.actionsToTree(dia.getActions(), version, staticOperation, ""/*FIXME*/);
- } catch (EmptyStackException ex) {
- continue;
- }
- GraphTargetItem name = null;
- for (GraphTargetItem it : dec) {
- if (it instanceof ClassActionItem) {
- ClassActionItem cti = (ClassActionItem) it;
- List methods = new ArrayList<>();
- methods.addAll(cti.functions);
- methods.addAll(cti.staticFunctions);
-
- for (GraphTargetItem gti : methods) {
- if (gti instanceof FunctionActionItem) {
- FunctionActionItem fun = (FunctionActionItem) gti;
- if (fun.calculatedFunctionName instanceof DirectValueActionItem) {
- DirectValueActionItem dvf = (DirectValueActionItem) fun.calculatedFunctionName;
- String fname = dvf.toStringNoH(null);
- String changed = deobfuscation.deobfuscateName(false, fname, false, "method", deobfuscated, renameType, selected);
- if (changed != null) {
- deobfuscated.put(DottedChain.parse(fname), DottedChain.parse(changed));
- }
- }
- }
- }
-
- List vars = new ArrayList<>();
- for (MyEntry item : cti.vars) {
- vars.add(item.getKey());
- }
- for (MyEntry item : cti.staticVars) {
- vars.add(item.getKey());
- }
- for (GraphTargetItem gti : vars) {
- if (gti instanceof DirectValueActionItem) {
- DirectValueActionItem dvf = (DirectValueActionItem) gti;
- String vname = dvf.toStringNoH(null);
- String changed = deobfuscation.deobfuscateName(false, vname, false, "attribute", deobfuscated, renameType, selected);
- if (changed != null) {
- deobfuscated.put(DottedChain.parse(vname), DottedChain.parse(changed));
- }
- }
- }
-
- name = cti.className;
- break;
- }
- if (it instanceof InterfaceActionItem) {
- InterfaceActionItem ift = (InterfaceActionItem) it;
- name = ift.name;
- }
- }
-
- if (name != null) {
- int pos = 0;
- while (name instanceof GetMemberActionItem) {
- GetMemberActionItem mem = (GetMemberActionItem) name;
- GraphTargetItem memberName = mem.memberName;
- if (memberName instanceof DirectValueActionItem) {
- DirectValueActionItem dvt = (DirectValueActionItem) memberName;
- String nameStr = dvt.toStringNoH(null);
- if (classNameParts != null) {
- if (classNameParts.length - 1 - pos < 0) {
- break;
- }
- }
- String changedNameStr = nameStr;
- if (classNameParts != null) {
- changedNameStr = classNameParts[classNameParts.length - 1 - pos];
- }
- String changedNameStr2 = deobfuscation.deobfuscateName(false, changedNameStr, pos == 0, pos == 0 ? "class" : "package", deobfuscated, renameType, selected);
- if (changedNameStr2 != null) {
- changedNameStr = changedNameStr2;
- }
- ret++;
- deobfuscated.put(DottedChain.parse(nameStr), DottedChain.parse(changedNameStr));
- pos++;
- }
- name = mem.object;
- }
- if (name instanceof GetVariableActionItem) {
- GetVariableActionItem var = (GetVariableActionItem) name;
- if (var.name instanceof DirectValueActionItem) {
- DirectValueActionItem dvt = (DirectValueActionItem) var.name;
- String nameStr = dvt.toStringNoH(null);
- if (classNameParts != null) {
- if (classNameParts.length - 1 - pos < 0) {
- break;
- }
- }
- String changedNameStr = nameStr;
- if (classNameParts != null) {
- changedNameStr = classNameParts[classNameParts.length - 1 - pos];
- }
- String changedNameStr2 = deobfuscation.deobfuscateName(false, changedNameStr, pos == 0, pos == 0 ? "class" : "package", deobfuscated, renameType, selected);
- if (changedNameStr2 != null) {
- changedNameStr = changedNameStr2;
- }
- ret++;
- deobfuscated.put(DottedChain.parse(nameStr), DottedChain.parse(changedNameStr));
- pos++;
- }
- }
- }
- t.setModified(true);
- }
- }
-
- for (GraphSourceItem fun : allFunctions) {
- fc++;
- informListeners("rename", "function " + fc + "/" + allFunctions.size());
- if (fun instanceof ActionDefineFunction) {
- ActionDefineFunction f = (ActionDefineFunction) fun;
- if (f.functionName.isEmpty()) { // anonymous function, leave as is
- continue;
- }
- String changed = deobfuscation.deobfuscateName(false, f.functionName, false, "function", deobfuscated, renameType, selected);
- if (changed != null) {
- f.replacedFunctionName = changed;
- ret++;
- }
- }
- if (fun instanceof ActionDefineFunction2) {
- ActionDefineFunction2 f = (ActionDefineFunction2) fun;
- if (f.functionName.isEmpty()) { // anonymous function, leave as is
- continue;
- }
- String changed = deobfuscation.deobfuscateName(false, f.functionName, false, "function", deobfuscated, renameType, selected);
- if (changed != null) {
- f.replacedFunctionName = changed;
- ret++;
- }
- }
- }
-
- HashSet stringsNoVarH = new HashSet<>();
- List allVariableNamesDv = new ArrayList<>();
- for (MyEntry it : allVariableNames) {
- allVariableNamesDv.add(it.getKey());
- }
- for (DirectValueActionItem ti : allStrings.keySet()) {
- if (!allVariableNamesDv.contains(ti)) {
- stringsNoVarH.add(System.identityHashCode(allStrings.get(ti)) + "_" + ti.toStringNoH(allStrings.get(ti)));
- }
- }
-
- int vc = 0;
- for (MyEntry it : allVariableNames) {
- vc++;
- String name = it.getKey().toStringNoH(it.getValue());
- String changed = deobfuscation.deobfuscateName(false, name, false, usageTypes.get(it.getKey()), deobfuscated, renameType, selected);
- if (changed != null) {
- boolean addNew = false;
- String h = System.identityHashCode(it.getKey()) + "_" + name;
- if (stringsNoVarH.contains(h)) {
- addNew = true;
- }
- ActionPush pu = (ActionPush) it.getKey().getSrc();
- if (pu.replacement == null) {
- pu.replacement = new ArrayList<>();
- pu.replacement.addAll(pu.values);
- }
- if (pu.replacement.get(it.getKey().pos) instanceof ConstantIndex) {
- ConstantIndex ci = (ConstantIndex) pu.replacement.get(it.getKey().pos);
- ConstantPool pool = it.getValue();
- if (pool == null) {
- continue;
- }
- if (pool.constants == null) {
- continue;
- }
- if (addNew) {
- pool.constants.add(changed);
- ci.index = pool.constants.size() - 1;
- } else {
- pool.constants.set(ci.index, changed);
- }
- } else {
- pu.replacement.set(it.getKey().pos, changed);
- }
- ret++;
- }
- }
-
- for (ASMSource src : actionsMap.keySet()) {
- actionsMap.get(src).removeNops();
- src.setActions(actionsMap.get(src));
- src.setModified();
- }
-
- deobfuscation.deobfuscateInstanceNames(false, deobfuscated, renameType, getTags(), selected);
- return ret;
- }
-
- public IdentifiersDeobfuscation getDeobfuscation() {
- return deobfuscation;
- }
-
- public void exportFla(AbortRetryIgnoreHandler handler, String outfile, String swfName, String generator, String generatorVerName, String generatorVersion, boolean parallel, FLAVersion version) throws IOException, InterruptedException {
- XFLExportSettings settings = new XFLExportSettings();
- settings.compressed = true;
- exportXfl(handler, outfile, swfName, generator, generatorVerName, generatorVersion, parallel, version, settings);
- }
-
- public void exportXfl(AbortRetryIgnoreHandler handler, String outfile, String swfName, String generator, String generatorVerName, String generatorVersion, boolean parallel, FLAVersion version) throws IOException, InterruptedException {
- XFLExportSettings settings = new XFLExportSettings();
- settings.compressed = false;
- exportXfl(handler, outfile, swfName, generator, generatorVerName, generatorVersion, parallel, version, settings);
- }
-
- public void exportXfl(AbortRetryIgnoreHandler handler, String outfile, String swfName, String generator, String generatorVerName, String generatorVersion, boolean parallel, FLAVersion version, XFLExportSettings settings) throws IOException, InterruptedException {
- new XFLConverter().convertSWF(handler, this, swfName, outfile, settings, generator, generatorVerName, generatorVersion, parallel, version);
- clearAllCache();
- }
-
- public static AffineTransform matrixToTransform(MATRIX mat) {
- return new AffineTransform(mat.getScaleXFloat(), mat.getRotateSkew0Float(),
- mat.getRotateSkew1Float(), mat.getScaleYFloat(),
- mat.translateX, mat.translateY);
- }
-
- public SerializableImage getFromCache(String key) {
- if (frameCache.contains(key)) {
- return frameCache.get(key);
- }
- return null;
- }
-
- public byte[] getFromCache(SoundTag soundTag) {
- if (soundCache.contains(soundTag)) {
- return soundCache.get(soundTag);
- }
- return null;
- }
-
- public void putToCache(String key, SerializableImage img) {
- if (Configuration.useFrameCache.get()) {
- frameCache.put(key, img);
- }
- }
-
- public void putToCache(SoundTag soundTag, byte[] data) {
- soundCache.put(soundTag, data);
- }
-
- public void clearImageCache() {
- frameCache.clear();
- rectCache.clear();
- for (Tag tag : getTags()) {
- if (tag instanceof ImageTag) {
- ((ImageTag) tag).clearCache();
- }
- else if (tag instanceof DefineCompactedFont) {
- ((DefineCompactedFont) tag).rebuildShapeCache();
- }
- }
- }
-
- public void clearScriptCache() {
- as2PcodeCache.clear();
- as2Cache.clear();
- as3Cache.clear();
- IdentifiersDeobfuscation.clearCache();
- }
-
- public void clearReadOnlyListCache() {
- readOnlyTags = null;
- for (Tag tag : tags) {
- if (tag instanceof DefineSpriteTag) {
- ((DefineSpriteTag) tag).clearReadOnlyListCache();
- }
- }
- }
-
- public static void clearAllStaticCache() {
- Cache.clearAll();
- Helper.clearShapeCache();
- System.gc();
- }
-
- public void clearAllCache() {
- characters = null;
- characterIdTags = null;
- abcList = null;
- timeline = null;
- clearReadOnlyListCache();
- clearImageCache();
- clearScriptCache();
- clearAllStaticCache();
- }
-
- public static void uncache(ASMSource src) {
- if (src != null) {
- SWF swf = src.getSwf();
- swf.as2Cache.remove(src);
- swf.as2PcodeCache.remove(src);
- }
- }
-
- public static void uncache(ScriptPack pack) {
- if (pack != null) {
- pack.getSwf().as3Cache.remove(pack);
- }
- }
-
- public static boolean isCached(ASMSource src) {
- return src.getSwf().as2Cache.contains(src);
- }
-
- public static boolean isCached(ScriptPack pack) {
- return pack.getSwf().as3Cache.contains(pack);
- }
-
- public static ActionList getCachedActionList(ASMSource src, final List listeners) throws InterruptedException {
- synchronized (src) {
- SWF swf = src.getSwf();
- int deobfuscationMode = Configuration.autoDeobfuscate.get() ? 1 : 0;
- if (swf != null && swf.as2PcodeCache.contains(src)) {
- ActionList result = swf.as2PcodeCache.get(src);
- if (result.deobfuscationMode == deobfuscationMode) {
- return result;
- }
- }
-
- try {
- ByteArrayRange actionBytes = src.getActionBytes();
- int prevLength = actionBytes.getPos();
- SWFInputStream rri = new SWFInputStream(swf, actionBytes.getArray());
- if (prevLength != 0) {
- rri.seek(prevLength);
- }
-
- int version = swf == null ? SWF.DEFAULT_VERSION : swf.version;
- ActionList list = ActionListReader.readActionListTimeout(listeners, rri, version, prevLength, prevLength + actionBytes.getLength(), src.toString()/*FIXME?*/, deobfuscationMode);
- list.fileData = actionBytes.getArray();
- list.deobfuscationMode = deobfuscationMode;
- if (swf != null) {
- swf.as2PcodeCache.put(src, list);
- }
-
- return list;
- } catch (InterruptedException ex) {
- throw ex;
- } catch (Exception ex) {
- logger.log(Level.SEVERE, null, ex);
- return new ActionList();
- }
- }
- }
-
- public static CachedScript getFromCache(ASMSource src) {
- SWF swf = src.getSwf();
- if (swf.as2Cache.contains(src)) {
- return swf.as2Cache.get(src);
- }
-
- return null;
- }
-
- public static CachedScript getCached(ASMSource src, ActionList actions) throws InterruptedException {
- SWF swf = src.getSwf();
- if (swf.as2Cache.contains(src)) {
- return swf.as2Cache.get(src);
- }
-
- if (actions == null) {
- actions = src.getActions();
- }
-
- HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), true);
- writer.startFunction("!script");
- Action.actionsToSource(src, actions, src.toString()/*FIXME?*/, writer);
- writer.endFunction();
- List hilights = writer.instructionHilights;
- List methodHilights = writer.methodHilights;
- List classHilights = writer.classHilights;
- List specialHilights = writer.specialHilights;
-
- String srcNoHex = writer.toString();
- CachedScript res = new CachedScript(srcNoHex, hilights, methodHilights, classHilights, specialHilights);
- swf.as2Cache.put(src, res);
- return res;
- }
-
- public static CachedDecompilation getCached(ScriptPack pack) throws InterruptedException {
- SWF swf = pack.getSwf();
- if (swf.as3Cache.contains(pack)) {
- return swf.as3Cache.get(pack);
- }
-
- int scriptIndex = pack.scriptIndex;
- ScriptInfo script = null;
- if (scriptIndex > -1) {
- script = pack.abc.script_info.get(scriptIndex);
- }
- boolean parallel = Configuration.parallelSpeedUp.get();
- HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), true);
- pack.toSource(writer, script == null ? null : script.traits.traits, new ConvertData(), ScriptExportMode.AS, parallel);
- HighlightedText hilightedCode = new HighlightedText(writer);
- CachedDecompilation res = new CachedDecompilation(hilightedCode);
- swf.as3Cache.put(pack, res);
-
- return res;
- }
-
- public Cache getRectCache() {
- return rectCache;
- }
-
- public Cache getShapeExportDataCache() {
- return shapeExportDataCache;
- }
-
- public static RECT fixRect(RECT rect) {
- RECT ret = new RECT();
- ret.Xmin = rect.Xmin;
- ret.Xmax = rect.Xmax;
- ret.Ymin = rect.Ymin;
- ret.Ymax = rect.Ymax;
-
- if (ret.Xmax <= 0) {
- ret.Xmax = ret.getWidth();
- ret.Xmin = 0;
- }
- if (ret.Ymax <= 0) {
- ret.Ymax = ret.getHeight();
- ret.Ymin = 0;
- }
- if (ret.Xmin < 0) {
- ret.Xmax += (-ret.Xmin);
- ret.Xmin = 0;
- }
- if (ret.Ymin < 0) {
- ret.Ymax += (-ret.Ymin);
- ret.Ymin = 0;
- }
-
- if (ret.getWidth() < 1 || ret.getHeight() < 1) {
- ret.Xmin = 0;
- ret.Ymin = 0;
- ret.Xmax = 20;
- ret.Ymax = 20;
- }
- return ret;
- }
-
- public static SerializableImage frameToImageGet(Timeline timeline, int frame, int time, Point cursorPosition, int mouseButton, RECT displayRect, Matrix transformation, ColorTransform colorTransform, Color backGroundColor, double zoom) {
- if (timeline.getFrameCount() == 0) {
- return new SerializableImage(1, 1, SerializableImage.TYPE_INT_ARGB_PRE);
- }
-
- RECT rect = displayRect;
- SerializableImage image = new SerializableImage((int) (rect.getWidth() * zoom / SWF.unitDivisor) + 1,
- (int) (rect.getHeight() * zoom / SWF.unitDivisor) + 1, SerializableImage.TYPE_INT_ARGB_PRE);
- if (backGroundColor == null) {
- image.fillTransparent();
- } else {
- Graphics2D g = (Graphics2D) image.getBufferedImage().getGraphics();
- g.setComposite(AlphaComposite.Src);
- g.setColor(backGroundColor);
- g.fill(new Rectangle(image.getWidth(), image.getHeight()));
- }
-
- Matrix m = transformation.clone();
- m.translate(-rect.Xmin * zoom, -rect.Ymin * zoom);
- m.scale(zoom);
- RenderContext renderContext = new RenderContext();
- renderContext.cursorPosition = cursorPosition;
- renderContext.mouseButton = mouseButton;
- timeline.toImage(frame, time, renderContext, image, false, m, transformation, m, colorTransform);
-
- return image;
- }
-
- private void removeTagWithDependenciesFromTimeline(Tag toRemove, Timeline timeline) {
- Map stage = new HashMap<>();
- Set dependingChars = new HashSet<>();
- Timelined timelined = timeline.timelined;
- ReadOnlyTagList tags = timelined.getTags();
- if (toRemove instanceof CharacterTag) {
- int characterId = ((CharacterTag) toRemove).getCharacterId();
-
- if (characterId != 0) {
- dependingChars.add(characterId);
- for (int i = 0; i < tags.size(); i++) {
- Tag t = tags.get(i);
- if (t instanceof CharacterIdTag) {
- CharacterIdTag c = (CharacterIdTag) t;
- Set needed = new HashSet<>();
- t.getNeededCharacters(needed);
- if (needed.contains(characterId)) {
- dependingChars.add(c.getCharacterId());
- }
- }
- }
- }
- }
-
- for (int i = 0; i < tags.size(); i++) {
- Tag t = tags.get(i);
- if (t instanceof RemoveTag) {
- RemoveTag rt = (RemoveTag) t;
- int depth = rt.getDepth();
- if (stage.containsKey(depth)) {
- int currentCharId = stage.get(depth);
- stage.remove(depth);
- if (dependingChars.contains(currentCharId)) {
- timelined.removeTag(i);
- i--;
- continue;
- }
- }
- }
- if (t instanceof PlaceObjectTypeTag) {
- PlaceObjectTypeTag po = (PlaceObjectTypeTag) t;
- int placeCharId = po.getCharacterId();
- int depth = po.getDepth();
- if (placeCharId != 0) {
- stage.put(depth, placeCharId);
- if (dependingChars.contains(placeCharId)) {
- timelined.removeTag(i);
- i--;
- continue;
- }
- }
- }
- if (t instanceof CharacterIdTag) {
- CharacterIdTag c = (CharacterIdTag) t;
- if (dependingChars.contains(c.getCharacterId())) {
- timelined.removeTag(i);
- i--;
- continue;
- }
- }
- Set needed = new HashSet<>();
- t.getNeededCharacters(needed);
- for (int dep : dependingChars) {
- if (needed.contains(dep)) {
- timelined.removeTag(i);
- i--;
- //continue;
- }
- }
- if (t == toRemove) {
- timelined.removeTag(i);
- i--;
- continue;
- }
- if (t instanceof Timelined) {
- removeTagWithDependenciesFromTimeline(toRemove, ((Timelined) t).getTimeline());
- }
- }
- }
-
- private boolean removeTagFromTimeline(Tag toRemove, Timeline timeline) {
- boolean modified = false;
- int characterId = -1;
- if (toRemove instanceof CharacterTag) {
- characterId = ((CharacterTag) toRemove).getCharacterId();
- modified = timeline.removeCharacter(characterId);
- }
- Timelined timelined = timeline.timelined;
- ReadOnlyTagList tags = timelined.getTags();
- for (int i = 0; i < tags.size(); i++) {
- Tag t = tags.get(i);
- if (t == toRemove) {
- timelined.removeTag(t);
- i--;
- continue;
- }
-
- if (toRemove instanceof CharacterTag) {
- if (t.removeCharacter(characterId)) {
- modified = true;
- i = -1;
- continue;
- }
- }
-
- if (t instanceof DefineSpriteTag) {
- DefineSpriteTag spr = (DefineSpriteTag) t;
- boolean sprModified = removeTagFromTimeline(toRemove, spr.getTimeline());
- if (sprModified) {
- spr.setModified(true);
- }
- modified |= sprModified;
- }
- }
- return modified;
- }
-
- public void removeTags(Collection tags, boolean removeDependencies) {
- Set timelineds = new HashSet<>();
- for (Tag tag : tags) {
- Timelined timelined = tag.getTimelined();
- timelineds.add(timelined);
- removeTagInternal(timelined, tag, removeDependencies);
- }
-
- for (Timelined timelined : timelineds) {
- resetTimelines(timelined);
- }
-
- updateCharacters();
- clearImageCache();
- }
-
- @Override
- public void removeTag(int index) {
- setModified(true);
- tags.remove(index);
- updateCharacters();
- }
-
- @Override
- public void removeTag(Tag tag) {
- setModified(true);
- tags.remove(tag);
- updateCharacters();
- }
-
- public void removeTag(Tag tag, boolean removeDependencies) {
- Timelined timelined = tag.getTimelined();
- removeTagInternal(timelined, tag, removeDependencies);
- resetTimelines(timelined);
- updateCharacters();
- clearImageCache();
- }
-
- private void removeTagInternal(Timelined timelined, Tag tag, boolean removeDependencies) {
- if (tag instanceof ShowFrameTag || ShowFrameTag.isNestedTagType(tag.getId())) {
- timelined.removeTag(tag);
- timelined.setModified(true);
- timelined.resetTimeline();
- } else // timeline should be always the swf here
- if (removeDependencies) {
- removeTagWithDependenciesFromTimeline(tag, timelined.getTimeline());
- timelined.setModified(true);
- } else {
- boolean modified = removeTagFromTimeline(tag, timelined.getTimeline());
- if (modified) {
- timelined.setModified(true);
- }
- }
- }
-
- @Override
- public ReadOnlyTagList getTags() {
- if (readOnlyTags == null) {
- readOnlyTags = new ReadOnlyTagList(tags);
- }
-
- return readOnlyTags;
- }
-
- public ReadOnlyTagList getLocalTags() {
- List localTags = new ArrayList<>();
- for (Tag t : tags) {
- if (!t.isImported()) {
- localTags.add(t);
- }
- }
- return new ReadOnlyTagList(localTags);
- }
-
- /**
- * Adds a tag to the SWF
- *
- * @param tag
- */
- @Override
- public void addTag(Tag tag) {
- setModified(true);
- tags.add(tag);
- updateCharacters();
- }
-
- /**
- * Adds a tag to the SWF
- *
- * @param index
- * @param tag
- */
- @Override
- public void addTag(int index, Tag tag) {
- setModified(true);
- tags.add(index, tag);
- updateCharacters();
- }
-
- /**
- * Replaces a tag in the SWF
- *
- * @param oldTag
- * @param newTag
- */
- public void replaceTag(Tag oldTag, Tag newTag) {
- setModified(true);
- int index = tags.indexOf(oldTag);
- if (index != -1) {
- tags.set(index, newTag);
- updateCharacters();
- }
- }
-
- /**
- * Adds a tag to the SWF If targetTreeItem is: - Frame: adds the tag to the
- * Frame. Frame can be a frame of the main timeline or a DefineSprite frame
- * - DefineSprite: adds the tag to the end of the DefineSprite's tag list -
- * Any other tag in the SWF: adds the new tag exactly before the specified
- * tag - Other: adds the tag to the end of the SWF's tag list
- *
- * @param tag
- * @param targetTreeItem
- */
- public void addTag(Tag tag, TreeItem targetTreeItem) {
- SWF swf = tag.getSwf();
- Frame frame = targetTreeItem instanceof Frame ? (Frame) targetTreeItem : null;
- Timelined timelined;
- if (frame != null) {
- timelined = frame.timeline.timelined;
- } else {
- timelined = swf.getTimelined(targetTreeItem);
- }
-
- tag.setTimelined(timelined);
-
- ReadOnlyTagList tags = timelined.getTags();
-
- int index;
- if (frame != null) {
- if (frame.showFrameTag != null) {
- index = tags.indexOf(frame.showFrameTag);
- } else {
- index = -1;
- }
- } else if (timelined instanceof DefineSpriteTag) {
- index = -1;
- } else if (targetTreeItem instanceof Tag) {
- if (tag instanceof CharacterIdTag && !(tag instanceof CharacterTag) && targetTreeItem instanceof CharacterTag) {
- ((CharacterIdTag) tag).setCharacterId(((CharacterTag) targetTreeItem).getCharacterId());
- }
-
- index = tags.indexOf((Tag) targetTreeItem); // todo: honfika: why not index + 1?
- } else {
- index = -1;
- if (tag instanceof CharacterTag) {
- // add before the last ShowFrame tag
- for (int i = tags.size() - 1; i >= 0; i--) {
- if (tags.get(i) instanceof ShowFrameTag) {
- index = i;
- break;
- }
- }
- }
- }
-
- if (index > -1) {
- timelined.addTag(index, tag);
- } else {
- timelined.addTag(tag);
- }
-
- timelined.resetTimeline();
-
- if (timelined instanceof DefineSpriteTag) {
- DefineSpriteTag sprite = (DefineSpriteTag) timelined;
- sprite.frameCount = timelined.getTimeline().getFrameCount();
- }
- }
-
- public Timelined getTimelined(TreeItem treeItem) {
- if (treeItem instanceof Frame) {
- return ((Frame) treeItem).timeline.timelined;
- }
-
- if (treeItem instanceof DefineSpriteTag) {
- return (DefineSpriteTag) treeItem;
- }
-
- return treeItem.getSwf();
- }
-
- public void packCharacterIds() {
- int maxId = getNextCharacterId();
- int id = 1;
- for (int i = 1; i < maxId; i++) {
- CharacterTag charactertag = getCharacter(i);
- if (charactertag != null) {
- if (i != id) {
- replaceCharacter(i, id);
- }
- id++;
- } else {
- // make sure that the id is not referenced in the tags
- replaceCharacter(i, 0);
- }
- }
- }
-
- public void sortCharacterIds() {
- int maxId = Math.max(tags.size(), getNextCharacterId());
- int id = maxId;
- // first set the chatacter ids to surely not used ids
- for (Tag tag : getTags()) {
- if (tag instanceof CharacterTag) {
- CharacterTag characterTag = (CharacterTag) tag;
- replaceCharacter(characterTag.getCharacterId(), id++);
- }
- }
- // then set them to 1,2,3...
- id = 1;
- for (Tag tag : getTags()) {
- if (tag instanceof CharacterTag) {
- CharacterTag characterTag = (CharacterTag) tag;
- replaceCharacter(characterTag.getCharacterId(), id++);
- }
- }
- }
-
- public boolean replaceCharacter(int oldCharacterId, int newCharacterId) {
- boolean modified = false;
- for (Tag tag : getTags()) {
- boolean modified2 = false;
- if (tag instanceof CharacterIdTag) {
- CharacterIdTag characterIdTag = (CharacterIdTag) tag;
- if (characterIdTag.getCharacterId() == oldCharacterId) {
- characterIdTag.setCharacterId(newCharacterId);
- modified2 = true;
- }
- }
- modified2 |= tag.replaceCharacter(oldCharacterId, newCharacterId);
- if (modified2) {
- tag.setModified(true);
- }
- modified |= modified2;
- }
- return modified;
- }
-
- public void replaceCharacterTags(CharacterTag characterTag, int newCharacterId) {
- int characterId = characterTag.getCharacterId();
- CharacterTag newCharacter = getCharacter(newCharacterId);
- newCharacter.setCharacterId(characterId);
- characterTag.setCharacterId(newCharacterId);
- newCharacter.setModified(true);
- characterTag.setModified(true);
-
- assignExportNamesToSymbols();
- assignClassesToSymbols();
- clearImageCache();
- updateCharacters();
- }
-
- @Override
- public String toString() {
- return getShortFileName();
- }
-
- public void deobfuscate(DeobfuscationLevel level) throws InterruptedException {
- List atags = getAbcList();
-
- for (ABCContainerTag tag : atags) {
- if (level == DeobfuscationLevel.LEVEL_REMOVE_DEAD_CODE) {
- tag.getABC().removeDeadCode();
- } else if (level == DeobfuscationLevel.LEVEL_REMOVE_TRAPS) {
- tag.getABC().removeTraps();
- } else if (level == DeobfuscationLevel.LEVEL_RESTORE_CONTROL_FLOW) {
- tag.getABC().removeTraps();
- }
-
- ((Tag) tag).setModified(true);
- }
- }
-
- /**
- * Enables debugging. Adds tags to enable debugging and optinally injects
- * debugline and debugfile instructions to AS3 code by decompiling it first
- *
- * @param injectAS3Code Modify AS3 code with debugfile / debugline ?
- * @param decompileDir Directory to virtual decompile (will affect
- * debugfile)
- */
- public void enableDebugging(boolean injectAS3Code, File decompileDir) {
- enableDebugging(injectAS3Code, decompileDir, false);
- }
-
- /**
- * Enables debugging. Adds tags to enable debugging.
- */
- public void enableDebugging() {
- enableDebugging(false, null, false);
- }
-
- /**
- * Enables debugging. Adds tags to enable debugging and injects debugline
- * and debugfile instructions to AS3 code. Optionally enables Telemetry
- *
- * @param injectAS3Code Modify AS3 code with debugfile / debugline ?
- * @param decompileDir Directory to virtual decompile (will affect
- * debugfile)
- * @param telemetry Enable telemetry info?
- */
- public void enableDebugging(boolean injectAS3Code, File decompileDir, boolean telemetry) {
- enableDebugging(injectAS3Code, decompileDir, telemetry, false);
- }
-
- /**
- * Injects debugline and debugfile instructions to AS3 P-code (lines of
- * P-code)
- */
- public void injectAS3PcodeDebugInfo() {
- List packs = getAS3Packs();
- for (ScriptPack s : packs) {
- int abcIndex = s.allABCs.indexOf(s.abc);
- if (s.isSimple) {
- s.injectPCodeDebugInfo(abcIndex);
- }
- }
- }
-
- /**
- * Injects debugline and debugfile instructions to AS3 code
- *
- * @param decompileDir Directory to set file information paths
- */
- public void injectAS3DebugInfo(File decompileDir) {
- List packs = getAS3Packs();
- for (ScriptPack s : packs) {
- if (s.isSimple) {
- s.injectDebugInfo(decompileDir);
- }
- }
- }
-
- /**
- * Enables debugging. Adds tags to enable debugging and injects debugline
- * and debugfile instructions to AS3 code. Optionally enables Telemetry
- *
- * @param injectAS3Code Modify AS3 code with debugfile / debugline ?
- * @param decompileDir Directory to virtual decompile (will affect
- * debugfile)
- * @param telemetry Enable telemetry info?
- * @param pcodeLevel inject Pcode lines instead of decompiled lines
- */
- public void enableDebugging(boolean injectAS3Code, File decompileDir, boolean telemetry, boolean pcodeLevel) {
-
- if (injectAS3Code) {
- if (pcodeLevel) {
- injectAS3PcodeDebugInfo();
- } else {
- injectAS3DebugInfo(decompileDir);
- }
- }
-
- int pos = 0;
-
- boolean hasEnabled = false;
-
- for (int i = 0; i < tags.size(); i++) {
- Tag t = tags.get(i);
- if (t instanceof MetadataTag) {
- pos = i + 1;
- }
- if (t instanceof FileAttributesTag) {
- pos = i + 1;
- }
- if (version >= 6 && (t instanceof EnableDebugger2Tag)) {
- hasEnabled = true;
- break;
- }
- if (version == 5 && (t instanceof EnableDebuggerTag)) {
- hasEnabled = true;
- break;
- }
- if (version < 5 && (t instanceof ProtectTag)) {
- hasEnabled = true;
- break;
- }
- }
-
- if (!hasEnabled) {
- if (version >= 6) {
- tags.add(pos, new EnableDebugger2Tag(this));
- } else if (version == 5) {
- tags.add(pos, new EnableDebuggerTag(this));
- } else {
- tags.add(pos, new ProtectTag(this));
- }
- }
-
- getOrAddDebugId();
- }
-
- /**
- * Finds DebugID tag
- *
- * @return the tag or null if not found
- */
- public DebugIDTag getDebugId() {
- for (Tag t : getTags()) {
- if (t instanceof DebugIDTag) {
- return (DebugIDTag) t;
- }
- }
- return null;
- }
-
- /**
- * Finds DebugID tag and generates new one if none exists
- *
- * @return the tag or null if there is not debugging enabled in the swf file
- */
- public DebugIDTag getOrAddDebugId() {
- DebugIDTag r = getDebugId();
- if (r == null) {
- for (int i = 0; i < tags.size(); i++) {
- Tag t = tags.get(i);
- if ((t instanceof EnableDebuggerTag) || (t instanceof EnableDebugger2Tag)) {
- r = new DebugIDTag(this);
- tags.add(i + 1, r);
- new Random().nextBytes(r.debugId);
- break;
- }
- }
- }
- return r;
- }
-
- public boolean generatePCodeSwdFile(File file, Map> breakpoints) throws IOException {
- DebugIDTag dit = getDebugId();
- if (dit == null) {
- return false;
- }
- List items = new ArrayList<>();
- Map asms = getASMs(true);
-
- try {
- items.add(new SWD.DebugId(dit.debugId));
-
- } catch (Throwable t) {
- logger.log(Level.SEVERE, "message", t);
- return false;
- }
-
- int moduleId = 0;
- List names = new ArrayList<>(asms.keySet());
- Collections.sort(names);
- for (String name : names) {
- moduleId++;
- String sname = "#PCODE " + name;
- int bitmap = SWD.bitmapAction;
- items.add(new SWD.DebugScript(moduleId, bitmap, sname, ""));
-
- HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), true);
- try {
- asms.get(name).getASMSource(ScriptExportMode.PCODE, writer, asms.get(name).getActions());
- } catch (InterruptedException ex) {
- logger.log(Level.SEVERE, null, ex);
- }
- List hls = writer.instructionHilights;
-
- Map offsetToLine = new TreeMap<>();
- String txt = writer.toString();
- txt = txt.replace("\r", "");
- int line = 1;
- for (int i = 0; i < txt.length(); i++) {
- Highlighting h = Highlighting.searchPos(hls, i);
- if (h != null) {
- int of = (int) h.getProperties().fileOffset;
- if (of > -1 && !offsetToLine.containsKey(of) && !offsetToLine.containsValue(line)) {
- offsetToLine.put(of, line);
- }
- }
- if (txt.charAt(i) == '\n') {
- line++;
- }
- }
-
- for (int ofs : offsetToLine.keySet()) {
- items.add(new SWD.DebugOffset(moduleId, offsetToLine.get(ofs), ofs));
- }
-
- if (breakpoints.containsKey(sname)) {
- Set bplines = breakpoints.get(sname);
- for (int bpline : bplines) {
- if (offsetToLine.containsValue(bpline)) {
- try {
- SWD.DebugBreakpoint dbp = new SWD.DebugBreakpoint(moduleId, bpline);
- items.add(dbp);
- } catch (IllegalArgumentException iex) {
- logger.log(Level.WARNING, "Cannot generate breakpoint to SWD: {0}", iex.getMessage());
- }
- }
- }
- }
- }
-
- SWD swd = new SWD(7, items);
- try (FileOutputStream fis = new FileOutputStream(file)) {
- swd.saveTo(fis);
- }
- return true;
- }
-
- public boolean generateSwdFile(File file, Map> breakpoints) throws IOException {
- DebugIDTag dit = getDebugId();
- if (dit == null) {
- return false;
- }
- List items = new ArrayList<>();
- Map asms = getASMs(true);
-
- try {
- items.add(new SWD.DebugId(dit.debugId));
-
- int moduleId = 0;
- List names = new ArrayList<>(asms.keySet());
- Collections.sort(names);
- for (String name : names) {
- List regitems = new ArrayList<>();
- moduleId++;
- CachedScript cs;
- try {
- cs = SWF.getCached(asms.get(name), asms.get(name).getActions());
- } catch (InterruptedException ex) {
- return false;
- }
- String txt = cs.text.replace("\r", "");
- int line = 1;
- Map lineToOffset = new HashMap<>();
- Map regNames = new HashMap<>();
-
- for (int pos = 0; pos < txt.length(); pos++) {
- Highlighting h = Highlighting.searchPos(cs.hilights, pos);
- if (h != null) {
-
- int firstLineOffset = (int) h.getProperties().firstLineOffset;
- if (firstLineOffset > -1 && h.getProperties().declaration && h.getProperties().regIndex > -1 && (!regNames.containsKey(h.getProperties().regIndex) || !regNames.get(h.getProperties().regIndex).equals(h.getProperties().localName))) {
- regNames.put(h.getProperties().regIndex, h.getProperties().localName);
-
- List curRegIndexes = new ArrayList<>(regNames.keySet());
- List curRegNames = new ArrayList<>();
- for (int i = 0; i < curRegIndexes.size(); i++) {
- curRegNames.add(regNames.get(curRegIndexes.get(i)));
- }
- regitems.add(new SWD.DebugRegisters((int) h.getProperties().firstLineOffset, curRegIndexes, curRegNames));
- }
-
- if (firstLineOffset != -1 && !lineToOffset.containsKey(line)) {
- lineToOffset.put(line, firstLineOffset);
- }
- }
- if (txt.charAt(pos) == '\n') {
- line++;
- }
- }
-
- Map offSetToLine = new TreeMap<>();
- for (Map.Entry en : lineToOffset.entrySet()) {
- offSetToLine.put(en.getValue(), en.getKey());
- }
-
- //final String NONAME = "[No instance name assigned]";
- String sname = name;
- int bitmap = SWD.bitmapAction;
- /* Matcher m;
- int bitmap = SWD.bitmapAction;
- m = Pattern.compile("^\\\\frame_([0-9]+)\\\\DoAction$").matcher(sname);
- if (m.matches()) {
- //TODO: scenes?, layers?
- sname = "Actions for Scene 1: Frame " + m.group(1) + " of Layer Name Layer 1";
- } else if ((m = Pattern.compile("^\\\\__Packages\\\\(.*)$").matcher(sname)).matches()) {
- sname = m.group(1).replace("\\", ".") + ": .\\" + m.group(1) + ".as";
- } else {
- continue; //FIXME!
- }
- m = Pattern.compile("^\\\\DefineSprite_([0-9])+\\\\frame_([0-9]+)\\\\DoAction$").matcher(sname);
- if (m.matches()) {
- //TODO: layers?
- //sname = "Actions for Symbol " + m.group(1) + ": Frame " + m.group(2) + " of Layer Name Layer 1";
- continue; //FIXME!
- }
-
- //TODO: handle onxxx together ?
- m = Pattern.compile("^\\\\DefineButton2?_([0-9]+)\\\\on\\(.*$").matcher(sname);
- if (m.matches()) {
- //bitmap = SWD.bitmapOnAction;
- //sname = "Actions for " + NONAME + " (Symbol " + m.group(1) + ")";
- continue; //FIXME!
- }
-
- //TODO: handle onClipEvent together ?
- m = Pattern.compile("^\\\\frame_([0-9]+)\\\\PlaceObject[2-3]?_([0-9]+)_[^\\\\]*\\\\onClipEvent\\(.*$").matcher(sname);
- if (m.matches()) {
- //bitmap = SWD.bitmapOnClipAction;
- //sname = "Actions for " + NONAME + " (Symbol " + m.group(2) + ")";
- continue; //FIXME!
- }//*/
-
- items.add(new SWD.DebugScript(moduleId, bitmap, sname, txt));
- for (int ofs : offSetToLine.keySet()) {
- items.add(new SWD.DebugOffset(moduleId, offSetToLine.get(ofs), ofs));
- }
- if (breakpoints.containsKey(name)) {
- Set bplines = breakpoints.get(name);
- for (int bpline : bplines) {
- if (lineToOffset.containsKey(bpline)) {
- try {
- SWD.DebugBreakpoint dbp = new SWD.DebugBreakpoint(moduleId, bpline);
- items.add(dbp);
- } catch (IllegalArgumentException iex) {
- logger.log(Level.WARNING, "Cannot generate breakpoint to SWD: {0}", iex.getMessage());
- }
- }
- }
- }
- items.addAll(regitems);
- //moduleId++;
- }
- //items.addAll(swdOffsets);
- //items.addAll(swfBps);
-
- } catch (Throwable t) {
- logger.log(Level.SEVERE, "message", t);
- return false;
- }
- SWD swd = new SWD(7, items);
- try (FileOutputStream fis = new FileOutputStream(file)) {
- swd.saveTo(fis);
- }
- return true;
- }
-
- public boolean enableTelemetry(String password) {
-
- EnableTelemetryTag et = getEnableTelemetry();
-
- if (et == null) {
- FileAttributesTag fat = getFileAttributes();
- if (fat == null) {
- return false;
- }
- int insertTo = tags.indexOf(fat) + 1;
- MetadataTag mt = getMetadata();
- if (mt != null) {
- insertTo = tags.indexOf(mt) + 1;
- }
-
- et = new EnableTelemetryTag(this);
- tags.add(insertTo, et);
- }
- et.setPassword(password);
- //TODO: SWFs with tag 92 (signed) are unsupported
- return true;
- }
-
- public String getFlexMainClass(List ignoredClasses, List ignoredNs) {
- String documentClass = getDocumentClass();
-
- ScriptPack documentPack = null;
- for (ScriptPack item : getAS3Packs()) {
- if (item.getClassPath().toString().equals(documentClass)) {
- documentPack = item;
- break;
- }
- }
-
- if (documentPack != null) {
- if (!documentPack.traitIndices.isEmpty()) {
- Trait firstTrait = documentPack.abc.script_info.get(documentPack.scriptIndex).traits.traits.get(documentPack.traitIndices.get(0));
- if (firstTrait instanceof TraitClass) {
- int cindex = ((TraitClass) firstTrait).class_info;
- Multiname superName = documentPack.abc.constants.getMultiname(documentPack.abc.instance_info.get(cindex).super_index);
- String parentClass = superName.getNameWithNamespace(documentPack.abc.constants).toRawString();
- if ("mx.managers.SystemManager".equals(parentClass)) {
- for (Trait t : documentPack.abc.instance_info.get(cindex).instance_traits.traits) {
- if ((t instanceof TraitMethodGetterSetter) && "info".equals(t.getName(documentPack.abc).getName(documentPack.abc.constants, new ArrayList<>(), true))) {
-
- int mi = ((TraitMethodGetterSetter) t).method_info;
- try {
- documentPack.abc.findBody(mi).convert(new ConvertData(), "??", ScriptExportMode.AS, true, mi, documentPack.scriptIndex, cindex, documentPack.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new ArrayList<>(), true);
- List infos = documentPack.abc.findBody(mi).convertedItems;
- if (!infos.isEmpty()) {
- if (infos.get(0) instanceof IfItem) {
- IfItem ift = ((IfItem) infos.get(0));
- if (!ift.onTrue.isEmpty()) {
- if (ift.onTrue.get(0) instanceof InitPropertyAVM2Item) {
- if (ift.onTrue.get(0).value instanceof NewObjectAVM2Item) {
- NewObjectAVM2Item no = (NewObjectAVM2Item) ift.onTrue.get(0).value;
- List