From da1423a2543ff40b8e738d7b0f4502ec1d417d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 18 Jan 2021 19:47:59 +0100 Subject: [PATCH] New test classes for fors, updated AS3Generator for tests --- .../decompiler/flash/ActionScript3Test.java | 1454 ++++++++--------- .../flash/generators/AS3Generator.java | 9 +- .../flashdevelop/bin/flashdevelop.swf | Bin 14932 -> 15850 bytes .../testdata/flashdevelop/src/Main.as | 3 + .../flashdevelop/src/tests/TestForAnd.as | 33 + .../flashdevelop/src/tests/TestForGoto.as | 28 + .../flashdevelop/src/tests/TestForXml.as | 39 + 7 files changed, 798 insertions(+), 768 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForAnd.as create mode 100644 libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForGoto.as create mode 100644 libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForXml.as diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java index ecb272403..e2f86f2b4 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -56,7 +56,6 @@ public class ActionScript3Test extends ActionScriptTestBase { private SWF swf; - @BeforeClass public void init() throws IOException, InterruptedException { //Main.initLogging(false); @@ -146,128 +145,69 @@ public class ActionScript3Test extends ActionScriptTestBase { } @Test - public void testHello() { - decompileMethod("testHello", "trace(\"hello\");\r\n", false); + public void testArguments() { + decompileMethod("testArguments", "return arguments[0];\r\n", + false); } @Test - public void testIncDec() { - decompileMethod("testIncDec", "var a:* = 5;\r\n" - + "var b:* = 0;\r\n" - + "trace(\"++var\");\r\n" - + "b = ++a;\r\n" - + "trace(\"var++\");\r\n" - + "b = a++;\r\n" - + "trace(\"--var\");\r\n" - + "b = --a;\r\n" - + "trace(\"var--\");\r\n" - + "b = a--;\r\n" - + "var c:* = [1,2,3,4,5];\r\n" - + "trace(\"++arr\");\r\n" - + "b = ++c[2];\r\n" - + "trace(\"arr++\");\r\n" - + "b = c[2]++;\r\n" - + "trace(\"--arr\");\r\n" - + "b = --c[2];\r\n" - + "trace(\"arr--\");\r\n" - + "b = c[2]--;\r\n" - + "var d:* = new TestClass1();\r\n" - + "trace(\"++property\");\r\n" - + "trace(++d.attrib);\r\n" - + "trace(\"property++\");\r\n" - + "trace(d.attrib++);\r\n" - + "trace(\"--property\");\r\n" - + "trace(--d.attrib);\r\n" - + "trace(\"property--\");\r\n" - + "trace(d.attrib--);\r\n" - + "trace(\"arr[e++]\");\r\n" - + "var chars:Array = new Array(36);\r\n" - + "var index:uint = 0;\r\n" - + "chars[index++] = 5;\r\n" - + "trace(\"arr[++e]\");\r\n" - + "chars[++index] = 5;\r\n", false); - } - - @Test - public void testDoWhile() { - decompileMethod("testDoWhile", "var a:* = 8;\r\n" - + "do\r\n" - + "{\r\n" - + "trace(\"a=\" + a);\r\n" - + "a++;\r\n" - + "}\r\n" - + "while(a < 20);\r\n" - + "\r\n", false); - } - - @Test - public void testInnerTry() { - decompileMethod("testInnerTry", "try\r\n" - + "{\r\n" + public void testCatchFinally() { + decompileMethod("testCatchFinally", "var a:* = 5;\r\n" + "try\r\n" + "{\r\n" - + "trace(\"try body 1\");\r\n" + + "a = 9;\r\n" + + "trace(\"intry\");\r\n" + "}\r\n" - + "catch(e:DefinitionError)\r\n" + + "catch(e:*)\r\n" + "{\r\n" - + "trace(\"catched DefinitionError\");\r\n" - + "}\r\n" - + "trace(\"after try 1\");\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"catched Error\");\r\n" + + "trace(\"incatch\");\r\n" + "}\r\n" + "finally\r\n" + "{\r\n" - + "trace(\"finally block\");\r\n" - + "}\r\n", false); + + "trace(\"infinally\");\r\n" + + "}\r\n", + false); } @Test - public void testWhileContinue() { - decompileMethod("testWhileContinue", "var a:* = 5;\r\n" - + "while(true)\r\n" + public void testChain2() { + decompileMethod("testChain2", "var g:Array = null;\r\n" + + "var h:Boolean = false;\r\n" + + "var extraLine:Boolean = false;\r\n" + + "var r:int = 7;\r\n" + + "var t:int = 0;\r\n" + + "t = this.getInt();\r\n" + + "if(t + 1 < g.length)\r\n" + "{\r\n" - + "if(a == 9)\r\n" - + "{\r\n" - + "if(a == 8)\r\n" - + "{\r\n" - + "continue;\r\n" + + "t++;\r\n" + + "h = true;\r\n" + "}\r\n" - + "if(a == 9)\r\n" + + "if(t >= 0)\r\n" + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "trace(\"hello 1\");\r\n" - + "}\r\n" - + "trace(\"hello2\");\r\n" - + "}\r\n", false); + + "trace(\"ch\");\r\n" + + "}\r\n", + false); } @Test - public void testPrecedence() { - decompileMethod("testPrecedence", "var a:* = 0;\r\n" - + "a = (5 + 6) * 7;\r\n" - + "a = 5 * (2 + 3);\r\n" - + "a = 5 + 6 * 7;\r\n" - + "a = 5 * 2 + 2;\r\n" - + "a = 5 * (25 % 3);\r\n" - + "a = 5 % (24 * 307);\r\n" - + "a = 1 / (2 / 3);\r\n" - + "a = 1 / (2 * 3);\r\n" - + "a = 1 * 2 * 3;\r\n" - + "a = 1 * 2 / 3;\r\n" - + "trace(\"a=\" + a);\r\n", false); + public void testChainedAssignments() { + decompileMethod("testChainedAssignments", "var a:int = 0;\r\n" + + "var b:int = 0;\r\n" + + "var c:int = 0;\r\n" + + "var d:int = 0;\r\n" + + "d = c = b = a = 5;\r\n" + + "var e:TestClass2 = TestClass2.createMe(\"test\");\r\n" + + "e.attrib1 = e.attrib2 = e.attrib3 = this.getCounter();\r\n" + + "this.traceIt(e.toString());\r\n", + false); } @Test - public void testStrings() { - decompileMethod("testStrings", "trace(\"hello\");\r\n" - + "trace(\"quotes:\\\"hello!\\\"\");\r\n" - + "trace(\"backslash: \\\\ \");\r\n" - + "trace(\"single quotes: \\'hello!\\'\");\r\n" - + "trace(\"new line \\r\\n hello!\");\r\n", false); + public void testComplexExpressions() { + decompileMethod("testComplexExpressions", "var i:int = 0;\r\n" + + "var j:int = 0;\r\n" + + "j = i = i + (i = i + i++);\r\n", + false); } @Test @@ -330,88 +270,138 @@ public class ActionScript3Test extends ActionScriptTestBase { + "}\r\n" + "}\r\n" + "trace(\"hello\");\r\n" - + "}\r\n", false); + + "}\r\n", + false); } @Test - public void testSwitchDefault() { - decompileMethod("testSwitchDefault", "var a:* = 5;\r\n" - + "switch(a)\r\n" + public void testDecl2() { + decompileMethod("testDecl2", "var k:int = 0;\r\n" + + "var i:int = 5;\r\n" + + "i = i + 7;\r\n" + + "if(i == 5)\r\n" + + "{\r\n" + + "if(i < 8)\r\n" + + "{\r\n" + + "k = 6;\r\n" + + "}\r\n" + + "}\r\n" + + "k = 7;\r\n", + false); + } + + @Test + public void testDeclarations() { + decompileMethod("testDeclarations", "var vall:* = undefined;\r\n" + + "var vstr:String = null;\r\n" + + "var vint:int = 0;\r\n" + + "var vuint:uint = 0;\r\n" + + "var vclass:TestClass1 = null;\r\n" + + "var vnumber:Number = NaN;\r\n" + + "var vobject:Object = null;\r\n" + + "vall = 6;\r\n" + + "vstr = \"hello\";\r\n" + + "vuint = 7;\r\n" + + "vint = -4;\r\n" + + "vclass = new TestClass1();\r\n" + + "vnumber = 0.5;\r\n" + + "vnumber = 6;\r\n" + + "vobject = vclass;\r\n", + false); + } + + @Test + public void testDefaultNotLastGrouped() { + decompileMethod("testDefaultNotLastGrouped", "var k:* = 10;\r\n" + + "switch(k)\r\n" + "{\r\n" - + "case 57 * a:\r\n" - + "trace(\"fiftyseven multiply a\");\r\n" - + "break;\r\n" - + "case 13:\r\n" - + "trace(\"thirteen\");\r\n" - + "case 14:\r\n" - + "trace(\"fourteen\");\r\n" - + "break;\r\n" - + "case 89:\r\n" - + "trace(\"eightynine\");\r\n" - + "break;\r\n" + "default:\r\n" - + "trace(\"default clause\");\r\n" - + "}\r\n", false); - } - - @Test - public void testMultipleCondition() { - decompileMethod("testMultipleCondition", "var a:* = 5;\r\n" - + "var b:* = 8;\r\n" - + "var c:* = 9;\r\n" - + "if((a <= 4 || b <= 8) && c == 7)\r\n" - + "{\r\n" - + "trace(\"onTrue\");\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "trace(\"onFalse\");\r\n" - + "}\r\n", false); - } - - @Test - public void testForBreak() { - /*decompileMethod("testForBreak", "var a:* = 0;\r\n" - + "while(a < 10)\r\n" - + "{\r\n" - + "if(a == 5)\r\n" - + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "trace(\"hello:\" + a);\r\n" - + "a++;\r\n" - + "}\r\n", false);*/ - // Issue 842, recover for loops - decompileMethod("testForBreak", "for(var a:* = 0; a < 10; a++)\r\n" - + "{\r\n" - + "if(a == 5)\r\n" - + "{\r\n" + + "case \"six\":\r\n" + + "trace(\"def and 6\");\r\n" + + "case \"five\":\r\n" + + "trace(\"def and 6 and 5\");\r\n" + "break;\r\n" + + "case \"four\":\r\n" + + "trace(\"4\");\r\n" + "}\r\n" - + "trace(\"hello:\" + a);\r\n" - + "}\r\n", false); + + "trace(\"after switch\");\r\n", + false); } @Test - public void testIf() { - decompileMethod("testIf", "var a:* = 5;\r\n" - + "if(a == 7)\r\n" + public void testDoWhile() { + decompileMethod("testDoWhile", "var a:* = 8;\r\n" + + "do\r\n" + "{\r\n" - + "trace(\"onTrue\");\r\n" - + "}\r\n", false); + + "trace(\"a=\" + a);\r\n" + + "a++;\r\n" + + "}\r\n" + + "while(a < 20);\r\n", + false); } @Test - public void testIfElse() { - decompileMethod("testIfElse", "var a:* = 5;\r\n" - + "if(a == 7)\r\n" + public void testDoWhile2() { + decompileMethod("testDoWhile2", "var k:int = 5;\r\n" + + "do\r\n" + "{\r\n" - + "trace(\"onTrue\");\r\n" + + "k++;\r\n" + + "if(k == 7)\r\n" + + "{\r\n" + + "k = 5 * k;\r\n" + "}\r\n" + "else\r\n" + "{\r\n" - + "trace(\"onFalse\");\r\n" - + "}\r\n", false); + + "k = 5 - k;\r\n" + + "}\r\n" + + "k--;\r\n" + + "}\r\n" + + "while(k < 9);\r\n" + + "return 2;\r\n", + false); + } + + @Test + public void testExpressions() { + decompileMethod("testExpressions", "var arr:Array = null;\r\n" + + "var i:int = 5;\r\n" + + "var j:int = 5;\r\n" + + "if((i = i = i / 2) == 1 || i == 2)\r\n" + + "{\r\n" + + "arguments.concat(i);\r\n" + + "}\r\n" + + "else if(i == 0)\r\n" + + "{\r\n" + + "i = j++;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "arr[0]();\r\n" + + "}\r\n" + + "return i == 0;\r\n", + false); + } + + @Test + public void testFinallyZeroJump() { + decompileMethod("testFinallyZeroJump", "var str:String = param1;\r\n" + + "try\r\n" + + "{\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"error is :\" + e.message);\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"hi \");\r\n" + + "if(5 == 4)\r\n" + + "{\r\n" + + "return str;\r\n" + + "}\r\n" + + "return \"hu\" + str;\r\n" + + "}\r\n", + false); } @Test @@ -419,7 +409,46 @@ public class ActionScript3Test extends ActionScriptTestBase { decompileMethod("testFor", "for(var a:* = 0; a < 10; a++)\r\n" + "{\r\n" + "trace(\"a=\" + a);\r\n" - + "}\r\n", false); + + "}\r\n", + false); + } + + @Test + public void testForAnd() { + decompileMethod("testForAnd", "var x:Boolean = false;\r\n" + + "var len:int = 5;\r\n" + + "var a:int = 4;\r\n" + + "var b:int = 7;\r\n" + + "var c:int = 9;\r\n" + + "for(var i:uint = 0; i < len; x = a > 4 && b < 2 || c > 10)\r\n" + + "{\r\n" + + "c = 1;\r\n" + + "if(c == 2)\r\n" + + "{\r\n" + + "trace(\"A\");\r\n" + + "if(c == 7)\r\n" + + "{\r\n" + + "trace(\"B\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"C\");\r\n" + + "}\r\n" + + "trace(\"D\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testForBreak() { + decompileMethod("testForBreak", "for(var a:* = 0; a < 10; a++)\r\n" + + "{\r\n" + + "if(a == 5)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"hello:\" + a);\r\n" + + "}\r\n", + false); } @Test @@ -446,70 +475,247 @@ public class ActionScript3Test extends ActionScriptTestBase { + "trace(\"part4\");\r\n" + "}\r\n" + "trace(\"part5\");\r\n" - + "}\r\n", false); + + "}\r\n", + false); } @Test - public void testTry() { - decompileMethod("testTry", "var i:int = 0;\r\n" - + "i = 7;\r\n" - + "try\r\n" + public void testForEach() { + decompileMethod("testForEach", "var list:Array = null;\r\n" + + "var item:* = undefined;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "for each(item in list)\r\n" + "{\r\n" - + "trace(\"try body\");\r\n" - + "}\r\n" - + "catch(e:DefinitionError)\r\n" - + "{\r\n" - + "trace(\"catched DefinitionError\");\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"Error message:\" + e.message);\r\n" - + "trace(\"Stacktrace:\" + e.getStackTrace());\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"Finally part\");\r\n" - + "}\r\n" - + "trace(\"end\");\r\n", false); - } - - //@Test //todo: enable test - public void testTryShouldHaveCatchOrFinally() { - decompileMethod("testTryShouldHaveCatchOrFinally", "try\r\n" - + "{\r\n" - + "trace(\"try body\");\r\n" - + "}\r\n" - + "finally\n\n" - + "{\r\n" - + "}\r\n", false); + + "trace(\"item #\" + item);\r\n" + + "}\r\n", + false); } @Test - public void testSwitch() { - decompileMethod("testSwitch", "var a:* = 5;\r\n" - + "switch(a)\r\n" + public void testForEachObjectArray() { + decompileMethod("testForEachObjectArray", "var list:Array = null;\r\n" + + "var test:Array = null;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "test = new Array();\r\n" + + "test[0] = 0;\r\n" + + "for each(test[0] in list)\r\n" + "{\r\n" - + "case 57 * a:\r\n" - + "trace(\"fiftyseven multiply a\");\r\n" - + "break;\r\n" - + "case 13:\r\n" - + "trace(\"thirteen\");\r\n" - + "case 14:\r\n" - + "trace(\"fourteen\");\r\n" - + "break;\r\n" - + "case 89:\r\n" - + "trace(\"eightynine\");\r\n" - + "}\r\n", false); + + "trace(\"item #\" + test[0]);\r\n" + + "}\r\n", + false); } @Test - public void testTernarOperator() { - decompileMethod("testTernarOperator", "var a:* = 5;\r\n" - + "var b:* = 4;\r\n" - + "var c:* = 4;\r\n" - + "var d:* = 78;\r\n" - + "var e:* = a == b?c == d?1:7:3;\r\n" - + "trace(\"e=\" + e);\r\n", false); + public void testForEachObjectAttribute() { + decompileMethod("testForEachObjectAttribute", "var list:Array = null;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "for each(this.testPriv in list)\r\n" + + "{\r\n" + + "trace(\"item #\" + this.testPriv);\r\n" + + "}\r\n", + false); + } + + @Test + public void testForGoto() { + decompileMethod("testForGoto", "var c:int = 0;\r\n" + + "var len:int = 5;\r\n" + + "for(var i:uint = 0; i < len; i++)\r\n" + + "{\r\n" + + "c = 1;\r\n" + + "if(c == 2)\r\n" + + "{\r\n" + + "trace(\"A\");\r\n" + + "}\r\n" + + "else if(c == 3)\r\n" + + "{\r\n" + + "trace(\"B\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"C\");\r\n" + + "}\r\n" + + "trace(\"exit\");\r\n", + false); + } + + @Test + public void testForIn() { + decompileMethod("testForIn", "var dic:Dictionary = null;\r\n" + + "var item:* = null;\r\n" + + "for(item in dic)\r\n" + + "{\r\n" + + "trace(item);\r\n" + + "}\r\n" + + "for each(item in dic)\r\n" + + "{\r\n" + + "trace(item);\r\n" + + "}\r\n", + false); + } + + @Test + public void testForXml() { + decompileMethod("testForXml", "var c:int = 0;\r\n" + + "var name:String = \"ahoj\";\r\n" + + "var myXML:XML = \r\n" + + "\r\n" + + "{name}\r\n" + + "\r\n" + + ";\r\n" + + "var k:* = null;\r\n" + + "var len:int = 5;\r\n" + + "var a:int = 5;\r\n" + + "var b:int = 6;\r\n" + + "for(var i:int = 0; i < len; k = myXML.book.(@isbn = \"12345\"))\r\n" + + "{\r\n" + + "c = 1;\r\n" + + "if(c == 2)\r\n" + + "{\r\n" + + "trace(\"A\");\r\n" + + "}\r\n" + + "else if(c == 3)\r\n" + + "{\r\n" + + "trace(\"B\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"C\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testHello() { + decompileMethod("testHello", "trace(\"hello\");\r\n", + false); + } + + @Test + public void testIf() { + decompileMethod("testIf", "var a:* = 5;\r\n" + + "if(a == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testIfElse() { + decompileMethod("testIfElse", "var a:* = 5;\r\n" + + "if(a == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"onFalse\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testInc2() { + decompileMethod("testInc2", "var a:* = [1];\r\n" + + "a[this.getInt()]++;\r\n" + + "var d:* = a[this.getInt()]++;\r\n" + + "var e:* = ++a[this.getInt()];\r\n" + + "var b:* = 1;\r\n" + + "b++;\r\n" + + "var c:* = 1;\r\n" + + "b = c++;\r\n", + false); + } + + @Test + public void testIncDec() { + decompileMethod("testIncDec", "var a:* = 5;\r\n" + + "var b:* = 0;\r\n" + + "trace(\"++var\");\r\n" + + "b = ++a;\r\n" + + "trace(\"var++\");\r\n" + + "b = a++;\r\n" + + "trace(\"--var\");\r\n" + + "b = --a;\r\n" + + "trace(\"var--\");\r\n" + + "b = a--;\r\n" + + "var c:* = [1,2,3,4,5];\r\n" + + "trace(\"++arr\");\r\n" + + "b = ++c[2];\r\n" + + "trace(\"arr++\");\r\n" + + "b = c[2]++;\r\n" + + "trace(\"--arr\");\r\n" + + "b = --c[2];\r\n" + + "trace(\"arr--\");\r\n" + + "b = c[2]--;\r\n" + + "var d:* = new TestClass1();\r\n" + + "trace(\"++property\");\r\n" + + "trace(++d.attrib);\r\n" + + "trace(\"property++\");\r\n" + + "trace(d.attrib++);\r\n" + + "trace(\"--property\");\r\n" + + "trace(--d.attrib);\r\n" + + "trace(\"property--\");\r\n" + + "trace(d.attrib--);\r\n" + + "trace(\"arr[e++]\");\r\n" + + "var chars:Array = new Array(36);\r\n" + + "var index:uint = 0;\r\n" + + "chars[index++] = 5;\r\n" + + "trace(\"arr[++e]\");\r\n" + + "chars[++index] = 5;\r\n", + false); + } + + @Test + public void testInlineFunctions() { + decompileMethod("testInlineFunctions", "var first:String = null;\r\n" + + "first = \"value1\";\r\n" + + "var traceParameter:Function = function(aParam:String):String\r\n" + + "{\r\n" + + "var second:String = null;\r\n" + + "second = \"value2\";\r\n" + + "second = second + \"cc\";\r\n" + + "var traceParam2:Function = function(bParam:String):String\r\n" + + "{\r\n" + + "trace(bParam + \",\" + aParam);\r\n" + + "return first + second + aParam + bParam;\r\n" + + "};\r\n" + + "trace(second);\r\n" + + "traceParam2(aParam);\r\n" + + "return first;\r\n" + + "};\r\n" + + "traceParameter(\"hello\");\r\n", + false); + } + + @Test + public void testInnerFunctions() { + decompileMethod("testInnerFunctions", "var s:int = 0;\r\n" + + "var innerFunc:Function = function(b:String):*\r\n" + + "{\r\n" + + "trace(b);\r\n" + + "};\r\n" + + "var k:int = 5;\r\n" + + "if(k == 6)\r\n" + + "{\r\n" + + "s = 8;\r\n" + + "}\r\n" + + "innerFunc(a);\r\n", + false); } @Test @@ -535,107 +741,54 @@ public class ActionScript3Test extends ActionScriptTestBase { + "{\r\n" + "trace(\"b!=7\");\r\n" + "}\r\n" - + "\r\n" - + "trace(\"end\");\r\n", false); + + "trace(\"end\");\r\n", + false); } @Test - public void testVector() { - decompileMethod("testVector", "var v:Vector. = new Vector.();\r\n" - + "v.push(\"hello\");\r\n" - + "v[0] = \"hi\";\r\n" - + "v[5 * 8 - 39] = \"hi2\";\r\n" - + "trace(v[0]);\r\n", false); - } - - @Test - public void testProperty() { - decompileMethod("testProperty", "var d:* = new TestClass1();\r\n" - + "var k:* = 7 + 8;\r\n" - + "if(k == 15)\r\n" + public void testInnerTry() { + decompileMethod("testInnerTry", "try\r\n" + "{\r\n" - + "d.method(d.attrib * 5);\r\n" - + "}\r\n", false); - } - - @Test - public void testRest() { - decompileMethod("testRest", "trace(\"firstRest:\" + restval[0]);\r\n" - + "return firstp;\r\n", false); - } - - @Test - public void testParamNames() { - decompileMethod("testParamNames", "return firstp + secondp + thirdp;\r\n", false); - } - - @Test - public void testForEach() { - decompileMethod("testForEach", "var list:Array = null;\r\n" - + "var item:* = undefined;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "for each(item in list)\r\n" + + "try\r\n" + "{\r\n" - + "trace(\"item #\" + item);\r\n" - + "}\r\n", false); + + "trace(\"try body 1\");\r\n" + + "}\r\n" + + "catch(e:DefinitionError)\r\n" + + "{\r\n" + + "trace(\"catched DefinitionError\");\r\n" + + "}\r\n" + + "trace(\"after try 1\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"catched Error\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"finally block\");\r\n" + + "}\r\n", + false); } @Test - public void testForEachObjectArray() { - decompileMethod("testForEachObjectArray", "var list:Array = null;\r\n" - + "var test:Array = null;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "test = new Array();\r\n" - + "test[0] = 0;\r\n" - + "for each(test[0] in list)\r\n" + public void testLogicalComputing() { + decompileMethod("testLogicalComputing", "var b:Boolean = false;\r\n" + + "var i:* = 5;\r\n" + + "var j:* = 7;\r\n" + + "if(i > j)\r\n" + "{\r\n" - + "trace(\"item #\" + test[0]);\r\n" - + "}\r\n", false); + + "j = 9;\r\n" + + "b = true;\r\n" + + "}\r\n" + + "b = (i == 0 || i == 1) && j == 0;\r\n", + false); } @Test - public void testForEachObjectAttribute() { - decompileMethod("testForEachObjectAttribute", "var list:Array = null;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "for each(this.testPriv in list)\r\n" - + "{\r\n" - + "trace(\"item #\" + this.testPriv);\r\n" - + "}\r\n", false); - } - - @Test - public void testParamsCount() { - decompileMethod("testParamsCount", "return firstp;\r\n", false); - } - - @Test - public void testInlineFunctions() { - decompileMethod("testInlineFunctions", "var first:String = null;\r\n" - + "first = \"value1\";\r\n" - + "var traceParameter:Function = function(aParam:String):String\r\n" - + "{\r\n" - + "var second:String = null;\r\n" - + "second = \"value2\";\r\n" - + "second = second + \"cc\";\r\n" - + "var traceParam2:Function = function(bParam:String):String\r\n" - + "{\r\n" - + "trace(bParam + \",\" + aParam);\r\n" - + "return first + second + aParam + bParam;\r\n" - + "};\r\n" - + "trace(second);\r\n" - + "traceParam2(aParam);\r\n" - + "return first;\r\n" - + "};\r\n" - + "traceParameter(\"hello\");\r\n", false); + public void testManualConvert() { + decompileMethod("testManualConvert", "trace(\"String(this).length\");\r\n" + + "trace(String(this).length);\r\n", + false); } @Test @@ -651,88 +804,33 @@ public class ActionScript3Test extends ActionScriptTestBase { + "break;\r\n" + "default:\r\n" + "jj = 3;\r\n" - + "}\r\n", false); + + "}\r\n", + false); } @Test - public void testChainedAssignments() { - decompileMethod("testChainedAssignments", "var a:int = 0;\r\n" - + "var b:int = 0;\r\n" - + "var c:int = 0;\r\n" - + "var d:int = 0;\r\n" - + "d = c = b = a = 5;\r\n" - + "var e:TestClass2 = TestClass2.createMe(\"test\");\r\n" - + "e.attrib1 = e.attrib2 = e.attrib3 = this.getCounter();\r\n" - + "this.traceIt(e.toString());\r\n", false); + public void testMultipleCondition() { + decompileMethod("testMultipleCondition", "var a:* = 5;\r\n" + + "var b:* = 8;\r\n" + + "var c:* = 9;\r\n" + + "if((a <= 4 || b <= 8) && c == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"onFalse\");\r\n" + + "}\r\n", + false); } @Test - public void testFinallyZeroJump() { - decompileMethod("testFinallyZeroJump", "var str:String = param1;\r\n" - + "try\r\n" + public void testNamedAnonFunctions() { + decompileMethod("testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" + "{\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"error is :\" + e.message);\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"hi \");\r\n" - + "if(5 == 4)\r\n" - + "{\r\n" - + "return str;\r\n" - + "}\r\n" - + "return \"hu\" + str;\r\n" - + "}\r\n", false); - } - - @Test - public void testInnerFunctions() { - decompileMethod("testInnerFunctions", "var s:int = 0;\r\n" - + "var innerFunc:Function = function(b:String):*\r\n" - + "{\r\n" - + "trace(b);\r\n" - + "};\r\n" - + "var k:int = 5;\r\n" - + "if(k == 6)\r\n" - + "{\r\n" - + "s = 8;\r\n" - + "}\r\n" - + "innerFunc(a);\r\n", false); - } - - @Test - public void testDeclarations() { - decompileMethod("testDeclarations", "var vall:* = undefined;\r\n" - + "var vstr:String = null;\r\n" - + "var vint:int = 0;\r\n" - + "var vuint:uint = 0;\r\n" - + "var vclass:TestClass1 = null;\r\n" - + "var vnumber:Number = NaN;\r\n" - + "var vobject:Object = null;\r\n" - + "vall = 6;\r\n" - + "vstr = \"hello\";\r\n" - + "vuint = 7;\r\n" - + "vint = -4;\r\n" - + "vclass = new TestClass1();\r\n" - + "vnumber = 0.5;\r\n" - + "vnumber = 6;\r\n" - + "vobject = vclass;\r\n", false); - } - - @Test - public void testForIn() { - decompileMethod("testForIn", "var dic:Dictionary = null;\r\n" - + "var item:* = null;\r\n" - + "for(item in dic)\r\n" - + "{\r\n" - + "trace(item);\r\n" - + "}\r\n" - + "for each(item in dic)\r\n" - + "{\r\n" - + "trace(item);\r\n" - + "}\r\n", false); + + "return (param1 as TestClass2).attrib1 == 5;\r\n" + + "};\r\n", + false); } @Test @@ -742,141 +840,74 @@ public class ActionScript3Test extends ActionScriptTestBase { + "var a:* = ns::unnamespacedFunc();\r\n" + "var b:* = ns::[name];\r\n" + "trace(b.c);\r\n" - + "var c:* = myInternal::neco;\r\n", false); + + "var c:* = myInternal::neco;\r\n", + false); } @Test - public void testComplexExpressions() { - decompileMethod("testComplexExpressions", "var i:int = 0;\r\n" - + "var j:int = 0;\r\n" - + "j = i = i + (i = i + i++);\r\n", false); + public void testParamNames() { + decompileMethod("testParamNames", "return firstp + secondp + thirdp;\r\n", + false); } @Test - public void testExpressions() { - decompileMethod("testExpressions", "var arr:Array = null;\r\n" - + "var i:int = 5;\r\n" - + "var j:int = 5;\r\n" - + "if((i = i = i / 2) == 1 || i == 2)\r\n" - + "{\r\n" - + "arguments.concat(i);\r\n" - + "}\r\n" - + "else if(i == 0)\r\n" - + "{\r\n" - + "i = j++;\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "arr[0]();\r\n" - + "}\r\n" - + "\r\n" - + "return i == 0;\r\n", false); + public void testParamsCount() { + decompileMethod("testParamsCount", "return firstp;\r\n", + false); } @Test - public void testArguments() { - decompileMethod("testArguments", "return arguments[0];\r\n", false); + public void testPrecedence() { + decompileMethod("testPrecedence", "var a:* = 0;\r\n" + + "a = (5 + 6) * 7;\r\n" + + "a = 5 * (2 + 3);\r\n" + + "a = 5 + 6 * 7;\r\n" + + "a = 5 * 2 + 2;\r\n" + + "a = 5 * (25 % 3);\r\n" + + "a = 5 % (24 * 307);\r\n" + + "a = 1 / (2 / 3);\r\n" + + "a = 1 / (2 * 3);\r\n" + + "a = 1 * 2 * 3;\r\n" + + "a = 1 * 2 / 3;\r\n" + + "trace(\"a=\" + a);\r\n", + false); } @Test - public void testLogicalComputing() { - decompileMethod("testLogicalComputing", "var b:Boolean = false;\r\n" - + "var i:* = 5;\r\n" - + "var j:* = 7;\r\n" - + "if(i > j)\r\n" - + "{\r\n" - + "j = 9;\r\n" - + "b = true;\r\n" - + "}\r\n" - + "b = (i == 0 || i == 1) && j == 0;\r\n", false); + public void testPrecedenceX() { + decompileMethod("testPrecedenceX", "var a:* = 5;\r\n" + + "var b:* = 2;\r\n" + + "var c:* = 3;\r\n" + + "var d:* = a << (b >>> c);\r\n" + + "var e:* = a << b >>> c;\r\n", + false); } @Test - public void testInc2() { - decompileMethod("testInc2", "var a:* = [1];\r\n" - + "a[this.getInt()]++;\r\n" - + "var d:* = a[this.getInt()]++;\r\n" - + "var e:* = ++a[this.getInt()];\r\n" - + "var b:* = 1;\r\n" - + "b++;\r\n" - + "var c:* = 1;\r\n" - + "b = c++;\r\n", false); + public void testProperty() { + decompileMethod("testProperty", "var d:* = new TestClass1();\r\n" + + "var k:* = 7 + 8;\r\n" + + "if(k == 15)\r\n" + + "{\r\n" + + "d.method(d.attrib * 5);\r\n" + + "}\r\n", + false); } @Test - public void testDecl2() { - decompileMethod("testDecl2", "var k:int = 0;\r\n" - + "var i:int = 5;\r\n" - + "i = i + 7;\r\n" - + "if(i == 5)\r\n" - + "{\r\n" - + "if(i < 8)\r\n" - + "{\r\n" - + "k = 6;\r\n" - + "}\r\n" - + "}\r\n" - + "k = 7;\r\n", false); + public void testRegExp() { + decompileMethod("testRegExp", "var a1:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" + + "var a2:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" + + "var b1:* = /[0-9AB]+/;\r\n" + + "var b2:* = /[0-9AB]+/;\r\n", + false); } @Test - public void testChain2() { - decompileMethod("testChain2", "var g:Array = null;\r\n" - + "var h:Boolean = false;\r\n" - + "var extraLine:Boolean = false;\r\n" - + "var r:int = 7;\r\n" - + "var t:int = 0;\r\n" - + "t = this.getInt();\r\n" - + "if(t + 1 < g.length)\r\n" - + "{\r\n" - + "t++;\r\n" - + "h = true;\r\n" - + "}\r\n" - + "if(t >= 0)\r\n" - + "{\r\n" - + "trace(\"ch\");\r\n" - + "}\r\n", false); - } - - @Test - public void testDoWhile2() { - decompileMethod("testDoWhile2", "var k:int = 5;\r\n" - + "do\r\n" - + "{\r\n" - + "k++;\r\n" - + "if(k == 7)\r\n" - + "{\r\n" - + "k = 5 * k;\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "k = 5 - k;\r\n" - + "}\r\n" - + "k--;\r\n" - + "}\r\n" - + "while(k < 9);\r\n" - + "\r\n" - + "return 2;\r\n", false); - } - - @Test - public void testWhileAnd() { - decompileMethod("testWhileAnd", "var a:int = 5;\r\n" - + "var b:int = 10;\r\n" - + "while(a < 10 && b > 1)\r\n" - + "{\r\n" - + "a++;\r\n" - + "b--;\r\n" - + "}\r\n" - + "a = 7;\r\n" - + "b = 9;\r\n", false); - } - - @Test - public void testNamedAnonFunctions() { - decompileMethod("testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" - + "{\r\n" - + "return (param1 as TestClass2).attrib1 == 5;\r\n" - + "};\r\n", false); + public void testRest() { + decompileMethod("testRest", "trace(\"firstRest:\" + restval[0]);\r\n" + + "return firstp;\r\n", + false); } @Test @@ -884,54 +915,95 @@ public class ActionScript3Test extends ActionScriptTestBase { decompileMethod("testStringConcat", "var k:int = 8;\r\n" + "this.traceIt(\"hello\" + 5 * 6);\r\n" + "this.traceIt(\"hello\" + (k - 1));\r\n" - + "this.traceIt(\"hello\" + 5 + 6);\r\n", false); + + "this.traceIt(\"hello\" + 5 + 6);\r\n", + false); } @Test - public void testWhileTry() { - decompileMethod("testWhileTry", "while(true)\r\n" - + "{\r\n" - + "try\r\n" - + "{\r\n" - + "while(true)\r\n" - + "{\r\n" - + "trace(\"a\");\r\n" - + "}\r\n" - + "}\r\n" - + "catch(e:EOFError)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "}\r\n", false); + public void testStrings() { + decompileMethod("testStrings", "trace(\"hello\");\r\n" + + "trace(\"quotes:\\\"hello!\\\"\");\r\n" + + "trace(\"backslash: \\\\ \");\r\n" + + "trace(\"single quotes: \\'hello!\\'\");\r\n" + + "trace(\"new line \\r\\n hello!\");\r\n", + false); } @Test - public void testWhileTry2() { - decompileMethod("testWhileTry2", "var j:* = undefined;\r\n" - + "for(var i:* = 0; i < 100; i++)\r\n" + public void testSwitch() { + decompileMethod("testSwitch", "var a:* = 5;\r\n" + + "switch(a)\r\n" + "{\r\n" + + "case 57 * a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testSwitchDefault() { + decompileMethod("testSwitchDefault", "var a:* = 5;\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 57 * a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"default clause\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testTernarOperator() { + decompileMethod("testTernarOperator", "var a:* = 5;\r\n" + + "var b:* = 4;\r\n" + + "var c:* = 4;\r\n" + + "var d:* = 78;\r\n" + + "var e:* = a == b?c == d?1:7:3;\r\n" + + "trace(\"e=\" + e);\r\n", + false); + } + + @Test + public void testTry() { + decompileMethod("testTry", "var i:int = 0;\r\n" + + "i = 7;\r\n" + "try\r\n" + "{\r\n" - + "for(j = 0; j < 20; j++)\r\n" - + "{\r\n" - + "trace(\"a\");\r\n" + + "trace(\"try body\");\r\n" + "}\r\n" - + "}\r\n" - + "catch(e:EOFError)\r\n" + + "catch(e:DefinitionError)\r\n" + "{\r\n" - + "continue;\r\n" + + "trace(\"catched DefinitionError\");\r\n" + "}\r\n" + "catch(e:Error)\r\n" + "{\r\n" - + "continue;\r\n" + + "trace(\"Error message:\" + e.message);\r\n" + + "trace(\"Stacktrace:\" + e.getStackTrace());\r\n" + "}\r\n" - + "trace(\"after_try\");\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"Finally part\");\r\n" + "}\r\n" - + "trace(\"end\");\r\n", false); + + "trace(\"end\");\r\n", + false); } @Test @@ -958,202 +1030,110 @@ public class ActionScript3Test extends ActionScriptTestBase { + "catch(e:Error)\r\n" + "{\r\n" + "}\r\n" - + "return 4;\r\n", false); + + "return 4;\r\n", + false); + } + + @Test + public void testVector() { + decompileMethod("testVector", "var v:Vector. = new Vector.();\r\n" + + "v.push(\"hello\");\r\n" + + "v[0] = \"hi\";\r\n" + + "v[5 * 8 - 39] = \"hi2\";\r\n" + + "trace(v[0]);\r\n", + false); } @Test public void testVector2() { decompileMethod("testVector2", "var a:Vector.> = new Vector.>();\r\n" - + "var b:Vector. = new [10,20,30];\r\n", false); + + "var b:Vector. = new [10,20,30];\r\n", + false); } - public void testFinallyOnly() { - decompileMethod("testFinallyOnly", "var a:* = 5;\r\n" + @Test + public void testWhileAnd() { + decompileMethod("testWhileAnd", "var a:int = 5;\r\n" + + "var b:int = 10;\r\n" + + "while(a < 10 && b > 1)\r\n" + + "{\r\n" + + "a++;\r\n" + + "b--;\r\n" + + "}\r\n" + + "a = 7;\r\n" + + "b = 9;\r\n", + false); + } + + @Test + public void testWhileContinue() { + decompileMethod("testWhileContinue", "var a:* = 5;\r\n" + + "while(true)\r\n" + + "{\r\n" + + "if(a == 9)\r\n" + + "{\r\n" + + "if(a == 8)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "if(a == 9)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"hello 1\");\r\n" + + "}\r\n" + + "trace(\"hello2\");\r\n" + + "}\r\n", + false); + } + + @Test + public void testWhileTry() { + decompileMethod("testWhileTry", "while(true)\r\n" + + "{\r\n" + "try\r\n" + "{\r\n" - + "a = 9;\r\n" - + "trace(\"intry\");\r\n" - + "}\r\n" - + "finally\r\n" + + "while(true)\r\n" + "{\r\n" - + "trace(\"infinally\");\r\n" - + "}\r\n", false); + + "trace(\"a\");\r\n" + + "}\r\n" + + "}\r\n" + + "catch(e:EOFError)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "}\r\n", + false); } @Test - public void testCatchFinally() { - decompileMethod("testCatchFinally", "var a:* = 5;\r\n" + public void testWhileTry2() { + decompileMethod("testWhileTry2", "var j:* = undefined;\r\n" + + "for(var i:* = 0; i < 100; i++)\r\n" + + "{\r\n" + "try\r\n" + "{\r\n" - + "a = 9;\r\n" - + "trace(\"intry\");\r\n" - + "}\r\n" - + "catch(e:*)\r\n" + + "for(j = 0; j < 20; j++)\r\n" + "{\r\n" - + "trace(\"incatch\");\r\n" + + "trace(\"a\");\r\n" + "}\r\n" - + "finally\r\n" + + "}\r\n" + + "catch(e:EOFError)\r\n" + "{\r\n" - + "trace(\"infinally\");\r\n" - + "}\r\n", false); - } - - @Test - public void testMyPackage1TestClass() { - decompileScriptPack("tests_classes.mypackage1.TestClass", "package tests_classes.mypackage1\n" - + "{\n" - + " public class TestClass implements tests_classes.mypackage1.TestInterface\n" - + " {\n" - + " \n" - + " public function TestClass()\n" - + " {\n" - + " super();\n" - + " }\n" - + " \n" - + " public function testCall() : String\n" - + " {\n" - + " trace(\"pkg1hello\");\n" - + " return \"pkg1hello\";\n" - + " }\n" - + " \n" - + " public function testMethod1() : void\n" - + " {\n" - + " var a:tests_classes.mypackage1.TestInterface = this;\n" - + " a.testMethod1();\n" - + " var b:tests_classes.mypackage2.TestInterface = this;\n" - + " b = new tests_classes.mypackage2.TestClass();\n" - + " }\n" - + " \n" - + " public function testMethod2() : void\n" - + " {\n" - + " var a:tests_classes.mypackage1.TestInterface = this;\n" - + " a.testMethod1();\n" - + " var b:tests_classes.mypackage2.TestInterface = this;\n" - + " b = new tests_classes.mypackage2.TestClass();\n" - + " }\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage1TestClass2() { - decompileScriptPack("tests_classes.mypackage1.TestClass2", "package tests_classes.mypackage1\n" - + "{\n" - + " public class TestClass2\n" - + " {\n" - + " \n" - + " public function TestClass2()\n" - + " {\n" - + " super();\n" - + " }\n" - + " \n" - + " public function testCall() : String\n" - + " {\n" - + " var a:tests_classes.mypackage1.TestClass = null;\n" - + " var b:tests_classes.mypackage2.TestClass = null;\n" - + " var c:tests_classes.mypackage3.TestClass = null;\n" - + " a = new tests_classes.mypackage1.TestClass();\n" - + " b = new tests_classes.mypackage2.TestClass();\n" - + " c = new tests_classes.mypackage3.TestClass();\n" - + " var res:String = a.testCall() + b.testCall() + c.testCall() + this.testCall2() + myNamespace::testCall3();\n" - + " trace(res);\n" - + " return res;\n" - + " }\n" - + " \n" - + " myNamespace function testCall2() : String\n" - + " {\n" - + " return \"1\";\n" - + " }\n" - + " \n" - + " myNamespace function testCall3() : String\n" - + " {\n" - + " return myNamespace::testCall2();\n" - + " }\n" - + " \n" - + " public function testCall2() : String\n" - + " {\n" - + " return \"2\";\n" - + " }\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage1TestInterface() { - decompileScriptPack("tests_classes.mypackage1.TestInterface", "package tests_classes.mypackage1\n" - + "{\n" - + " public interface TestInterface extends tests_classes.mypackage2.TestInterface\n" - + " {\n" - + " \n" - + " function testMethod1() : void;\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage1MyNamespace() { - decompileScriptPack("tests_classes.mypackage1.myNamespace", "package tests_classes.mypackage1\n" - + "{\n" - + " public namespace myNamespace = \"https://www.free-decompiler.com/flash/test/namespace\";\n" - + "}"); - } - - @Test - public void testMyPackage2TestClass() { - decompileScriptPack("tests_classes.mypackage2.TestClass", "package tests_classes.mypackage2\n" - + "{\n" - + " public class TestClass implements TestInterface\n" - + " {\n" - + " \n" - + " public function TestClass()\n" - + " {\n" - + " super();\n" - + " }\n" - + " \n" - + " public function testCall() : String\n" - + " {\n" - + " trace(\"pkg2hello\");\n" - + " return \"pkg2hello\";\n" - + " }\n" - + " \n" - + " public function testMethod2() : void\n" - + " {\n" - + " }\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage2TestInterface() { - decompileScriptPack("tests_classes.mypackage2.TestInterface", "package tests_classes.mypackage2\n" - + "{\n" - + " public interface TestInterface\n" - + " {\n" - + " \n" - + " function testMethod2() : void;\n" - + " }\n" - + "}"); - } - - @Test - public void testMyPackage3TestClass() { - decompileScriptPack("tests_classes.mypackage3.TestClass", "package tests_classes.mypackage3\n" - + "{\n" - + " public class TestClass\n" - + " {\n" - + " \n" - + " public function TestClass()\n" - + " {\n" - + " super();\n" - + " }\n" - + " \n" - + " public function testCall() : String\n" - + " {\n" - + " trace(\"pkg3hello\");\n" - + " return \"pkg3hello\";\n" - + " }\n" - + " }\n" - + "}"); + + "continue;\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"after_try\");\r\n" + + "}\r\n" + + "trace(\"end\");\r\n", + false); } @Test @@ -1187,64 +1167,4 @@ public class ActionScript3Test extends ActionScriptTestBase { expectedResult = expectedResult.replaceAll("[ \r\n]", ""); assertEquals(actualResult, expectedResult); } - - @Test - public void testRegExp() { - decompileMethod("testRegExp", "var a1:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" - + "var a2:* = /[a-z\\r\\n0-9\\\\]+/i;\r\n" - + "var b1:* = /[0-9AB]+/;\r\n" - + "var b2:* = /[0-9AB]+/;\r\n", false); - } - - public void testDefaultNotLast() { - decompileMethod("testDefaultNotLast", "var k:* = 10;\r\n" - + "switch(k)\r\n" - + "{\r\n" - + "default:\r\n" - + "trace(\"def\");\r\n" - + "case 5:\r\n" - + "trace(\"def and 5\");\r\n" - + "break;\r\n" - + "case 4:\r\n" - + "trace(\"4\");\r\n" - + "}\r\n" - + "trace(\"after switch\");\r\n", false); - } - - @Test - public void testDefaultNotLastGrouped() { - decompileMethod("testDefaultNotLastGrouped", "var k:* = 10;\r\n" - + "switch(k)\r\n" - + "{\r\n" - + "default:\r\n" - + "case \"six\":\r\n" - + "trace(\"def and 6\");\r\n" - + "case \"five\":\r\n" - + "trace(\"def and 6 and 5\");\r\n" - + "break;\r\n" - + "case \"four\":\r\n" - + "trace(\"4\");\r\n" - + "}\r\n" - + "trace(\"after switch\");\r\n", false); - } - - /** - * Note: this one should be better compiled with ASC2/air, for String(xy) to - * be convert_s - */ - @Test - public void testManualConvert() { - decompileMethod("testManualConvert", "trace(\"String(this).length\");\r\n" - + "trace(String(this).length);\r\n", false); - } - - @Test - public void testPrecedenceX() { - decompileMethod("testPrecedenceX", "var a:* = 5;\r\n" - + "var b:* = 2;\r\n" - + "var c:* = 3;\r\n" - + "var d:* = a << (b >>> c);\r\n" - + "var e:* = a << b >>> c;\r\n", false); - } - } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java index cc4aa0062..69a354b65 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java @@ -37,6 +37,8 @@ import java.io.FileInputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @@ -53,7 +55,12 @@ public class AS3Generator { List scriptPacks = swf.getAS3Packs(); StringBuilder s = new StringBuilder(); + Map sortedPacks = new TreeMap<>(); for (ScriptPack pack : scriptPacks) { + sortedPacks.put(pack.getClassPath().toRawString(), pack); + } + for (String packClassName : sortedPacks.keySet()) { + ScriptPack pack = sortedPacks.get(packClassName); ABC abc = pack.abc; if (pack.getClassPath().packageStr.toRawString().equals("tests")) { abc.findClassByName(pack.getClassPath().toRawString()); @@ -67,7 +74,7 @@ public class AS3Generator { String lower = clsName.substring(0, 1).toLowerCase() + clsName.substring(1); if (name.equals("run")) { s.append("@Test\r\npublic void "); - s.append(name); + s.append(lower); s.append("(){\r\ndecompileMethod(\""); s.append(lower); s.append("\", "); diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf b/libsrc/ffdec_lib/testdata/flashdevelop/bin/flashdevelop.swf index 880bcf1252528a9a33a6d59153fa8e4d27baa3e2..e05772276b8b7157542d61b7e58e2132e0b1ecea 100644 GIT binary patch literal 15850 zcmVa7d7dg0`)c6;N(%*;n0eRSrdxigLC z&6(2q^XF$~%QNNjG+Ioz?$+CtJJa>nv6Ca8=LJHPM&n` zy0YxubYru*#&5Z@JY%of>vp}}nkk(r;YKUV7ix{>dZqnhWn*J)b-6;fo4GUHy46^| z{ZVDhp02G`TDP8`@f%W~_G)|0e(~Z;qiRoFUbF8^oSnGn_vfue6KcHTzvzq7*Q`+Q zGs}(jnT=*+Wpf$tRKu-!XSoaAVq>$qw%WR7H(%VW->x@4s`FNUDYaQ{+Ld-A*upKN z`n5{^=4R!l{o<={@!sAwf5%GOe({Y;eWG-3YN9+_E{WHm(&uOB*Oh*4rvwA|qLRsN zj=lBv^g9=?U3>rScP}Xqvl!*Tze~CQraiB`qVDYMd_AF|%EY0Y-}$;|)%d@z1G;cjyBIdN4Gsw zX&J3Hei(hVzS_=JR#sl!0z%$gZME&X-8A@BiuXN(zQ9iA;-yQkUb^w#+c&Pgck#7X z<8+r9`e61@)5bg5fjbQF`iD8 zXteaw!u)(%Jac8WwXs&YYhJ@0+P3+2^+S8Po#jusgsMt=8MsK(DO!ozfh+a4-K;FP zSGR0YQV7()(!g9=#g{wizQZz*6MhlBG(WeX&CSl51}mtASYdFKDOpR^EoNA%X=#?F z#w|5vsToUUmOf;uc}p9%^n#_2So)~0C>Tp6p`b4Pb1aogQh}Cbxq&g3JAl9AEEbO& z3S;U;MWsP!8jD?GI9GL)#^Tz;+1Ge!JTdnJt@F;q+0IuUUQs&lF0mTh8jLH-!^^62 zDmS1gooh?ll3vqm#>1L=SyNAS-a}VaQ{#ze(DkbiXFq32<*S_!mQ25yiDq9%GflW|z{n^z2fmmYH3O*W&!+1LY9^cPoY-G2Gy{^16dt zLR;&`GN?w&Zq2OU-KZ?z2Ds*CuG#I)jjMOxajq2y+v#TmJ)%qZB=e_z&bF+RZROFI5@gQxr-X00H zc+dGkH1ytW9BG`@g+;BrxDa#OJNQuN=Hmu45}-)Qkz_12$__A$s;cRRX~isy#mAYY zWi4%h2$42oh~ZCTl4mg5ISvDDkPYQ=4C5GOh8ed&0`!X*e}xe#0xp=&48Ve^M4voV zWa7H<4{4}Pq9?i%`T?#;Go4tGeU;t+tP|g!Ts9wGX3FHURZ~A% zj#bU7RgG2DSS)77tWF|Ozd0FcasNpt8EEs{li{1(f7(eE+5Kg`ldkHY(BBMQ8l7y_ zz#VZ$WjO*bK{|Zr03M`XGcG9>UuZgkNqn zFV+BBD4y3bHqm32NW*6DZ>=kw?AATbO?|7t;z$Wh3 z6Q1WwV%jA9J|0BR5*1Pl!=OS~DifAEU}*(Q9dVXKVv+<9RR@TpfEefz7CsI_zUFBJ zKVVFPpK9sGKOy*84`)w4Appj^05JVIiyN6vylAvO>m-YMiy&gP2qMLJ3(&|EmG-ik zTUV5LCs$-tG*~r?Y98EHXK0B{B`-5}s*^{VmB)*A3MfnQvXNXK*JHR&^XqY(W%ya< zaZ&%?*5uZpr6{MWdQtriTnz9FqnP;K*4C4%xjp;~J3F1jE*L%J9YqPP!4hr7Qa(!y zH6c&)koRp+b0XS&;5co4tFmsdT&y?hmpAKRcpCMVi^9VP{o(D>s?k40MxO?Bni~}` ztR?ZMEdI<{m3F(iS}j>GHyUeprA`FXxY%rh-vd62rMVb=2l{FPY&u;|?Df3}*K>O| zcn`OTzF|+ipIaz&@9CiaWcONp^WwrezGl2aOi{VK&vtxtMHg+ZR64jlPs0SF|g02Lf4H$7$%2NF$rJzFjcb?+kW)m@dJWZ00*fc5vJw8I}wgDxR>l& zWpl0lR-^r9rPY3|+1T8$J#Jv+8UNSp-muv}By@csK*4Sc{vZzNd!kZbnOMkrXZ(7e zoz+^ack~)$Xua0hY^EwT2-OpLhIaF0j)8DR@YmE zQ3f`bSP}dOYn->#VTTm~U#t*c41DF-z#xvoKJf*H`)|mcFu2~t{m*iziK$3~D=>*G zhiA#U+0k&||AU>KzX#?bkJ}4YWf*u4BAggpiOtv@;a`g|xbNRu zU9;b7-gTLaVM!M9>g@jE*nI||YY=B}-eGSmu4by)Y&2W3SKq$;DxERg;C~A~2HiUl zG^H8o6%&-)i(UZKO0y1eOUd0_&@C(qm625#0PH~73`_GC-n69;TI!I4za)O?l)ztx zWpg<4%(S2sQkmhi!e*2e)-)s827Lo3ELKIVp}F@t_;OG*3E*)IcG4#X{s_nz%$&oPl$=TEEtdl|2Quj~z?oKQ zHrXos(BVh1ctSniTS+iXhzQ=PIDgKeS6#mnA@X?ln$W#^;Zj{Z%XJ&l<6TU0wLt+K z8&n5S9E8;d;0?7HGzZXS8WKEH;BAORf;^Jm5=UOB3sff51zb|&ih_`&X6nXY^vNS5 zMS%)o&D0W|*u*{dgo|fSI|&GB5X_Q~i|VgTE*q_A2Cq?#M5~4s5Pocqgw+1m) zI_d4lmsOC@Q#j8)E-HD5lbwO8KKa|YQ|l>Lh7Lc%J&H8H^O^7l7CSHaLW1ga|6>7WO8n;1@IQg6>jOvy*aH z@=hjqAWS}UsEpH6P6U$H^#ot&^Il7jl6ndRv@Gt>+RiDhI{9Q4CHJ2el^mcQKNWu* z)3o9a-R}VI$8`+jF?^l>0or@;HEm$*8C4s2<%+Il?N$1g0XRPsg>!cTycvP>+uV>? zS>yb@4MtB$FB*g0YA36xf9;p(-w%FkOj0Uz>C;E0LiA~XzPeFTH_Gb9oVsyV-I!N5 z79{0BvHblbM;F_Mw!Bw?@K zyw$#2hkY@#BILq}<+aLY%Z64Kb_fGT&b5X#je^f4h@SSDflwu3FIdzIck1GzfZbrU zuM4?3M-(pzA<4AVL0Aqf)iq%fnjn7=O&wzSVH{)o6q10b@00ctQuvYkPmbJwdgT7H zj>8~;#UL^n5Se~KQAj#ZL-+yB6T(uusN8>&J4uXe?olz32MYiOb^@RIN5w3^EabkA z%h5+g_5gN*%%fs?_#vp|f!yDuUI%e2E@s6$hjGfubmy7e&r{tI6bMp%Gi4_NP^o3u8*|1r(1L)6O-^P2>7dG2>jTxkI>~D1Obk)^gyPgjlC@ zNllNL<9~f;M?bc+Q{UOSyR-B2J3F}koTb#0os;;gPjlbKdwkB)+GJ-E*ULH=7C&bh zeY!JE1xD^C=uKy!laBMRU&>v^L+5av=hySOmvFs^>lnX2pDW<{x!ietPFD@GgrKfG z{EzV)O$t*9wA5q6e-+m+;`?X$+I8|V{hUu97h}VC)6PqgiT+A(qVFz4UX83V@7c|I zrTO*-O!F|edy=Fy(L*izIMIVoawfVnK{+F(+Am0RG}t^eM?;k~&w@oi+#C(|4bM@M zD51rG;{g^0iBpHn7ZD`)WmD0>sjrJE$|ogFMPk%dnDs0TX1$o65)&0HyN;Qbz~@uU zkGFu*PHOwncLxEq$5s8iWch&YjU>jRCH`pl0Xwb^NmPvo9ATLVqz3j2sqaQ0#o5G& zwMgX}UnPNpYS?WFc)?qSfETJH z;025J0X)7e1bg|A<7$kNL?Hpt!OsP_!`cuhWrhaE+ht5#D*`t)!;?V0r{ObuAAD<& z4;f*JB=``G#ks)%vZKxtT(uD}GOMa#41ErFg!m6287{GHjvG?Xs?d5^ODM&9@;-QH zAe5Ol+g@jYsRGTe&5BBE9oh<;y~OTm>l)goQE0T*VHmdAnqD;X;Ey^v6vn9KAPTh= ze85tAsx$POqQh>XD&Uq(1y*rQiNRYdU{26G1-y!9DAqef1G%>hK1k7#z(a*A#Q%v{ z2QD^mZgK}am;B|1+88#WYxgT_{bO;whX9{L1R1%YIKLo3*;~&c`89ZVAbcL_@_o3f z*K5@qmF0Bc#e6`L>w^x~7&fh#8Ps7I*l^VP2Z~U0U@~x{5w6uqJZ5 zYmB>7+E;CEi|pE?xG*Q#A`|d}d8M&gZ`)1B(CZp}%dX)!)@}%?%i^T+ifr7CK7sHx zF9tCiAh_ZNyZopA>=_X;;nPb|ZIpxuNoZh60V;O%&4t-V~{_k-P0 z*A~v7*XGM}+Wh>iHov%_EuK3M52wAI;1)`=+S&7qF*0!*$-+^XxQ~y*fWj?^DT}4K zM<$sP$-vFPBtbs}ac0a?4_N9!OFw3*#RQQBMHvE9omW5{M(=@(8Rx`;si~9qPGH45 zb?=0df?!L})Ifr;aj*fs@@FiCt8+g5~<)oguMHDe~7z&AylJf#!vDgzrl zmzwUW6=h;c zpNjCHf_{05i~K;_ThQIAmHsW~&Lc3l1+yvC3)ydOHt-r3j&fzgk)!D<+-_T#r?)Ol zT%Q1@ zVI@o8Oz0lKathS}*GCA=0qM7b8ZUymWbN8r5Pm*_7PoxD+ZJO;_d9#RIhp3rxa zL%lQVWFigPp@#Q4>QL){i|8cmq($W^Nw}br@L6@-13?wrPjc^oAdtwLB41KaN%-=q zdAJ2|>%B16lZGevxTx{s0U(6qB1d|up&UTj8Ah2(0Y+wi=sd0)BCjpZsvT%py6ami68LkPCnDG3X0%sKD;&4pf&SR(RzTt$wx(ln;FxOim?=pdA5kvvoi>{($7d}4ABM> z5JR*2j zQA(UXjTkZL4cm83;V_zTuTP&&Oi#NPUg`974EOkkefsp0u-@~_)2Hnv$rVq$CSi8m z$E;K6e~sR#J3lOXxG5FdpN|B$5~vGn7XdICCpOFad^60iFVjtLxe{w)8i zA7#giI3{tN#xbSBdPL%}DLB_yJORcm{*scw48lZ$W2d27G?P?~yL7?~*3l>8l9cm;_}Zhta)|1%Vk9Y8oSrMJn6pUN^Q6F%43 z?Oznl$o?vvuLscV7kRV6A}gvzt*94`uNu%(k~_ChZRZ~&456qZf}o}%jv!8<2-P@( z5#li`7Q+*Wf)8=7pddA+u!Lya5wy+owxd$p-|2Q+auy%vO%F&-@xEPdJHDj7p^^HZ z+b>3VuR}`=&JBp5&_AK*2MVCj5kMh$6|!xN@n+9>%|swYu-ydO9pLR?{BUmfi_zO1 zMYD0!o znD;nEwVzBH+c3{1T5 zM&F1SA!)gRM33CZC=n+P_iS8`7x zlP7nn3O}VM$y{_IuJ~#pKjmonR?Z7cIyg-=a+(lynM2Mc-Ewb?ciwMzG%r0Wf`7g$2>sJxe-DrA4J}gPZZdD&8V&@SU zMB;l*aXCnY#;*b0bezt6GqcGXHxN2{~x*Vr}ovU1M=k%OO*Q&iMmW^jHeCMwn> zxVSw1QHzHw2m=8fj8LkO%MmGHc;Grdhy#e@4TQ?>e*tSjxN$#kDPS`vId6J(eRSS* zpWz@*;xF790!Y|P9WTr$i`%9*L}ZUjx0jC;p=kT!W$J6uvFD+f@nWL&gj{3b=(GLX z5S-JGeusqY?P7vrB`FNz6uf!9w>9wl(41tsY@I{ICKk2G;8W1nz9j772(5Y7z6t+m zPx&SZ*iKC!1#IyI3_GkeYNf1JOKP=jiqh;iD${@Bdh>dHcKZDF>r1EEYU~?0z4-Fd zX-R4oZ9`J4Q%K}Poc4sqf+Lx8R#5Z_1H;k9A#mXf(#2^;7rNkkng|Lp6`xAHtP=M_ zw8FXKLL#n`FEesI;WczlEKvj+*(fw*CdHQm{x|{+XeD2*EZ-72LoQMnstc1*$uire zRUa+0(We1EI?~~^xlvZ=Hw+%*$L+FR+ZWI6TN7i7I6;Gl2|5leNW8K>aZGZpjXs1B zDOpLoG$3?Fi+dvVT!}l(Mtk~r<-x8-tPmfG$Ka|GOo*VG6xINJp%d%sXbqz==p*}! zY|w$?Z$~U|Jg9+Kb_#8PM&k{p++&D7hx5Rc1qnB`T?Bk_lHM+=Qz@K4pTQeF>0}>a z(Nj>AgNAw=peFzEI0~!!<6|fuT+*iC-l){n2bVQ6u$6Uf;NS1;#PpcfAwmd_T#9EU zo<2kxySw5pMDWl3fUeYB(94Dix2lh9nDYo{Q54YAt1rB;pjVI3#|tkk(%GVB*HJ-SE&ss z3C&2fo?sR!?FqPZjv$f;BC`mV6!t2tWrR4-NVY!%N%uASFGq0ZECepP#w1bEt?DCQHiN$z8TJO-jxactBy~W4fS73?iIWH2TdTy!o?4BT86oRDF)d!teRpW)k zNFo-B7X(iT0%(bNK?DmR(~y_kB^oR+N0RoFWKi`c_f7>(|_NJ1la=nwql}xMU zTM*7pNdz!Z$BCa@(i?M*n<<|pfgi=kpIC1xJp?EotiFV}V3G*o-3fPIsA>K55Qudm zZ;-uXouKqEjtQ`l+~IqJEU8GT$7&ikRqRXY(4Dy&jez4_EDOae=4laM~6Z_pR%aG$+)Va6&3C3G=*|AVMcSk+HDIGoDdf z9}4?m@Oc_WKeC=_TJq0<)ekz2>@#?o6j(){5{cX)943~-h9l+^VL}n7;4Uhu?&$bd z1RY{#f^;DA)nv zOx%mPFygs85d%MnqadP+HB~HXQrbLj2MVUm)8VA}k`E{fe2bA|=EEtYXcWy)MPy6@ zmk<-bBd(IX@uS_)2jLemMcqyXu8LWCc0P0~fp=F5(szE%M)hPCiqh1r1>1u{4NRpzL@_OV3(5 zyp@M6Lkhbbz`zJwr0Uop$4CKhVsYDB0Z+L>{;A{i=7zE(t(MKWVG(&h5)>zMe_hRe zOv+fq#n2VYA?$L&-6_IQakRoq^s)8fkTH*xzzXprU&4!@>8`~H%qKl}dA7&@6$X-48V z35u*og6tYa9(Okbd^>{kYdn{cOKtO#CfKRzqb689fhcT6EX6-Ue6ge!7PliDOB|e2 z$f+p*s=W}b2Gqi$yNh8rNZ64=fnUUbeIZgPR@>i{6>38Gq?lU~5$t5K$$dfvUOuHb z7cjZFiOAqhs-xUTT;mbX*$_aHTSxp^6u4&rjC_%%1f z67U)f;Z?`s(5W|fcK+XloK548`jzB&1Pqq%~_U#lxG99@__d-O&4hVSxk`uS?3 zaeHF5Rjt2pv{aruJHJv@qQKKA^KI61QWou8kfJHJSN>0SRlKf_=0MKP5S%7>(< zI(5ks_`R=Ibo4E~WpE4MoKm3c^koeGUGzGV`Z>~)v3?f~*lqHl<^e|JF9}a-X-0~N zhGwKw=)Y9Y8F{|MO*EpTHy1^IM`N%sG%^%JP83B-FpQ-?3pYVWGkz3w@|cjRjjM#6GZ>yY>iq@9(7%e_i#>ZmmA@wDUIo4E+@}1Gj^34ZRi3bm+k~mTiUS{_g z0y7bzIdOj-*?MsY9=i}*Ua~!y7xyjIK z!gB{4LL2lHgcc)(taN4ynQW{S$U!U>qA||~X$-lJ57mZd>4R+F6e=TZ z-^IwH_ex`Z1N$sUDWY6@lap**U0U_g#ua@UEsV&$C7GO}ZD?*uCZ{e9Xr4ujd(OFY zj;f9uo}&G|S=bk^bRA0B3zDqB)PBFv$H&j_Q%sh{Ekd zt5J7X^iQHlp*U4f1{jxCBOZoWR{FRai6;;WZn9f(`wm$CH{sIAn#|1)jM&mE@PQO+ zD?#_wK(1;y&gEea0gS+Y|UBZ#aGw6_FLmyNt3?7?B$SB*LVoM=c?8+tb+TMdP33F+_{X8+cAtq$Bqd${tL2WVgmu=lMoxPAiGbK)@Jzl#Pe?g zJ+OltJf%9BFa=|urARu?%v;++*D<*5uha-Sl6D3KgqSO}opg~Y#2oJu9!B!+!yMmN(A@rp5jw^pF^sa|Br;_C&ZZqzg}*{s zDldzalkUh3ORDfdeIHff@^dhbTn|~sDo??(2#JGck=fQNDeRYTA$^aNB-7C}RwPZi zd?OlhN!=Z&qJftSdXE3%JXdndeS84O$$MZp0}7Di6`DuxP1 zSHD8Uhp2Xte00&sbT`Z7BXL1kiY1RgzFEa)+vcdG@XP~}fU--|R{s`J{{Jyt93iu}Q%{kt|#%^Lxn8Ho4*v7LwMyAWJM^oUro{e^YV{Tt`cW&dM zPQl&dR3uixBd}3c`M~aX@h6I~E?U0FydPHyZk_T9F>vbKgAkcSu(z9+7}0kkbazxL zU|)=7zOl_0)}VkkS%NKz#l>b zp+Wb)uR!JQZ1^8XW=3F(i)W<}bWzdAg_S=5C|Bz(u9IUtSUCk*j@MwvIoonB;$BH^ zvtFl7IjD9;Y$!u?oYPPDhKTWSauoDd5GK~|Lj0tRhHFWVz$ z7)Zt=C+#WX`XrKuU~(FIigT;NZVS#8kuXTtqhtBN4l;}<-q8aa)@aDM^QSOPq1>ct zDzZqBL@n=p7N_0L;JBF}*%@v}$?bdCl@V$}{H^I#5Q3NqU%C`7A8jld{7=n*ei6QN zW>v3QmrY2}846oP$GG@gi&GLsa%<^6W{$oI-r8i}CbC5i;JpB7JkXDWls z)RIN%^UTW@8tp5GPIuew??vDzjFU)YPaE&JC>)juX|O>bUF`x7B25112HjA?XbD<@ zhY;+f)gV|$=nIte1mU9Wj2GzYBT{(GILT)rN_;`dXUX~fUxbuKloI+XDUE!|A)WgU z73^aB{g~=Jv7j@YYf}N~inzmje{8|nZbz@~?6h`v{`AhyU*OyCbfPJKx@<7f-4<*` z0RB$X2B%`zm+cQ+cn?WxPPw{|YEJ1f9NK(uNn|mXxC^NX0aMar$~6Q_>AE*49S=mV z$CNsTA(@4O1KJIQ^Ha7zM@dC4q0lLjk}Ad0861QAO9@2DkYATb-k!;jxkGYM8U(K3#F$iMdZ*Ll)ocfIy@dF-Oa>TZhZ5h-5^MUaSh2T^tnjmc#=f5FWRQs2`DT3qI$sLvbeqn;} zg)6R!4f>_f8bv%l_LqfoX3_eT_(B!_Pf|IGVTPbQn??20qDtp!oR1Z?U!^t~ zoR1#=2kNK4ii@mBS@bKvf^%#~OE>zI&IjoHQ(WMjr!~Skl~YP1(=nCoEBvqfl9P&v z^p4K;>vps8#^$;gB0VM%`*4%BK5Dmw2H1TYK#gl)=VzUrWW`QJ*ieJ><_VkjeS`1O z#03jteyeiR2ID@V-r5ujS%a=tW=KrD)az|*BqDQn_+*7ezTn2Hdaa&zuHJt~d9*SYBBC^Zz zW^D2)bha86L2PCOjWRYfs_HSF?`8xq9`sG}=+z-WU(b)g;xkO{HCQT(j6@V_kG;QM zhX^}D6%VLJm21Xf8(07C&dwj~?EEn_S_Z|xs>R|YQ;VeeC6{Z;*$z)pE+>2IZWku3 zyOdFh%!n&>N{8y^>-TcJ9+qZAxQSWidnomBVuYTEi6N!{s6vH5TOeM9p*ad$2mZ+l zc8b2c-q=JQC=*d2n|4`UUiLO5Nb;$~?@<=!j!6U;wP5TvOkoX@m%J!7`fYx(i%+67= zCUPGWW!rq?SxqyoWwcI+S(su8TbaPLvlYIVfdwsa(uPFMXQHjx3X(Br9?(_VR?si= z61!)TbKDZ6Iv%Vvgfr}9popCe^7Po(;VpufRuB(mU}k98$N&Kg)^oUnXSEqnOq=1^ zjCN0$8l)3A>(RTtq~aOa7?Nh=%G40;j{x5em68C$1dM4WCx_B`7H6IuiUJPy+7;os z2vhTBL;jr~9`+Z9a2taB%pTQ*`EZ}! zpm)+X;%2#TyB7)n6&7h==bZYvjj1*6h zIN?xSxx}7}ri2tpwc`}h2#eF6s0euJi#}m2IJ;_tg^+jE?jA6?Kf6D;;CTrSZiG0w zZ&2*F=f1%mX+2HN{)V|bgZe)s!wd`N%T2p-+a2fuDf-Z>>to&~_ZjkFbKA@X$vwes zM8hn39(u(z(C$Ugp?0Ij`KFj|ukc{^MdY~{9BfED#OiTZE`x6{mZCr(o{GX1Mq=AY z)k>~cPvLq++KwO}M&`$mD{A+F|1iRbz2l_+_)Sny%JO%Ud~-M-aWkuc=mFN7hlm@wpC>;pp_J#KpkJ%{Cc;A_!) zbJ1PoA7-n9sXV@Svl;Q~WRgGCqa{^4xs4H{sg)OLrw^@MT7WT-XRPzm_Za!nyl)I7 zsR#zZcoMb_Cqo?)9h1|n*oTTZHnI1a@MB@I*vLH?1IZ4k!kJd=TYLb2$8j9QaY#js zI0OYJMx2>QbBx`IU&2NaFs3EQ42WBT&oNcLwXw!1sb|O>2+g&#od9=dbKJDK(H=5- zyl53;v@ao2h-dS7F=z(2YiiN>lnX)8P0+ZI0z;g$!G})natAO4VbuGa4J!p?lD8m1 zksW2MXu-x8G~`itZpfPf^CkRg!!9m^&@y>t$jnJ{pfK+JLWChh@aMaBd$U=0DQ!Wr zY5SFZi~#i>LNjiaRk_FIr3MeJEW4t=WbX0W)0C0Ca{Tf(@aNvZdb!b9vnz7Yr{9o( z>Rt7oU1iwG9p7&r{pocLlWB6fbuwpg5g)*Y8HIK^06`-RLv5{-+L|&i!uQ+R5PkrE zhkux8V>pypb%}ZhA_&OYn;g8Mk0J+dc#c$H2b4%?j^nX(7|J1F@m zPu4e9RA29m=djj4^mPId_&bM-`s-}`C%*x~K+tMFL&s^1J5{IZhDG1Q`u`}_r;1c0g^ekl2O1gi;;rwMyPrxdCrtObjD15V!1 zHP|!{q>#Q~cgg z4n&M+@E1PhWc?Kx^5Z84z7O>L7`EB(cauY0%nYRcxefkY`RV>?C2)HQAF#IsQ(qAh zBm*&83x#!~*>ltvoKd$3Fz6T_>%IsW<=|M8fI$hH_Ot2!D)JpGHKYz$)zy z;UQ@Vsko0rh}&Zbg=!T(x8zh5Yd7ysR2wUIvsl|!>)e&~RkCF;dt{kh%k7nkP>o=J zGQ8Drap>w* z(8sEzk98wWgg#c6^X)@%mHA!I${~BEBUqSgHxcI+@=U)*Y|SzPCX$~vNyP;gi7bUCo%)+J)KTIMtvPB;EDge)u{W@o00YSY>?8$K*-uG*rakFMJM0T^0sWp!Dn z@PK5EHX%F%E&p08acPyi5LcRa1u2wdOx}^kT(Y!@GG~dpQtvh1NL(f0Bp(hY8A)qDb^bAwQT0IA4i*uv&}m7z3HPNZ;By$V&hWp++Aso54A`PTwzu)<>d;*jeo+>M-A!j^*6$)N=62<#J;(VxuBLS- z{=iW_iQKmS&Nh;|SlR50*yBF)y8nL9(OC2M14zWO5#P9dbB;^NLeJv%>iVYKMEeSM z({el_rh0!l|0m%AZ`64=r$G(d@2KY%c5_sm<0}z=dlzu?a~|WNGPo>Is4hMo?gOeB z!41RO9*w)kVnmrv1B(&3Lv-;K$&5llh6VBP19qp3PCSC4aQ4b2bC>nv)P69;qoZmN zJ6s%Pl)GOlNW2#SP`1>!rO1tMl`EfyK;164)^;7&f?uFrFf;(V75ZSs^VU^E8BMl#zQG0;OER zOS?o+BP3`Vu@S_ZsySF6)DGNTCO%MZx$H#`xRm+)^4{*thfA5$6z>K0fJ>Ph$h?-j z!6np8f=hW%xPbv&XwA)H@gaDck!6flKMfp_6V%~a#s;}%jItsz-A%-c5K9muP$f!> zgg@jJ>RDBLFNU;hSPI4~z7_^JEb?cNZC4^XGqB;PkfwGx<#fE0L{u>ND^4^JEbNju zvpp9gBD@BwLwDk*OHhmGyk3R(<{02U1Vz8Dp(4-6i+v`F9t0f->}%n>Pn zSu7>OMax~|d^WS>^HiR&Q4~=EZeyQ&EBS5-Wo7G2;vq^tqe;6v?lvn*KDc*lQr@j% zj`6^Ct!cNsxfQ3$P8?=Axqg=iO;fz3;yp*$cemdoB&zbFI@#i;HI|kiB(bX6B=hJ~~rt+V=DcBK6ld zR@dz28Jx^;#T5UkX1o}7ZDC>TYZt3#259T#JVh?-%W zDQFMDR_TUiq%4Crs<(`6HfI?FmNAq~TPFS^R_%yo9E~4=Dwn2G0(qVjP5^rXX_#H- zl>==2AdbU0p20DJ873y~ zsZS>EX-_GWcmmtcGVDQ{P&1#iq?RMqq?3IDdMUn#EcU75n^U7lC%1iBS03Sb@R&Xx zUN)2maOHLLF>Z^TF-YzP^6K| z%LIxJfc_qIZkL?=%(+`~8#iNU$GwiJ>oe#&(m8^npfAjEP--ct-CWA;64ZW1R)Dy4 zM8e)O|0~MtJt`uo7f^YDjhl*;7CbfFtv*&g21BdA@R^yGDtks9aiD{vTe58 zEcA%Hi>5=n@%!R;`EvPviBSO9e2r9TPkvu|)5!7+u3*wK*`aV`( z{?0<+5VPQi>r>tb+rlRdA4-oo>VfT&Rz6pjev+~_U!HaKZ0FC3Ef^B9G;P5EtU^C8 zG#}W00Sk2!t283Wxd?(dA=stID4B*j9?x@XH>$^cgdEZq7qD~#Y6#c=?~ zL6%Bm${_4bn5f}Piq$#ES7%HGgQZ9&K^#sOnFQ=JZF(xUB7%Z0!Iw$+T#-X(n%qFK z;|HzNxlZQcJq>ZAvA@cBkdC_l}`i)?*rG5p`Z-n<7 z_4<*Aj2zLUb;zmIi|Elh#!_Y}T}#i>2N{r3crTjT5YzBuTt%{AqxNh69B*-eQQH9OgZ8mPr zlouBlXJ#uimC7_)OgHb;Th))I>&+9VpXWEY;x<?z+3-)?3Y)^0_i@w7PPsw%ORIww|wUZLP1ZROxmzA5AxJZ?1gs zVRgryuB}&_x4$$KHl#kSwbr`({N>fnWq0E0y8F?@`H9P6f8JU&p~kD>i#{*?nN{k2 zZe??0W~;Hey1jyTs^M0=v)qMlv9-OtzSg|$HlE+Ee^B52u+CeBrPOAn;Z|Fl(H4Fg z)vs6Ux3;Ud+~;3@llKm;`8!ry?(?rz>l5XRQxlchN?E)Hm40c4eqHI;_DV2-&nx-j z_UM~$O}~Bl`t|qTdgqGrpny@1{JT>8FWQ%sm(;zzy|1M;RGBz*^P682t^Up8uarIn zCjN2yjp|xm`TfD)Q56N(3coBW=cw5conL+RrAs%iG&Z-EH$S@Zc4PBaqq?!VQ?0Mv zc&)lqz5eozt5>hMD>v5HmYa>08@1Z1yK)m3H(GA9wOVaeZ}6d9b$8tL&8-_~^X#*9 z+jG^X(QM&|(bwv0tzva`_2nHPM-rBs`+Pt~y)~FD`yLsDP z-_o`=n|gVEb}=WOxw_WeTCd(Quj39a*L-XFeRri*;7_=Ms%mQmxX95dT8Y}eYxS1f zsIIiuc3e?XiqyZfiMh0fKkkVC4l6)T{6+Ng`NdgnZg$o*SV=9VO8p~DDOjp*F~d?# zOS3H1w$!Yp<}H<3`hcYlTH27Mmn?nQ(noYf!B{G31$DWfW!Y?o3bX<%_KmXQ7{13@ z%C-%KG4-;d(x5YqrLHiXt2#Y4VJ(N)z{JN*>8UVkwA8Otcw+h18S!)7L$y@zI+ zil;3;m_@_9t1P8!>Di@BEi=26tz~DIa<$y-Qofd-U9xL7|M;qMl>fV(LXQ+~@cVK1Y~0zZu6zJ+&COhQTiaW2+ zd?S4Fv#}>*id>AeJ>V_lf9FW2j)mAmJY*jTNtzp4xw6n{?x+_k2Eb~R)DcD?5-_z* z2Es#F1SIjTrkI`1Fgpw2*#H^=4*&EZWaGOL}bS3o}Gg$gFW~!Ob@Z{`gET!k$DTn6 z^K@yn3(E%Xh%+iH5`YQT8N7QxU_IyxNmXrzZI*O#m%vu4iH2cg^u zQ2tApS2TV2@N$&DS>13~FV{EgSGVg}e>Uq)AM?kKgdo_b)n@NzK=Nsr59U@C{6krM zRm9g^nt=8a(eBC-I^DOYGrwR}Tdl_0a@l%ub93FT)(PXrw|2lgkv1X5gbRc=-Vbho#K22OWP?0k9z_1 zpJp^ZP1WXe8blwH+LC9ss+-mcAlwoY+oFk$4^y=;jfwC0nVRYt-^Qd-b=63nK~v+w z?0b`+f)3;qqiwnDE6R}<*rcnTt(r$)RPJpMoxsY$@SONm8>Fcg(iI~z52@0mc{t;( zHW|U1fIp#mXydkprEFNn7<3tgSVg ztu3qRu58vj^Q|i zH_?rw7(Z|MFbQS&Fjcdi+I@Kc(S5>K1Pob#f%sI9_0X3L;$vs&gTSESW`gzj4++-e zid(C0ueaXZY`tD>wq9v$Zg07(K3yJuD*Q?JZ`kM^9QJ)6aVsAfEeJ5K4dG~_T3?-* zF9c`&`T{$zHP=4UYY=ht+U9m6TdhInnP`5v27yRI$-Yk@G%a@dvpJ~t?cEh$7tafP zjlPT7weKzBPy_QJpa#hbT+5)P4%veOYKj7uMIn|2AS<%IejKGkf(#7NUzeE_FeK@F zpBB$5irvmFu_^N^V`pp-5jJJfX}ehbQL5`lL5d2BUxs95?>;`=55jv=Db6U$l-wF#j_Nn7?;>ZQXshamPpYki@G7b#Cv#>^}qeHHZxWPfZwRRbPA1Xlyo`sh8in z`ZAp{*Wll!5QzRA2%pll42lU){zW$wYUNpv%w^?nKJw-lgjjEt`UrbER$9Z-KskzB$D$ZBmQqVr&6=eTBBf?PN`E_nv6nyEYPij& z%-9YMg###8-|ijKq{jekTD8$&YwUfG1I1bjJ!W@FZirwJy_0jnlLJTh{gVimC-<+3 z-K!fo)rIqgSQj6dT(&EzDI4+~q`R1GX8@t#8B-ANpms6@MxiYNaRffW?+~#Bp(HI6 zjzJ;Q0pB4;xilABjZNM7g^*A(lIBz!%dwVjrzY;Q$8Fm&nortkd_suIJaW`;O|GD1 z*+?0|iNn6VGr7|T(s%|9zP;0r`O?nqKDw%ckeZLPOf_Th=H40C#FW;i{{l zhq#BM)U;(xr86m`J%Wau!;EkMN20LpESCMt1Z=O>q3x4M(WClzmDM{6mJ>-+tJcf(( z=74P<>mR@|Or({V$b(5Mc*wlJzWcP*Y-jz2y`3*YK8h03A}VcKdWlrhGN0z_@LRw_>zm~U=xEV~W! zI`k0rTdXSS4)(bRAv;;z4dYt5JS#xXRS3x&_;8;;PrO71BGV8|1OPfD`5X!JzWR;R zXA?R!{L|7uYi6@dQ#EEX6Y>=4>>xu4g`Dasi~_A#7tGTnZv_;XZu90h_@KV7^-1r7=_L~D!hJ9qfXwtR*Oe*J>mR_cdZq{I0-3F=YpG_GRJ>) zZ%;q5w^!fWyR*0Vb9;NZ{)}bS)9usvQ=b%n9`6C2mp0j+#Py2KWyjB0UY~AHQ-M+Z zA$rr9Wy7)gpISLq_aj{W$5qYH<}bm z?Pc8=9r|TlKaan^z}K$RkLc%o^2kXI;Z55wBqsVx(TT2OqVKOcc_*>Pyz4gV)y7*} zu%^O78VHusM31%T;Y5!<$(!ij1m)b6>OLpU(P;D79F0}dJc|~6Z*w%-H$F$XfJu5Z zFhW=sVsa%WX83+l|8q>#1ONVK3D_JM@H=q+RDi&YZ( zqD6;5A72}yy+Yh^)y8nTl;)}pm>I+p0ZT)QEDZsFqQX4r@#5S(2-gGku7=OTJ#es5 zj%1jnGf;PE%;rV~XmoX!=IV}!VNg{KW8gEGk?lW$pt!_#Ie18Ut3nfEEuj=E%X{FW z0aIqWYKQhXAAlgd4fQxiBw~*j^Y?H? zaL}qdG%LBti-o8pBbW{**%&rbW=yZ4n`E%I;VA>Y+0OYI4GS6#lBK}Lq**45qd;to z1y;6;eL)qT3&0u-3eYXE&u>upSC|`7OVUfX$$e<`G8AFA>Jda-kZ8a@t$HYIC7%{q zBIBmreVaS;6>h3camP9L4L1!RhL<+C>n*q8*?i}`?}~2&PPI0L5N2_rc}=$SCLcl| zn+ZX-PXoz&!h152S?1B?sYCVk-h}&^c~o2y5chc~AvRgu73&wv+T8pF?fhItk`t5n z@umPbH79E^O!(a;Q?ptv&+h+1iKa9DKowu&R{Mz+cpS7E@TROB_71!q@2s^}Du;fs zKkC~2;-Yq;GN)a*FsofynAa9AF2XQ!x#j8QJ=*i-VBk1qm5eHn57-D^b?lm*e956t7#$-iZTFhdr$$H7`Y41W}K4^ z#TUdgigJ zD^N9B`^c=W!DdhZ9kO)u1;xf%Xz(vX=U=9ESxLd%O;-0WYjD3}wwkB4GDQY=Sm)ss z2s-9@Ss4(yemT^>3SXKSE0+T+r!?V7gHK}R6lh~J_#{@&feO}ae!6U?Ogee&pFE)x zY5`MMjie=&-DP0w^2-n_mW>BjHTdJ0Ro!b}HRz;jwhIrIjjNV&HH9^`lfR4#`Z^5m zbC|pYO3HA1bSb@iHH{u)w7yC!uGX%g1crV8?=_(V(fiT&8R~mVd8R%2VE09$&lcU4 ztimTm&55={PG={V(o@gyd!NFcQgmZOU0!^tuRX;w49Uo z+Oeg+uq@&uP);oIf|La+jlsTFu)zCOtG!#^y+>f03l3B$9tuCUy@}Vj^fXsP9Dh2u z3?IrSrtIxY6E`M?n^1tQyAxiciPNIh>HfO=;lw(Ysfk>ALX=5{8t+L&jwSaszm#Z# zcixo-E_gb!jMOPy^M#h8=$m)pkqF&bpQZNOeZKk^vsZy3jMn%Z%NKAA&>DXT9|8d3 zS&T1V;~@?koYk~(Cd_GRoC(zg_)wu);OYvYSRnORR3S!KKa}b9UxOQnG6ZnEUJtw* zi-iz0qGGvskl_!YmHq>^CUK*@m_}E!WQj5wCVtj+Wam9&m>qP9k1IS6VYY{G0kHy7 z1{gPgP@((*2hIo8Cc%NF3-C|mg9^t&@|Yjx8j7_6@iU0{J#?)5 z_|80Z3~o)zJ#K=`jS@DX6b_{g^Gs?#{b6?{2qK) z@sn|`pZqANi{Su!RV%$4VeteSVkkCA-(jrWt~Q#+T7A|1$fFZy&+b$k29C35jp=Fc ze0thAdlt6QB8^{g7iZp^u-&Bu1D*K|@lEH`(;*jGPMGX68_xQSd_Uw|d)bh)-XWb>q3roBv0e3w98*@2C)OUyOB7alS+C%Ml{AUPR zuJWk^>iBaxdsQY*RJ(X#77UJdu`-t-Hz}i7>KpD$Avj=+8K*~1>yjfbqgjzA$);qF zz+!vUQjc5uNlQHiO|7M#u}`XYNdt6=eR&GU1P(fXhJWi%vl9-ENgQW!OsTLGknCd$ zW+Y{&vDDfxC~3?kOey$o8>&TfO4Yz;z;{b#GX~ST@q2oFYLUjMpEO3}q%k^4#)4CU z+6W5WHc?ToXoUyv$CLLyMG@(Ih5t%!mt1S9ERQm7`)U_Q-kJ*UUYi_*mux z;bhxkv>oJaN2IoYxZiC@(R7G69g~{kefPQT_>%UTMyg(}s~+aPjxI4+v*FjQe@s5f z5@GCY`u<&yhLNQH>+=Y)Jw2}V;3&X33UUWj2M|pK`U$m=M=Hs( z6?K8uWEW`F)FsC(mGnhAdT{b+a+U*(2ZCQB@@OqKY5Ij9w`Eq7#vh#^585Z84=^oe+UC1b`kn2U*h6n9}v<)+QD>4 zT<^r$LP6e$#8GVDb#|S-sN6L`?cgKg6*=0A42EwfU9~2`)eX{@>Kv;gEC2*CL9$}* zCi+q`m_vwPe+o{PAF`Fg=!elOPpm;IvTy%*H=(0k8+hKD+d-|%Y)C2@ykyl~|0 zyW>Q5sq^m~!bPZ3dL(jRPXYjTH_|tzn~%vi0-hebe}IDA!#^Y$eAh|;EjW9UTl^Wg zbNrp1zJCkfg8~=5i;j&ZWF3y`S16q4Py+Z^g6O>C-h!vDZ+0t5^0!yhL-|`g0b>un zyjrcO%Vl-BVv5qj*Q?Wi_D17IeRg{B#*L-3Y%TS5oL+u$>8vEwincMK)+;1JB2K&F zV}4OEW}HD3ed6eV6dHu=!2OIu((M6XCzGTQLx)qeX~sSjB6Kwnv|`GhO24QQL&UYs z;);upq;6HYQF;4wlJ>5G*C* z*gg#iqRHZ}aJ^XO0#34L2wGT#!TYC5_OP9TuR=VEStX+|MM(y33cg*K+=b)r2|Ri^ z<}itsB(~TA%0Hjr^0|{cvGU~V4u!{SOu5TGg~G#8rYs1+*B5j zQ6fpaeuPMNiamZdF$uUg$hDe}{F20(`BgpS%)CcM z-1@4-W_jIWY?fb2(DTl_;w@r`@H&N16RT%HAK{JlgQJfWc>mFU3n)=TcwO=J(il7m z6?OI@d{_|7#`R@fM^uFULkc)Mj;kSPxOpQ|V{vN*Z#0f8;R8u(C83ieSuYBpr{e(X zL`82U0Q83Nk#*s&y2=x>_)r>@l(ET1_1@`O5)bp>1v92_(b}xP+t_w3#M@Wbo36xy zC3+IV%ABX<3X5btVJ%VG6?GRqZ90!8N_3CoFEE4&C-EPYAq;^KZXADneGW9aq(DtO zHZ8)tj{dj(I2~9{=$x~0j~ojzJA_RNjTGUJgv~x5gom-IbOPJ2Ccx&c3qHg~C2HkY z^^jV5j|f&|S}4Ve9O~!9+RTN^u(`9~ap~QK%gzh3ME|@y$LOD5DlNTTk+>klOs{K* zJh8~yrSxz*6%Qw)ut$(WON5ib`2yKO)L~=`@r25x8~F%@=8#Z%aA*#(jLkSC{biO! zO2T7wp-ojavCw95!WY^cPV)Y$O5Po`q@rVSNuMe_ynj{4a+;^*^gnycX@7zmQh;q_ zIqei*b0h)KH>&mR>N;rQ4s2XLO#3CzxoCs;dq@T4Hvwb??Hdpl`e(rJHP4(|ck8!W zw|$pYaV1l2`4$AWGZHC`)NwK>mvjf7$D;C?68TX=5Q^njWE4Oc7|%>ZAz`t+0>ax5 zKAz+a5M&epXGh)ukx-ZfX9v}YaY7)D1d`AjU`a)iELPLFb>k3viB1gH(F8)?!HVGn zV<;c~puD_?DUIm2d}NO;Kk&3CtH$og*p>hNHrz_ zpBEEO=%gz=<`;PWB5E7r;ZU4EPp#&~VGD}HG%fQNK%3%fCAlSy zz3+K>D#UlBiSMtukI$uKl8SU8=*R_KA+&HotDK*c%u;gi5LAN5h+GmjoXdH{1$TER zX5ULH0sjq*5}Z?@`$*qS`B>t4`4BPPkE0~QPc>DnaZ)BMZas=-!qVZh_CkoN6j-hl zDb5~D8IIwYpNQy*G%g`Tep6g!c;$V^6qj5T;(OHP$@eX#lG0R9Vqa}B(I^cvWGtG!9$3I0bow~yu@>H7 zX;R>Vz0cMp8WlW+Ff6&XhvkIA;Hn!0kxk+}_iGP&_^?AZEYe~?i=P)6a}1Cz9&bTr zOr(;?SbBldI>C&Iv`#9eb@I5YFq4z&nJ-6?nGczpx~c3br^G)bEry&_g5oB)O%nMc z(iBT^Z$mA9gEY5@ouDgL9HA@V3T|-(EQ+aMAK!BsQcTdPGdT3`p~W3Y=ARfscyn<| zB$yaZ=ARg)YS3f~f*!~1v;6jWiFH-nUZqoKb?C=%`=e-(;|-3zqCWH9lBPfN-cJ}h zSz~Eh0pUBdPj?3;wXs*zL$$GZ0@2#4SeZXZG^(US7PliX zOI)2-$muEnQ@g=fjp&d?cOS@pNNFIW0>nQ+XH6`=zb7l+glI}(nj(nQOMz1Sm^WR1Vi#SAr^wDDB0oji9i?~)g?T6E=jegYH&k;$j-Dg99B_Wb z&(Q9ZRW4 ze1sMyW%WL-dZ?^UK8=uzq$-l`IN65aDCv&(X+Y3S7I%f|MNi1)8sudEIAnWZ6w{$o zxg;&?JiHQ^m7MT*cXyG+>>*WtRv8qCl4hybB$@O2Ubryz9d%58~oiCYj-B<-A6 z=<|-^CM0D@#La8N5yXFjuBe$`L^zIT`xjnRyk8tG@HB#v3@bBuM7}8BC#~3^@b&RO+#8i1$2t-ny3HQrrNF*Y46YAm6eC9>! z!u9~J@$?S#BBysKxWf{`9fb6 zpt^_Yprp5u)>~t%+GxRI`y4;1@XtB^d7gh>kX+-XI}lP&wm`N-HV3(epeS8;#iK8C z7h)abfDEh>SaE-FRtXJ)$;Yu3S3&NE1}&m6;M;?*11m6X8G}&saf5_dg9{W0!Pi}D zR|qKmyD&&lBU*dKVmw6Y$l9F@6mW|53={~yM0SEt;V&@sGgwH!4|~P$Cj3G|TUTE; z95IyM?42&|T1|qODa;QNNxoJi{751d3TX7N)w-f(-t)UOMf*5Na=vLFAVGv2a?Tg* zye~;upi&TJNo(fC$rcZ1+9#=#638HiM#}F2rV0a2q=X`8JkAWDh_XP3j+gnJ#K^r$ z2~~WGA;-&ziXO(x@CRTB#Zo1-AkuL0Y8pa`IEXSD6@J!zAmz9j-X%Vkf?t7t0(#Ix zh0Yv09%?|0rK|x>jN73zsV3D~FHuUet0KRcKYT-yIxAA&Lv@z?91JE`BUCVdD5)9( zW1tvduC+!=x0Tz-(BNf6^ArVDN!umgh=yHKSw*U7^yPxCAXvCijQ0sq5Y5j3eK_Vc zvid<)g#^&i{2*DZx%+546RDvR`f%{C*`M~vf0!JNk}Mcd1++6bvFW61x-?GjA=yhw z(2yjpV-mDLJPVSbm0nTD&XyH*(M-Twriu#Z_KR){>~~q)*-sPi;A#$JOUe8RK_~rC7dn7R$zsGvhrRBVBif{FBw>P z?kJ>U0~VoW^KF=+uaLjnK?zCLMu~%mwn^1qKyWg0o^Vc{7Ano-;UiA68m7}N&{ph( zLF;6?o#y;HmPgN52z-<>WeOJ|xM`4!5cvv`(@?=t9`7Pw)DRf22ag_}fK{^(9D4pi zO%pcELPb;i{v&Ld8uVv}2wd#Mpa0*)^oV3Te@2Q+6%{>PXZZsFb+z8q>&Uszc<^Et zk{++YwlJ>cUD!cMal1}!v8&IDyDGL1Ad1fUXWj@mbQV26skSP!DW$Ml&u~27 z+-za9Aia)!>(ZLf?@XYVv@fDeep^Ym9I5n7u7Z=0tg50>_y(8ik-v=RrjVEn(VV6O zKkK%>Kp&0V6G*#o9$SR%yQ>!8w1oCRLPiL_QP_<8QI!-=&3yDtwDT7ic!)25us`kQ zFN)~Ke5o*8NI@qE_w@eM)AH1V_ll?CE@W|@vyt+^?km9Q6ccdFQjb{a6C&CXagN|n zv63l+P=jC|q>-Q@Lp!30EDZ)SEyx)e99*A9EI1~pp=Y`Gx-h~((1sg4axoxC2vgN$ zJgb5p*}y`Y?QZX|HeN|Rs>mx9dhU2LC(bO`va>B}GnDHF~z zSzJEcS~B=o%^<(k+>*Jh*Q~21g94odWpv~d5*=;InniA`oKeo&8ZQ7UrNv%-3oz};3n?sWxqG}Npm1%^q)+~=pydG z=hj9gVa2QIq5eob0kf9vBx5ybGQ+GQxU%lES&r3+OgepQyLnr^y{6q>Lmn0)7?S!) zyaCN_Nwwq^(rgo_-KHD#=3Jp9TKjWk?gE8ym@xiW!-!GkbHvue5DqC4IEzJ$_W7_4 zisP`%?6}JJ=iweVv_Fq_fXB_D!Z=9We*;JgCAlzq<3;7J4&~A=WO4(rh48OT<&fzE zzF^2b_=$7+n^SpQW|u5Vm1JJE(C85P5jsV1d^dqXVQD}jW7>zohvJY#Qlkxe=t~oM z5CQY^TW4aqLM41f9zxiY)`e&tK`>I%6^RS7w@svL2uooI5AqH|y7NufPdY*Ay)oLWNjCXQrB*_f?q7cYS|?ItWmztdqyKPO zLns;Ms}k`$Fc~KIJ#;kg3;XcVZ~g|Y>d1%r8;^dIC%sG{BBAH%WV`7SJ6n#$l$L#v zbc~%X$6{y8Us&vHITkxx29!F*&L-Y6{&#kYoh`>=XUiT^4iP(hVeyNOoyG2O?F^-( z;tONQign%t@#_Z=2!H7NBvvJyGDO6vh7A0B<6f?!348pxC_v`PDho zo_1+hpoz8S#3c(lfM)fU3yyw5y}d0Y1dr#}nyrSEvMl!J5MZZUShzd|SM&`yYGXaR zL-!)jv>NLcB3CGLb0v;l9eOC}_2JnJtuCCKg+&iJECSbhvDPuuEZ&2HQka%i&$Nsj z7ipfkqD#cKX=ML-pxUKOx_XdF*ASU>$(`#P$dH>Y9;b~f9@1VyPsCnAc?6`{uDZ@@ zI*&*@n!@%KWXtfzFo!v%KCMBfY#V;cbe^}%77h=$0w z3oEC?C|ZEpV^f${A>a;E#eJ$#<(hGr)z#nH+xza`-v5El%b-9w)o~`7>X3q%yelbt zFZ{u}FlL>^k6L0{T&q(eJU@MNklpW?G%eyy%w@i>Mh|C4?1`8iVjh4rRQa<7>_rrc z7fa&JflL)UjNaMU+=c*c!u5OGt*9$2L4N8CpHKWA6=53jT9t*CDj(LnP>)HoDfUjW z*%Ys(wIWt_*x3~87N1S25~OM9MxfHgu3Y{mnY4S1NC*mFUTm>F4jmIVy5&h>n1TH< zv8$$`-m?^C2um+iOvFfzu+cFbM@9N-q{|`|5~@fmbOm4NE+s>NM~8Wq(pTq^2O7f5 z?v#0-!c~MFyhzF7C~=A?+vU3yYDn$Ag4St~)H=)3t}=nS=PEq4wFPBy#)Z7ir=zR5 z%DOt0zfV^=S3$o#l3kk{G`ASl@i2t}oFTEbA`)8<(qmtRw+UVvnQSmaklY%1t>K_- zJ&QX))^k zCgN=f_cI4n6Y%4Gx+C8U-yhtscQ^rr>@FCg!ezC9!jvk7g9dZxfeHxay0lp5uo^3Yt2c%K$jz z3lb*$cu{iyph(cb{euS}2g;nojCCib^?xVE8g|bY8*cRjf3*9g2&AB{hv{AXXUHRd zn;cXwNuCXUBN}VTkufNy(e^L8j<+8}$~RB*d&Nh*ce2ps=!ioUBKD6vg&BM!nk>2a z3y&~QN=fY^%_BK+J%JM!DMX^Y85u1j?ya3hzm?$4-u9A+^3liArW})oKd9{C@cYl8 z;a_DR2***%+*js&zf=ut#k`m6RPbiqjTYvH+q%8EDgnvAUkpe=F#*ZHI0TS5g#7j% zgpSGgz@J6$%>{dr#gwfHM)Tys&1S@_lQsWLmzGrRWk^MwmR4Dy6!2Q5JP#WpPjM9_ z_%H@X1|u0#$!c%Ha%g8@AK~6F$XcV7$Q74wR$}+7wyA-o1Eaw=$`Q^mER`C*3qvB= z5LI~TitR4P@I8*>2#%v_Bq)%XNS2CCEnh$aaTwy#WJ1I(!2p>m-w{*ed!ffniO_X> z8K&iA#N6l)G2V78Cq+A1AtiBP5HAKb;x6ru{s|Y6k~`*b-Ezon>g0VlhRFzn;Ad<| zDYZwIEXY@6ei?Nv*axFVK&ojk-^G zOOjDMtn6VZSnv>vk6&Tt*&vG6H7IckMZQ;x7h1GK{0E8A;U%XUIpl<|ZD7tl0bW=(uRnfd1 zh5PV5^u5F$!Yjq9OT;`9q(H9ZSst&DBlmE)qbPZp+eI?3{)hc|mG&Uq!P`Z$h4=ke z5cUzC;%n4VUu};UvHm{@)dtWBw2wLZt8Dx$Ux(Nr$Uh!^9BR?0Px;nuC`q9rMe!*> zHR4m=DMInh1T5cJ!?r5*TQOr{LDEmgTJ&&dsOXb`QuY1!B`=X^HG%Rh0Z{0kVwD8A zXi<06$@>6C`^I61#16uy0$G_{q3o=0Q^7DRkdOg06;w8jBY!xX3K{x-LIM|fL)QGX zc#=4UESP=um#4nK$@=W>WP=%M{N@*pC6p8eV49Op#Y zjVvKCbUm_&IIl&%$2B<+U5V1dE zp?Ct9eN+xaBTg0MjHd+`9_nO17HPM!2l{saq3^@E`w#Y$Qv7wYFBi^oaPP{G_D*|& z+e;vUnI@Vhhu|Ptn9*9OxHlVJhko80dW%qlj`0ESo%m6S4mgP)l-z}9n)j_DfxPiY z7{~7;RbVd=3&U@HDF@F*e)%pvDeKuTCbkd}B}L4y5pOR63NIN06qOJ@@O=nCaVVi_ z2qj?~=__$p6rs%xY$FtPhiE5qcgJ?%mJW}>aeK^Pwgy4N!Qa!eHOxjvaU2mET$MDq zemYyB!Hsz8Ld%u^CxLO~Q|_)CY%a+4p@^)D`MqEFHuqL09}62vber(voL3)g4ohk3ZXM?`6yMA5u@f~91p z@Jk7r-g#GeM$!X%okF0>T36Wb4y$-Ql#-3i&*!5wF9n*1k-#E{q4sHBmUJw%+6@jN zp;hQd8ZgzA-YPQ6owO|F1Oo&De=U&n1|&ytQPD$3aQ*;{ueQ3jqEiGyrbb&=or7^; zy_vqU#yym)jXQ!UN)jmVNCPif=|q{gVqL3u8+7uL7MdFF;LLmbV?KY8h!Z()a(^Tp zCR^~%e1B9V>(IJ*CFusY(`q3p(z!7yLW)!*L2F>(Bc8}S%P9N}Cdlj9Pi_YLC?z*L zhO*p}`jBVG$WUgpKlU=4A%;LC7xh|F8niyYWkGJ)HGaTYGM9{+F-sq`7YA(#BYcPd zSAsZj8)B31!{`%;era~f)xGp+!`2@g;w@+q^MBDUh?NbxC&rK>-2ew0&vSMtYQnI< zjfT`jWU-=Xax8Mm)K!O$_4}WRvG-_Xka?gW>1Bhu9_nTNXVBX4fuun7%V}&SO?*%+ zEee(HBkIuyu15855g*Q82-jE>qTbq+ZrxiGxE2NhMb;qnL*!|+`w8k&IPb^#Hz8~f z?*1V@had?J{R=D=!_e4(Rf@0#d6jK_S#W}l4t z#*N$U|$70nWkN7ysD|fz7kOVIP zp!~>zqa3spUI6}I6vt1{>=NDW4Q}e0RV~7S zL~X-qX5y>LZJ*KT0+$M(U%}gb@o=edni9Og0dNufHU}*`!6nvAf=lHhg%WUytWc#+E0p+cMB6WFg%W5=u27W&S19RC<15s; z4#XwiMGz!`uuiL*+=qw}f6XX$=(KiK4z>6}2Ah{5s8wdmofkck83RGx-l9ilVG-CJ zwV=`Jr-38#!bN-wT0gg-QEnz|YviTxL@Xx=5vbDs$(gz>hBj8pER0-yEsStj&3De+>bSXeGj>{539Q5y~M?6-XS82tDu{hpTTn!fX+KLHdL``amO4sSS?pdzPRs_v(kK$F;K`^CjKK3?zm+< zZ6Akvm!?u0`&*{HNclAKw)&nfV{H5gj$=5U!ZCs4gdZudb6yPb@}PH!kw>605*Qy8 zDUYbRZ;+}SSuH4?#l&6p@x)#23FRM7W2;Ms{VvmL{xg=*ilnLZQe8kp#rLbk-Zy+d zT=ZxccdzQoLmc-X(Z_?UhH{@AQSMqxsmT?noanTcTE+{djQig}#9iMKG+tM2cBb9G ztoxD&MaK^zI)1P{j3SNvVUEGYJ9rs0lAcafyb~EI%ar2t!F*rB&bj{tVSoK#?o1H& zfOqtNwZa!B`w6-oyubm>ydWe&%TCOEteM2jmk(s-WBsDc{2^JcPCS3?-V(!AK8WWB z9bD*$B5-aMqr^%`ZBWXAm@wVMO3yc>v@PAlMwDVnm!(55`y3^vGnl%MCW64C>oM`r zSTaaF)IC<=JF?N%U;X!G6?`-u?Zoek-{p(t_a#OFU<)-;> zJn)CaN~b$lLN5IfD=&X%A#jLU@V)h^9D;4(6NV3Ez#MhKHhfUAD-JObo+zYUnDv8< z)y4B7aeF$I6N%e3=;?*#11a0FP-n18Q+PUwAP6{uxq6gxcECzq5HUv-H=|gv$XK)) zHGCMbaO*>?G>l^e#~6+yEStlWK?I#JTf^}bt8<30&X@`Y%aYav(LAABD9tpkpac6% zyD5sTOrW4k^JNllS+iK{a^5}xv`!b>`3HA3#G%qEj4kFK+%?ENWWHu%)7HmrZZ~9J zzd_M&i24m?1_F@) diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as index 6aba4e6c7..3d9031bfa 100644 --- a/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/Main.as @@ -27,12 +27,15 @@ package TestExpressions; TestFinallyZeroJump; TestFor; + TestForAnd; TestForBreak; TestForContinue; TestForEach; TestForEachObjectArray; TestForEachObjectAttribute; + TestForGoto; TestForIn; + TestForXml; TestHello; TestIf; TestIfElse; diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForAnd.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForAnd.as new file mode 100644 index 000000000..5ded0122c --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForAnd.as @@ -0,0 +1,33 @@ +package tests +{ + public class TestForAnd + { + + + public function run() : * + { + var len:int = 5; + var x : Boolean; + var a:int = 4; + var b:int = 7; + var c:int = 9; + for (var i:uint = 0; i < len; x = a > 4 && b < 2 || c > 10) + { + c = 1; + + if (c == 2) { + trace("A"); + if (c == 7) + { + trace("B"); + continue; + } + trace("C"); + } + trace("D"); + + } + } + + } +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForGoto.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForGoto.as new file mode 100644 index 000000000..1852b1f92 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForGoto.as @@ -0,0 +1,28 @@ +package tests +{ + public class TestForGoto + { + + + public function run() : * + { + var len:int = 5; + for (var i:uint = 0; i < len; ++i) + { + var c:int = 1; + + if (c == 2) + trace("A") + else if (c == 3) + trace("B") + else + continue; + + trace("C") + + } + trace("exit"); + } + + } +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForXml.as b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForXml.as new file mode 100644 index 000000000..e6699dde1 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/flashdevelop/src/tests/TestForXml.as @@ -0,0 +1,39 @@ +package tests +{ + public class TestForXml + { + + + public function run() : * + { + var name:String = "ahoj"; + var myXML:XML= + + {name} + + ; + + var k:* = null; + + var len:int = 5; + var a:int = 5; + var b:int = 6; + + for (var i:int = 0; i < len; k=myXML.book.(@isbn="12345")) + { + var c:int = 1; + + if (c == 2) + trace("A") + else if (c == 3) + trace("B") + else + continue; + + trace("C") + + } + } + + } +} \ No newline at end of file