From c777e82980e7df9ea2172af3a30e2c630f69f3cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sat, 14 Sep 2013 18:57:08 +0200 Subject: [PATCH] AS3: New P-code editing syntax inspired by RABCDAsm. AS3: Multiname and namespace editing. AS3: Editing whole trait in one textarea AS3: Removed messages about adding new constants AS3: Modified colors in editor AS3: Highlighting pair parenthesis/bracket AS3: Editing various new P-code parameters --- trunk/lib/jsyntaxpane-0.9.5.jar | Bin 506992 -> 512365 bytes .../main/jflex/jsyntaxpane/lexers/flasm3.flex | 96 + .../flasm3syntaxkit/config.properties | 9 +- .../flasm3syntaxkit/config_cs.properties | 9 +- .../flasm3syntaxkit/config_de.properties | 11 +- .../flasm3syntaxkit/config_es.properties | 7 +- .../flasm3syntaxkit/config_hu.properties | 9 +- .../flasm3syntaxkit/config_nl.properties | 7 +- .../flasm3syntaxkit/config_pt.properties | 7 +- .../flasm3syntaxkit/config_ru.properties | 13 +- .../flasm3syntaxkit/config_sv.properties | 9 +- .../flasm3syntaxkit/config_uk.properties | 13 +- .../flasm3syntaxkit/config_zh.properties | 9 +- trunk/resources/ffdec.sh | 80 +- .../com/jpexs/browsers/cache/CacheEntry.java | 4 +- .../jpexs/browsers/cache/chrome/Index.java | 24 +- .../browsers/cache/firefox/FirefoxCache.java | 6 +- .../firefox/IncompatibleVersionException.java | 7 +- .../browsers/cache/firefox/MapBucket.java | 7 +- .../browsers/cache/firefox/MetaData.java | 4 +- .../decompiler/flash/SWFInputStream.java | 2 +- .../com/jpexs/decompiler/flash/abc/ABC.java | 4 +- .../decompiler/flash/abc/avm2/AVM2Code.java | 203 +- .../flash/abc/avm2/ConstantPool.java | 39 + .../avm2/instructions/AVM2Instruction.java | 20 +- .../construction/NewFunctionIns.java | 2 +- .../flash/abc/avm2/parser/ASM3Parser.java | 620 +++- .../flash/abc/avm2/parser/Flasm3Lexer.java | 3164 +++++++++++++++-- .../flash/abc/avm2/parser/ParsedSymbol.java | 73 + .../flash/abc/avm2/parser/flasm3.flex | 111 +- .../flash/abc/types/MethodBody.java | 23 +- .../flash/abc/types/MethodInfo.java | 14 +- .../decompiler/flash/abc/types/Multiname.java | 101 +- .../decompiler/flash/abc/types/Namespace.java | 2 +- .../flash/abc/types/NamespaceSet.java | 7 + .../decompiler/flash/abc/types/ValueKind.java | 44 +- .../flash/abc/types/traits/TraitClass.java | 8 +- .../flash/abc/types/traits/TraitFunction.java | 4 +- .../types/traits/TraitMethodGetterSetter.java | 4 +- .../flash/abc/types/traits/Traits.java | 2 +- .../flash/action/ActionListReader.java | 92 +- .../flash/action/swf3/ActionWaitForFrame.java | 64 +- .../action/swf4/ActionWaitForFrame2.java | 54 +- .../action/swf5/ActionDefineFunction.java | 2 +- .../flash/action/swf5/ActionWith.java | 3 +- .../action/swf7/ActionDefineFunction2.java | 2 +- .../flash/action/swf7/ActionTry.java | 2 +- .../decompiler/flash/gui/ImagePanel.java | 14 +- .../flash/gui/LoadFromCacheFrame.java | 8 +- .../flash/gui/LoadFromMemoryFrame.java | 22 +- .../com/jpexs/decompiler/flash/gui/Main.java | 2 +- .../jpexs/decompiler/flash/gui/MainFrame.java | 15 +- .../decompiler/flash/gui/SWFPreviwPanel.java | 16 +- .../decompiler/flash/gui/abc/ABCPanel.java | 2 +- .../flash/gui/abc/ASMSourceEditorPane.java | 32 +- .../flash/gui/abc/DecompiledEditorPane.java | 63 +- .../decompiler/flash/gui/abc/DetailPanel.java | 7 +- .../flash/gui/abc/MethodBodyParamsPanel.java | 147 - .../flash/gui/abc/MethodCodePanel.java | 9 +- .../flash/gui/abc/MethodInfoPanel.java | 140 - .../flash/gui/abc/MethodTraitDetailPanel.java | 25 +- .../gui/abc/SlotConstTraitDetailPanel.java | 57 +- .../flash/gui/action/ActionPanel.java | 29 +- .../flash/gui/locales/MainFrame_cs.properties | 2 +- .../flash/gui/player/FlashPlayerPanel.java | 16 +- .../flash/gui/player/PlayerControls.java | 4 +- .../flash/tags/DefineBitsLossless2Tag.java | 3 +- .../flash/tags/DefineBitsLosslessTag.java | 1 - .../flash/tags/base/ContainerItem.java | 1 - .../decompiler/flash/types/MORPHGRADIENT.java | 2 +- .../src/com/jpexs/decompiler/graph/Graph.java | 2 +- .../decompiler/graph/model/BlockItem.java | 6 +- trunk/src/com/jpexs/helpers/Helper.java | 14 +- .../com/jpexs/helpers/LimitedInputStream.java | 2 +- .../jpexs/helpers/ReReadableInputStream.java | 4 +- .../flash/ActionScript2AssemblerTest.java | 4 +- 76 files changed, 4592 insertions(+), 1054 deletions(-) delete mode 100644 trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodBodyParamsPanel.java delete mode 100644 trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodInfoPanel.java diff --git a/trunk/lib/jsyntaxpane-0.9.5.jar b/trunk/lib/jsyntaxpane-0.9.5.jar index 5826bdabc4b9857d8af649c2341b30d6d5976256..735b1947c1cb4beafcfb9b05220d5f5229dd186d 100644 GIT binary patch delta 32637 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 delta 27163 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 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/flasm3.flex b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/flasm3.flex index 4e02c14fe..8482afaa9 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/flasm3.flex +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/flasm3.flex @@ -13,6 +13,7 @@ import jsyntaxpane.TokenType; %extends DefaultJFlexLexer %final %unicode +%ignorecase %char %type Token @@ -35,6 +36,9 @@ import jsyntaxpane.TokenType; return yychar; } + private static final byte PARAN = 1; + private static final byte BRACKET = 2; + private static final byte LESSGREATER = 3; %} /* main character classes */ @@ -101,6 +105,28 @@ ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":" {Label} {return token(TokenType.IDENTIFIER,yychar,yylength()-1); } + + + + + + "try" | + "flag" | + "param" | + "paramname" | + "optional" | + "returns" | + "body" | + "maxstack" | + "localcount" | + "initscopedepth" | + "maxscopedepth" | + "name" | + "trait" | + "method" | + "code" { yybegin(PARAMETERS); + return token(TokenType.KEYWORD);} + /* identifiers */ {InstructionName} { yybegin(PARAMETERS); return token(TokenType.KEYWORD); } @@ -108,6 +134,76 @@ ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":" } { + "from" | + "to" | + "target" | + "name" | + "type" { return token(TokenType.KEYWORD);} + /* multinames */ + "QName" | + "QNameA" | + "RTQName" | + "RTQNameA" | + "RTQNameL" | + "RTQNameLA" | + "Multiname" | + "MultinameL" | + "MultinameLA" | + "TypeName" | + "null" { return token(TokenType.KEYWORD2);} + "(" { return token(TokenType.OPERATOR,PARAN); } + ")" { return token(TokenType.OPERATOR,-PARAN); } + "[" { return token(TokenType.OPERATOR,BRACKET); } + "]" { return token(TokenType.OPERATOR,-BRACKET); } + "<" { return token(TokenType.OPERATOR,LESSGREATER); } + ">" { return token(TokenType.OPERATOR,-LESSGREATER); } + "Namespace" | + "PrivateNamespace" | + "PackageNamespace" | + "PackageInternalNs" | + "ProtectedNamespace" | + "ExplicitNamespace" | + "StaticProtectedNs" { return token(TokenType.KEYWORD2);} + "," { return token(TokenType.OPERATOR); } + + + /*Flags*/ + "EXPLICIT" | + "HAS_OPTIONAL" | + "HAS_PARAM_NAMES" | + "IGNORE_REST" | + "NEED_ACTIVATION" | + "NEED_ARGUMENTS" | + "NEED_REST" | + "SET_DXNS" { return token(TokenType.KEYWORD2);} + + "dispid" | + "value" | + "slotid" { return token(TokenType.KEYWORD);} + + + /* Value types*/ + "Integer" | + "UInteger" | + "Double" | + "Decimal" | + "Utf8" | + "True" | + "False" | + "Undefined" { return token(TokenType.KEYWORD2);} + + "FINAL" | + "OVERRIDE" | + "METADATA" { return token(TokenType.KEYWORD2);} + + "slot" | + "const" | + "method" | + "getter" | + "setter" | + "class" | + "function" { return token(TokenType.KEYWORD2);} + /* string literal */ \" { yybegin(STRING); diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties index 1cc2858ba..294e05903 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Toggle Token Marker # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties index e8bc11678..14f9e3fce 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = P\u0159epnout ozna\u010dova\u010d Token\u0 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 \ No newline at end of file diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties index 577faecd3..47aa46bf3 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties @@ -1,4 +1,4 @@ -Action.combo-completion.MenuText = W\u00E4hlen Sie einen Befehl aus +Action.combo-completion.MenuText = W\u00e4hlen Sie einen Befehl aus Action.toggle-token-marker.MenuText = Markierung umschalten # !!!! FFDec translators - please do not edit anything below this line !!! @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Markierung umschalten # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties index 8b4685cab..540f6533a 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Alternar marcador de Token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -38,3 +39,7 @@ PopupMenu = \ - , \ toggle-lines , \ toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties index 80ecc485e..98027a9d7 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Token Marker megjelen\u00edt\u00e9se/elrej # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties index 05ba176c7..84b012af7 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Token markering inschakelen # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -38,3 +39,7 @@ PopupMenu = \ - , \ toggle-lines , \ toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties index e650d5a1e..cd88b6c7e 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Alternar marcador de token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -38,3 +39,7 @@ PopupMenu = \ - , \ toggle-lines , \ toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties index 550398b90..e3e01c5b7 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties @@ -1,5 +1,5 @@ -Action.combo-completion.MenuText = \u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u044E -Action.toggle-token-marker.MenuText = \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u043E\u043A\u0435\u043D\u043E\u0432 +Action.combo-completion.MenuText = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e +Action.toggle-token-marker.MenuText = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 # !!!! FFDec translators - please do not edit anything below this line !!! #========================================================================== @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = \u0412\u043A\u043B\u044E\u0447\u0438\u0442 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties index 5bc13eaec..0c17cbe5d 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = V\u00e4xla Tecken Mark\u00f6r # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties index 63f3d838d..9dec78fe6 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties @@ -1,5 +1,5 @@ -Action.combo-completion.MenuText = \u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0456\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0456\u044E -Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u0432\u0438\u0434\u0456\u043B\u0435\u043D\u043D\u044F \u0442\u043E\u043A\u0435\u043D\u0456\u0432 +Action.combo-completion.MenuText = \u041e\u0431\u0435\u0440\u0456\u0442\u044c \u0456\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0456\u044e +Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u0442\u043e\u043a\u0435\u043d\u0456\u0432 # !!!! FFDec translators - please do not edit anything below this line !!! #========================================================================== @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043C\u043A\u043D\u0443 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties index 52f199567..96cc1dbed 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = \u5207\u6362\u4ee4\u724c\u6807\u8bb0 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/resources/ffdec.sh b/trunk/resources/ffdec.sh index 2394a091c..f5cf42837 100644 --- a/trunk/resources/ffdec.sh +++ b/trunk/resources/ffdec.sh @@ -1,2 +1,80 @@ #!/bin/sh -java -Xmx1024m -jar ffdec.jar $@ \ No newline at end of file +# FFDec requires Oracle Java 7 +# Look for java in these directories +LOOKUP_JRE_DIRS="/usr/lib/jvm/* /opt/java* /opt/jre*" +#Created by Petris 2009 -> Many thanks! +# Required version +REQ_JVER1=1 +REQ_JVER2=7 +REQ_JVER3=0 +REQ_JVER4=0 +JAR_FILE=ffdec.jar +MEMORY=1024m + +check_java_version () { + JVER1=`echo $JAVA_VERSION_OUTPUT | sed 's/java version "\([0-9]*\)\.[0-9]*\.[0-9]*_[0-9]*".*/\1/'` + JVER2=`echo $JAVA_VERSION_OUTPUT | sed 's/java version "[0-9]*\.\([0-9]*\)\.[0-9]*_[0-9]*".*/\1/'` + JVER3=`echo $JAVA_VERSION_OUTPUT | sed 's/java version "[0-9]*\.[0-9]*\.\([0-9]*\)_[0-9]*".*/\1/'` + JVER4=`echo $JAVA_VERSION_OUTPUT | sed 's/java version "[0-9]*\.[0-9]*\.[0-9]*_\([0-9]*\)".*/\1/'` + + if [ $JVER1 -gt $REQ_JVER1 ]; then + return 0 + elif [ $JVER1 -lt $REQ_JVER1 ]; then + return 1 + fi + + if [ $JVER2 -gt $REQ_JVER2 ]; then + return 0 + elif [ $JVER2 -lt $REQ_JVER2 ]; then + return 1 + fi + + if [ $JVER3 -gt $REQ_JVER3 ]; then + return 0 + elif [ $JVER3 -lt $REQ_JVER3 ]; then + return 1 + fi + + if [ $JVER4 -lt $REQ_JVER4 ]; then + return 1 + fi + + return 0 +} + +# Handle symlinks +PROGRAM="$0" +while [ -L "$PROGRAM" ]; do + PROGRAM=`readlink -f "$PROGRAM"` +done +cd "`dirname \"$PROGRAM\"`" + +# Check default java +if [ -x "`which java`" ]; then + JAVA_VERSION_OUTPUT=`java -version 2>&1` + check_java_version && exec java -Djava.net.preferIPv4Stack=true -Xmx$MEMORY -jar $JAR_FILE $@ +fi + +# Test other possible Java locations +for JRE_PATH in $LOOKUP_JRE_DIRS; do + if [ -x "$JRE_PATH/bin/java" ]; then + JAVA_VERSION_OUTPUT=`"$JRE_PATH/bin/java" -version 2>&1` + check_java_version && { + export JRE_PATH + exec $JRE_PATH/bin/java -Djava.net.preferIPv4Stack=true -Xmx$MEMORY -jar $JAR_FILE $@ + } + fi +done + +# Failed +if [ -x "`which xmessage`" ]; then + xmessage -nearmouse -file - < m = getResponseHeaders(); - if(m == null){ - return null; + if (m == null) { + return null; } for (String k : m.keySet()) { if (k.toLowerCase().equals(header.toLowerCase())) { diff --git a/trunk/src/com/jpexs/browsers/cache/chrome/Index.java b/trunk/src/com/jpexs/browsers/cache/chrome/Index.java index 15e6ed5b6..9e9217f66 100644 --- a/trunk/src/com/jpexs/browsers/cache/chrome/Index.java +++ b/trunk/src/com/jpexs/browsers/cache/chrome/Index.java @@ -9,8 +9,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; /** * @@ -49,17 +47,17 @@ public class Index { public Index(File file, File externalFilesDir) throws IOException { dataFiles = new HashMap<>(); this.externalFilesDir = externalFilesDir; - FileInputStream is = new FileInputStream(file); - rootDir = file.getParentFile(); - header = new IndexHeader(is, rootDir, dataFiles, externalFilesDir); - int tsize = kIndexTablesize; - if (header.table_len > 0) { - tsize = header.table_len; + try (FileInputStream is = new FileInputStream(file)) { + rootDir = file.getParentFile(); + header = new IndexHeader(is, rootDir, dataFiles, externalFilesDir); + int tsize = kIndexTablesize; + if (header.table_len > 0) { + tsize = header.table_len; + } + table = new CacheAddr[tsize]; + for (int i = 0; i < tsize; i++) { + table[i] = new CacheAddr(is, rootDir, dataFiles, externalFilesDir); + } } - table = new CacheAddr[tsize]; - for (int i = 0; i < tsize; i++) { - table[i] = new CacheAddr(is, rootDir, dataFiles, externalFilesDir); - } - is.close(); } } diff --git a/trunk/src/com/jpexs/browsers/cache/firefox/FirefoxCache.java b/trunk/src/com/jpexs/browsers/cache/firefox/FirefoxCache.java index e25835dba..4299cf496 100644 --- a/trunk/src/com/jpexs/browsers/cache/firefox/FirefoxCache.java +++ b/trunk/src/com/jpexs/browsers/cache/firefox/FirefoxCache.java @@ -34,7 +34,7 @@ public class FirefoxCache implements CacheImplementation { @Override public void refresh() { File dir = getCacheDirectory(); - if(dir==null){ + if (dir == null) { return; } File cacheMapFile = new File(dir, "_CACHE_MAP_"); @@ -108,10 +108,10 @@ public class FirefoxCache implements CacheImplementation { if (profileDir != null) { cacheDir = new File(profileDir, "Cache"); } - if(cacheDir == null){ + if (cacheDir == null) { return null; } - if(!cacheDir.exists()){ + if (!cacheDir.exists()) { return null; } return cacheDir; diff --git a/trunk/src/com/jpexs/browsers/cache/firefox/IncompatibleVersionException.java b/trunk/src/com/jpexs/browsers/cache/firefox/IncompatibleVersionException.java index 4003ff983..ad84b4aff 100644 --- a/trunk/src/com/jpexs/browsers/cache/firefox/IncompatibleVersionException.java +++ b/trunk/src/com/jpexs/browsers/cache/firefox/IncompatibleVersionException.java @@ -22,8 +22,7 @@ package com.jpexs.browsers.cache.firefox; */ public class IncompatibleVersionException extends Exception { - public IncompatibleVersionException(int version) { - super("Incompatible version: "+version); - } - + public IncompatibleVersionException(int version) { + super("Incompatible version: " + version); + } } diff --git a/trunk/src/com/jpexs/browsers/cache/firefox/MapBucket.java b/trunk/src/com/jpexs/browsers/cache/firefox/MapBucket.java index 148b9562f..ae54aa2a2 100644 --- a/trunk/src/com/jpexs/browsers/cache/firefox/MapBucket.java +++ b/trunk/src/com/jpexs/browsers/cache/firefox/MapBucket.java @@ -38,8 +38,7 @@ public class MapBucket extends CacheEntry { if (metadata == null) { try { metadata = new MetaData(getMetaDataStream()); - }catch(IncompatibleVersionException ie){ - + } catch (IncompatibleVersionException ie) { } catch (IOException ex) { Logger.getLogger(MapBucket.class.getName()).log(Level.SEVERE, null, ex); } @@ -71,8 +70,8 @@ public class MapBucket extends CacheEntry { return null; } String responseHead = m.response.get("response-head"); - if(responseHead==null){ - return null; + if (responseHead == null) { + return null; } String headers[] = responseHead.split("\r\n"); Map ret = new HashMap<>(); diff --git a/trunk/src/com/jpexs/browsers/cache/firefox/MetaData.java b/trunk/src/com/jpexs/browsers/cache/firefox/MetaData.java index e6ca79f18..57f2b84b4 100644 --- a/trunk/src/com/jpexs/browsers/cache/firefox/MetaData.java +++ b/trunk/src/com/jpexs/browsers/cache/firefox/MetaData.java @@ -27,8 +27,8 @@ public class MetaData { public MetaData(InputStream is) throws IOException, IncompatibleVersionException { CacheInputStream cis = new CacheInputStream(is); majorVersion = cis.readInt16(); - if(majorVersion!=1){ - throw new IncompatibleVersionException(majorVersion); + if (majorVersion != 1) { + throw new IncompatibleVersionException(majorVersion); } minorVersion = cis.readInt16(); location = cis.readInt32(); diff --git a/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java b/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java index a8716a3c4..bdf7fac91 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -528,7 +528,7 @@ public class SWFInputStream extends InputStream { } public List readActionList(List listeners, long containerSWFOffset, ReReadableInputStream rri, int maxlen, String path) throws IOException { - return ActionListReader.readActionList(listeners, containerSWFOffset, rri, version, (int)rri.getPos(), (int)rri.getPos() + maxlen, path); + return ActionListReader.readActionList(listeners, containerSWFOffset, rri, version, (int) rri.getPos(), (int) rri.getPos() + maxlen, path); } private static void dumpTag(PrintStream out, int version, Tag tag, int level) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java index 19e188395..35cafdcbf 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -88,14 +88,14 @@ public class ABC { public int removeDeadCode() { int rem = 0; for (MethodBody body : bodies) { - rem += body.removeDeadCode(constants); + rem += body.removeDeadCode(constants, null/*FIXME*/, method_info[body.method_info]); } return rem; } public void restoreControlFlow() { for (MethodBody body : bodies) { - body.restoreControlFlow(constants); + body.restoreControlFlow(constants, null/*FIXME*/, method_info[body.method_info]); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 0e3831c93..62ddcb507 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -65,7 +65,10 @@ import com.jpexs.decompiler.flash.abc.types.ABCException; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.MethodInfo; import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.ValueKind; import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitFunction; +import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.ecma.EcmaScript; @@ -715,19 +718,147 @@ public class AVM2Code implements Serializable { return s.toString(); } - public String toASMSource(ConstantPool constants, MethodBody body, boolean hex, boolean highlight) { - return toASMSource(constants, body, new ArrayList(), hex, highlight); + public String toASMSource(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, boolean hex, boolean highlight) { + return toASMSource(constants, trait, info, body, new ArrayList(), hex, highlight); } - public String toASMSource(ConstantPool constants, MethodBody body, List outputMap, boolean hex, boolean highlight) { + public String toASMSource(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, List outputMap, boolean hex, boolean highlight) { invalidateCache(); StringBuilder ret = new StringBuilder(); String t = ""; - for (int e = 0; e < body.exceptions.length; e++) { - ret.append("exception " + e + " m[" + body.exceptions[e].name_index + "]\"" + Helper.escapeString(body.exceptions[e].getVarName(constants, new ArrayList())) + "\" " - + "m[" + body.exceptions[e].type_index + "]\"" + Helper.escapeString(body.exceptions[e].getTypeName(constants, new ArrayList())) + "\"\n"); + if (trait != null) { + if (trait instanceof TraitFunction) { + TraitFunction tf = (TraitFunction) trait; + ret.append("trait function "); + ret.append(constants.multinameToString(tf.name_index)); + ret.append(" slotid "); + ret.append(tf.slot_index); + ret.append("\n"); + } + if (trait instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) trait; + ret.append("trait "); + switch (tm.kindType) { + case Trait.TRAIT_METHOD: + ret.append("method "); + break; + case Trait.TRAIT_GETTER: + ret.append("getter "); + break; + case Trait.TRAIT_SETTER: + ret.append("setter "); + break; + } + ret.append(constants.multinameToString(tm.name_index)); + ret.append(" dispid "); + ret.append(tm.disp_id); + ret.append("\n"); + } } + if (info != null) { + ret.append("method\n"); + ret.append("name "); + ret.append(info.name_index == 0 ? "null" : "\"" + Helper.escapeString(info.getName(constants)) + "\""); + ret.append("\n"); + if (info.flagExplicit()) { + ret.append("flag EXPLICIT\n"); + } + if (info.flagHas_optional()) { + ret.append("flag HAS_OPTIONAL\n"); + } + if (info.flagHas_paramnames()) { + ret.append("flag HAS_PARAM_NAMES\n"); + } + if (info.flagIgnore_rest()) { + ret.append("flag IGNORE_REST\n"); + } + if (info.flagNeed_activation()) { + ret.append("flag NEED_ACTIVATION\n"); + } + if (info.flagNeed_arguments()) { + ret.append("flag NEED_ARGUMENTS\n"); + } + if (info.flagNeed_rest()) { + ret.append("flag NEED_REST\n"); + } + if (info.flagSetsdxns()) { + ret.append("flag SET_DXNS\n"); + } + for (int p : info.param_types) { + ret.append("param "); + ret.append(constants.multinameToString(p)); + ret.append("\n"); + } + if (info.flagHas_paramnames()) { + for (int n : info.paramNames) { + ret.append("paramname "); + ret.append("\""); + ret.append(constants.constant_string[n]); + ret.append("\""); + ret.append("\n"); + } + } + if (info.flagHas_optional()) { + for (ValueKind vk : info.optional) { + ret.append("optional "); + ret.append(vk.toString(constants)); + ret.append("\n"); + } + } + ret.append("returns "); + ret.append(constants.multinameToString(info.ret_type)); + ret.append("\n"); + } + ret.append("\n"); + ret.append("body\n"); + + ret.append("maxstack "); + ret.append(body.max_stack); + ret.append("\n"); + + ret.append("localcount "); + ret.append(body.max_regs); + ret.append("\n"); + + ret.append("initscopedepth "); + ret.append(body.init_scope_depth); + ret.append("\n"); + + ret.append("maxscopedepth "); + ret.append(body.max_scope_depth); + ret.append("\n"); + + List offsets = new ArrayList<>(); + for (int e = 0; e < body.exceptions.length; e++) { + ret.append("try"); + + ret.append(" from "); + ret.append("ofs"); + ret.append(Helper.formatAddress(body.exceptions[e].start)); + offsets.add((long) body.exceptions[e].start); + + ret.append(" to "); + ret.append("ofs"); + ret.append(Helper.formatAddress(body.exceptions[e].end)); + offsets.add((long) body.exceptions[e].end); + + ret.append(" target "); + ret.append("ofs"); + ret.append(Helper.formatAddress(body.exceptions[e].target)); + offsets.add((long) body.exceptions[e].target); + + ret.append(" type "); + ret.append(body.exceptions[e].type_index == 0 ? "null" : constants.constant_multiname[body.exceptions[e].type_index].toString(constants, new ArrayList())); + + ret.append(" name "); + ret.append(body.exceptions[e].name_index == 0 ? "null" : constants.constant_multiname[body.exceptions[e].name_index].toString(constants, new ArrayList())); + ret.append("\n"); + } + + ret.append("\n"); + ret.append("code\n"); + for (AVM2Instruction ins : code) { offsets.addAll(ins.getOffsets()); } @@ -758,17 +889,17 @@ public class AVM2Code implements Serializable { } else if (offsets.contains(ofs)) { ret.append("ofs" + Helper.formatAddress(ofs) + ":"); } - for (int e = 0; e < body.exceptions.length; e++) { - if (body.exceptions[e].start == ofs) { - ret.append("exceptionstart " + e + ":"); - } - if (body.exceptions[e].end == ofs) { - ret.append("exceptionend " + e + ":"); - } - if (body.exceptions[e].target == ofs) { - ret.append("exceptiontarget " + e + ":"); - } - } + /*for (int e = 0; e < body.exceptions.length; e++) { + if (body.exceptions[e].start == ofs) { + ret.append("exceptionstart " + e + ":"); + } + if (body.exceptions[e].end == ofs) { + ret.append("exceptionend " + e + ":"); + } + if (body.exceptions[e].target == ofs) { + ret.append("exceptiontarget " + e + ":"); + } + }*/ if (ins.replaceWith != null) { for (Object o : ins.replaceWith) { if (o instanceof Integer) { @@ -1519,8 +1650,8 @@ public class AVM2Code implements Serializable { return ret; } - public int removeTraps(ConstantPool constants, MethodBody body, ABC abc, int scriptIndex, int classIndex, boolean isStatic, String path) { - removeDeadCode(constants, body); + public int removeTraps(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, ABC abc, int scriptIndex, int classIndex, boolean isStatic, String path) { + removeDeadCode(constants, trait, info, body); List localData = new ArrayList<>(); localData.add((Boolean) isStatic); //isStatic localData.add((Integer) (classIndex)); //classIndex @@ -1542,9 +1673,9 @@ public class AVM2Code implements Serializable { localData.add(refs); localData.add(this); int ret = 0; - ret += removeTraps(constants, body, localData, new AVM2GraphSource(this, false, -1, -1, new HashMap(), new Stack(), abc, body, new HashMap(), new ArrayList(), new HashMap(), refs), 0, path, refs); - removeIgnored(constants, body); - removeDeadCode(constants, body); + ret += removeTraps(constants, trait, info, body, localData, new AVM2GraphSource(this, false, -1, -1, new HashMap(), new Stack(), abc, body, new HashMap(), new ArrayList(), new HashMap(), refs), 0, path, refs); + removeIgnored(constants, trait, info, body); + removeDeadCode(constants, trait, info, body); return ret; } @@ -1927,7 +2058,7 @@ public class AVM2Code implements Serializable { } - private void restoreControlFlowPass(ConstantPool constants, MethodBody body, boolean secondpass) { + private void restoreControlFlowPass(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, boolean secondpass) { try { HashMap> refs; int[] visited2 = new int[code.size()]; @@ -1956,9 +2087,9 @@ public class AVM2Code implements Serializable { invalidateCache(); try { List outputMap = new ArrayList<>(); - String src = toASMSource(constants, body, outputMap, false, false); + String src = toASMSource(constants, trait, info, body, outputMap, false, false); - AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(src.getBytes("UTF-8")), constants, null, body); + AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(src.getBytes("UTF-8")), constants, null, body, info); for (int i = 0; i < acode.code.size(); i++) { if (outputMap.size() > i) { int tpos = outputMap.get(i); @@ -1978,11 +2109,11 @@ public class AVM2Code implements Serializable { Logger.getLogger(AVM2Code.class.getName()).log(Level.FINE, null, ex); } invalidateCache(); - removeDeadCode(constants, body); + removeDeadCode(constants, trait, info, body); } - public void restoreControlFlow(ConstantPool constants, MethodBody body) { - restoreControlFlowPass(constants, body, false); + public void restoreControlFlow(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) { + restoreControlFlowPass(constants, trait, info, body, false); //restoreControlFlowPass(constants, body, true); } @@ -1993,11 +2124,11 @@ public class AVM2Code implements Serializable { } } }*/ - public void removeIgnored(ConstantPool constants, MethodBody body) { + public void removeIgnored(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) { try { List outputMap = new ArrayList<>(); - String src = toASMSource(constants, body, outputMap, false, false); - AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(src.getBytes("UTF-8")), constants, body); + String src = toASMSource(constants, trait, info, body, outputMap, false, false); + AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(src.getBytes("UTF-8")), constants, trait, body, info); for (int i = 0; i < acode.code.size(); i++) { if (outputMap.size() > i) { int tpos = outputMap.get(i); @@ -2015,7 +2146,7 @@ public class AVM2Code implements Serializable { invalidateCache(); } - public int removeDeadCode(ConstantPool constants, MethodBody body) { + public int removeDeadCode(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) { HashMap> refs = visitCode(body); int cnt = 0; @@ -2027,7 +2158,7 @@ public class AVM2Code implements Serializable { } } - removeIgnored(constants, body); + removeIgnored(constants, trait, info, body); for (int i = code.size() - 1; i >= 0; i--) { AVM2Instruction ins = code.get(i); if (ins.definition instanceof JumpIns) { @@ -2038,7 +2169,7 @@ public class AVM2Code implements Serializable { } } } - removeIgnored(constants, body); + removeIgnored(constants, trait, info, body); return cnt; } @@ -2476,7 +2607,7 @@ public class AVM2Code implements Serializable { return ret; } - public static int removeTraps(ConstantPool constants, MethodBody body, List localData, AVM2GraphSource code, int addr, String path, HashMap> refs) { + public static int removeTraps(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, List localData, AVM2GraphSource code, int addr, String path, HashMap> refs) { HashMap decisions = new HashMap<>(); removeTraps(refs, false, false, localData, new Stack(), new ArrayList(), code, code.adr2pos(addr), new HashMap(), new HashMap>(), decisions, path); int cnt = 0; @@ -2503,7 +2634,7 @@ public class AVM2Code implements Serializable { } } //int cnt = removeTraps(refs, true, false, localData, new Stack(), new ArrayList(), code, code.adr2pos(addr), new HashMap(), new HashMap>(), decisions, path); - code.getCode().removeIgnored(constants, body); + code.getCode().removeIgnored(constants, trait, info, body); return cnt; } /*public static int removeTraps(List localData, AVM2GraphSource code, int addr) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/ConstantPool.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/ConstantPool.java index 6f1d86998..f1025ecfa 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/ConstantPool.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/ConstantPool.java @@ -46,6 +46,24 @@ public class ConstantPool { return constant_int.length - 1; } + public int addNamespace(Namespace ns) { + constant_namespace = Arrays.copyOf(constant_namespace, constant_namespace.length + 1); + constant_namespace[constant_namespace.length - 1] = ns; + return constant_namespace.length - 1; + } + + public int addNamespaceSet(NamespaceSet nss) { + constant_namespace_set = Arrays.copyOf(constant_namespace_set, constant_namespace_set.length + 1); + constant_namespace_set[constant_namespace_set.length - 1] = nss; + return constant_namespace_set.length - 1; + } + + public int addMultiname(Multiname m) { + constant_multiname = Arrays.copyOf(constant_multiname, constant_multiname.length + 1); + constant_multiname[constant_multiname.length - 1] = m; + return constant_multiname.length - 1; + } + public int addUInt(long value) { constant_uint = Arrays.copyOf(constant_uint, constant_uint.length + 1); constant_uint[constant_uint.length - 1] = value; @@ -164,4 +182,25 @@ public class ConstantPool { output.println("Multiname[" + i + "]=" + constant_multiname[i].toString(this, new ArrayList())); } } + + public String multinameToString(int index) { + if (index == 0) { + return "null"; + } + return constant_multiname[index].toString(this, new ArrayList()); + } + + public String namespaceToString(int index) { + if (index == 0) { + return "null"; + } + return constant_namespace[index].toString(this); + } + + public String namespaceSetToString(int index) { + if (index == 0) { + return "null"; + } + return constant_namespace_set[index].toString(this); + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java index ed4559b31..492c38452 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java @@ -171,15 +171,21 @@ public class AVM2Instruction implements Serializable, GraphSourceItem { for (int i = 0; i < definition.operands.length; i++) { switch (definition.operands[i]) { case AVM2Code.DAT_MULTINAME_INDEX: - s.append(" m["); - s.append(operands[i]); - s.append("]\""); - if (constants.constant_multiname[operands[i]] == null) { - s.append(""); + if (operands[i] == 0) { + s.append(" null"); } else { - s.append(Helper.escapeString(constants.constant_multiname[operands[i]].toString(constants, fullyQualifiedNames))); + s.append(" "); + s.append(constants.constant_multiname[operands[i]].toString(constants, fullyQualifiedNames)); } - s.append("\""); + /*s.append(" m["); + s.append(operands[i]); + s.append("]\""); + if (constants.constant_multiname[operands[i]] == null) { + s.append(""); + } else { + s.append(Helper.escapeString(constants.constant_multiname[operands[i]].toString(constants, fullyQualifiedNames))); + } + s.append("\"");*/ break; case AVM2Code.DAT_STRING_INDEX: s.append(" \""); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewFunctionIns.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewFunctionIns.java index 0ebdacffc..affb70867 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewFunctionIns.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewFunctionIns.java @@ -46,7 +46,7 @@ public class NewFunctionIns extends InstructionDefinition { String paramStr = ""; if (mybody != null) { try { - bodyStr = Highlighting.hilighMethodEnd() + mybody.toString(path + "/inner", false, isStatic, scriptIndex, classIndex, abc, constants, method_info, new Stack()/*scopeStack*/, false, true, false, fullyQualifiedNames, null) + Highlighting.hilighMethodBegin(body.method_info); + bodyStr = Highlighting.hilighMethodEnd() + mybody.toString(path + "/inner", false, isStatic, scriptIndex, classIndex, abc, null, constants, method_info, new Stack()/*scopeStack*/, false, true, false, fullyQualifiedNames, null) + Highlighting.hilighMethodBegin(body.method_info); } catch (Exception ex) { Logger.getLogger(NewFunctionIns.class.getName()).log(Level.SEVERE, "error during newfunction", ex); } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ASM3Parser.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ASM3Parser.java index d81f4411f..6f0e9a878 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ASM3Parser.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ASM3Parser.java @@ -23,12 +23,25 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.DeobfuscatePopIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.types.ABCException; import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.Namespace; +import com.jpexs.decompiler.flash.abc.types.NamespaceSet; +import com.jpexs.decompiler.flash.abc.types.ValueKind; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitFunction; +import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.logging.Level; +import java.util.logging.Logger; public class ASM3Parser { @@ -63,8 +76,8 @@ public class ASM3Parser { } } - public static AVM2Code parse(InputStream is, ConstantPool constants, MethodBody body) throws IOException, ParseException { - return parse(is, constants, null, body); + public static AVM2Code parse(InputStream is, ConstantPool constants, Trait trait, MethodBody body, MethodInfo info) throws IOException, ParseException { + return parse(is, constants, trait, null, body, info); } private static int checkMultinameIndex(ConstantPool constants, int index, int line) throws ParseException { @@ -74,7 +87,390 @@ public class ASM3Parser { return index; } - public static AVM2Code parse(InputStream is, ConstantPool constants, MissingSymbolHandler missingHandler, MethodBody body) throws IOException, ParseException { + private static void expected(int type, String expStr, Flasm3Lexer lexer) throws IOException, ParseException { + ParsedSymbol s = lexer.lex(); + if (s.type != type) { + throw new ParseException(expStr + " expected", lexer.yyline()); + } + } + + private static void expected(ParsedSymbol s, int type, String expStr) throws IOException, ParseException { + if (s.type != type) { + throw new ParseException(expStr + " expected", 0); + } + } + + public static boolean parseSlotConst(InputStream is, ConstantPool constants, TraitSlotConst tsc) throws IOException, ParseException { + Flasm3Lexer lexer = null; + try { + lexer = new Flasm3Lexer(new InputStreamReader(is, "UTF-8")); + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(ASM3Parser.class.getName()).log(Level.SEVERE, null, ex); + return false; + } + expected(ParsedSymbol.TYPE_KEYWORD_TRAIT, "trait", lexer); + int name_index = parseMultiName(constants, lexer); + + ParsedSymbol symb = lexer.lex(); + + + int flags = 0; + while (symb.type == ParsedSymbol.TYPE_KEYWORD_FLAG) { + symb = lexer.lex(); + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_FINAL: + flags |= Trait.ATTR_Final; + break; + case ParsedSymbol.TYPE_KEYWORD_OVERRIDE: + flags |= Trait.ATTR_Override; + break; + case ParsedSymbol.TYPE_KEYWORD_METADATA: + flags |= Trait.ATTR_Metadata; + break; + default: + throw new ParseException("Invalid trait flag", lexer.yyline()); + } + symb = lexer.lex(); + } + + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_SLOT: + case ParsedSymbol.TYPE_KEYWORD_CONST: + expected(ParsedSymbol.TYPE_KEYWORD_SLOTID, "slotid", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + int slotid = (int) (long) (Long) symb.value; + expected(ParsedSymbol.TYPE_KEYWORD_TYPE, "type", lexer); + int type = parseMultiName(constants, lexer); + expected(ParsedSymbol.TYPE_KEYWORD_VALUE, "value", lexer); + ValueKind val = parseValue(constants, lexer); + tsc.slot_id = slotid; + tsc.type_index = type; + tsc.value_kind = val.value_kind; + tsc.value_index = val.value_index; + tsc.kindFlags = flags; + break; + /*case ParsedSymbol.TYPE_KEYWORD_CLASS: + break; + case ParsedSymbol.TYPE_KEYWORD_FUNCTION: + break; + case ParsedSymbol.TYPE_KEYWORD_METHOD: + case ParsedSymbol.TYPE_KEYWORD_GETTER: + case ParsedSymbol.TYPE_KEYWORD_SETTER: + break;*/ + default: + throw new ParseException("Unexpected trait type", lexer.yyline()); + } + tsc.name_index = name_index; + return true; + } + + private static int parseNamespaceSet(ConstantPool constants, Flasm3Lexer lexer) throws ParseException, IOException { + List namespaceList = new ArrayList<>(); + ParsedSymbol s = lexer.lex(); + if (s.type == ParsedSymbol.TYPE_KEYWORD_NULL) { + return 0; + } + expected(s, ParsedSymbol.TYPE_BRACKET_OPEN, "["); + s = lexer.lex(); + if (s.type != ParsedSymbol.TYPE_BRACKET_CLOSE) { + lexer.pushback(s); + do { + namespaceList.add(parseNamespace(constants, lexer)); + s = lexer.lex(); + } while (s.type == ParsedSymbol.TYPE_COMMA); + expected(s, ParsedSymbol.TYPE_BRACKET_CLOSE, "]"); + } + loopn: + for (int n = 1; n < constants.constant_namespace_set.length; n++) { + int nss[] = constants.constant_namespace_set[n].namespaces; + if (nss.length != namespaceList.size()) { + continue; + } + for (int i = 0; i < nss.length; i++) { + if (nss[i] != namespaceList.get(i)) { + continue loopn; + } + } + return n; + } + int nss[] = new int[namespaceList.size()]; + for (int i = 0; i < nss.length; i++) { + nss[i] = namespaceList.get(i); + } + return constants.addNamespaceSet(new NamespaceSet(nss)); + } + + private static int parseNamespace(ConstantPool constants, Flasm3Lexer lexer) throws ParseException, IOException { + + ParsedSymbol type = lexer.lex(); + int kind = 0; + switch (type.type) { + case ParsedSymbol.TYPE_KEYWORD_NULL: + return 0; + case ParsedSymbol.TYPE_KEYWORD_NAMESPACE: + kind = Namespace.KIND_NAMESPACE; + break; + case ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE: + kind = Namespace.KIND_PRIVATE; + break; + case ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE: + kind = Namespace.KIND_PACKAGE; + break; + case ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS: + kind = Namespace.KIND_PACKAGE_INTERNAL; + break; + case ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE: + kind = Namespace.KIND_PROTECTED; + break; + case ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE: + kind = Namespace.KIND_EXPLICIT; + break; + case ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS: + kind = Namespace.KIND_STATIC_PROTECTED; + break; + default: + throw new ParseException("Namespace kind expected", lexer.yyline()); + } + + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + ParsedSymbol name = lexer.lex(); + expected(name, ParsedSymbol.TYPE_STRING, "String"); + ParsedSymbol c = lexer.lex(); + int index = 0; + if (c.type == ParsedSymbol.TYPE_COMMA) { + ParsedSymbol extra = lexer.lex(); + expected(name, ParsedSymbol.TYPE_STRING, "String"); + try { + index = Integer.parseInt((String) extra.value); + } catch (NumberFormatException nfe) { + throw new ParseException("Number expected", lexer.yyline()); + } + } else { + lexer.pushback(c); + } + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + + for (int n = 1; n < constants.constant_namespace.length; n++) { + Namespace ns = constants.constant_namespace[n]; + if (ns.getName(constants).equals(name.value) && (ns.kind == kind)) { + if (index == 0) { + return n; + } + index--; + } + } + return constants.addNamespace(new Namespace(kind, constants.forceGetStringId((String) name.value))); + } + + private static int parseMultiName(ConstantPool constants, Flasm3Lexer lexer) throws ParseException, IOException { + ParsedSymbol s = lexer.lex(); + int kind = 0; + int name_index = -1; + int namespace_index = -1; + int namespace_set_index = -1; + int qname_index = -1; + List params = new ArrayList<>(); + + switch (s.type) { + case ParsedSymbol.TYPE_KEYWORD_NULL: + return 0; + case ParsedSymbol.TYPE_KEYWORD_QNAME: + kind = Multiname.QNAME; + break; + case ParsedSymbol.TYPE_KEYWORD_QNAMEA: + kind = Multiname.QNAMEA; + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAME: + kind = Multiname.RTQNAME; + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAMEA: + kind = Multiname.RTQNAMEA; + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAMEL: + kind = Multiname.RTQNAMEL; + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAMELA: + kind = Multiname.RTQNAMELA; + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAME: + kind = Multiname.MULTINAME; + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAMEA: + kind = Multiname.MULTINAMEA; + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAMEL: + kind = Multiname.MULTINAMEL; + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAMELA: + kind = Multiname.MULTINAMELA; + break; + case ParsedSymbol.TYPE_KEYWORD_TYPENAME: + kind = Multiname.TYPENAME; + break; + default: + throw new ParseException("Name expected", lexer.yyline()); + } + + switch (s.type) { + case ParsedSymbol.TYPE_KEYWORD_QNAME: + case ParsedSymbol.TYPE_KEYWORD_QNAMEA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + namespace_index = parseNamespace(constants, lexer); + expected(ParsedSymbol.TYPE_COMMA, ",", lexer); + ParsedSymbol name = lexer.lex(); + expected(name, ParsedSymbol.TYPE_STRING, "String"); + name_index = constants.forceGetStringId((String) name.value); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAME: + case ParsedSymbol.TYPE_KEYWORD_RTQNAMEA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + ParsedSymbol rtqName = lexer.lex(); + expected(rtqName, ParsedSymbol.TYPE_STRING, "String"); + name_index = constants.forceGetStringId((String) rtqName.value); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAMEL: + case ParsedSymbol.TYPE_KEYWORD_RTQNAMELA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAME: + case ParsedSymbol.TYPE_KEYWORD_MULTINAMEA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + ParsedSymbol mName = lexer.lex(); + expected(mName, ParsedSymbol.TYPE_STRING, "String"); + name_index = constants.forceGetStringId((String) mName.value); + expected(ParsedSymbol.TYPE_COMMA, ",", lexer); + namespace_set_index = parseNamespaceSet(constants, lexer); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAMEL: + case ParsedSymbol.TYPE_KEYWORD_MULTINAMELA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + namespace_set_index = parseNamespaceSet(constants, lexer); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_TYPENAME: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + qname_index = parseMultiName(constants, lexer); + expected(ParsedSymbol.TYPE_LOWERTHAN, "<", lexer); + params.add(parseMultiName(constants, lexer)); + ParsedSymbol nt = lexer.lex(); + while (nt.type == ParsedSymbol.TYPE_COMMA) { + params.add(parseMultiName(constants, lexer)); + nt = lexer.lex(); + } + expected(nt, ParsedSymbol.TYPE_GREATERTHAN, ">"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + } + loopm: + for (int m = 1; m < constants.constant_multiname.length; m++) { + Multiname mul = constants.constant_multiname[m]; + if (mul.kind == kind && mul.name_index == name_index && mul.namespace_index == namespace_index && mul.namespace_set_index == namespace_set_index && mul.qname_index == qname_index && mul.params.size() == params.size()) { + for (int p = 0; p < mul.params.size(); p++) { + if (mul.params.get(p) != params.get(p)) { + continue loopm; + } + } + return m; + } + + } + return constants.addMultiname(new Multiname(kind, name_index, namespace_index, namespace_set_index, qname_index, params)); + } + + public static ValueKind parseValue(ConstantPool constants, Flasm3Lexer lexer) throws IOException, ParseException { + ParsedSymbol type = lexer.lex(); + ParsedSymbol value; + int value_index = 0; + int value_kind = 0; + switch (type.type) { + case ParsedSymbol.TYPE_KEYWORD_INTEGER: + value_kind = ValueKind.CONSTANT_Int; + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + value = lexer.lex(); + expected(value, ParsedSymbol.TYPE_INTEGER, "Integer"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + value_index = constants.forceGetIntId((Long) value.value); + break; + case ParsedSymbol.TYPE_KEYWORD_UINTEGER: + value_kind = ValueKind.CONSTANT_UInt; + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + value = lexer.lex(); + expected(value, ParsedSymbol.TYPE_INTEGER, "UInteger"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + value_index = constants.forceGetUIntId((Long) value.value); + break; + case ParsedSymbol.TYPE_KEYWORD_DOUBLE: + value_kind = ValueKind.CONSTANT_Double; + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + value = lexer.lex(); + expected(value, ParsedSymbol.TYPE_FLOAT, "Double"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + value_index = constants.forceGetDoubleId((Double) value.value); + break; + /*case ParsedSymbol.TYPE_KEYWORD_DECIMAL: + value_kind = ValueKind.CONSTANT_Decimal; + break;*/ + case ParsedSymbol.TYPE_KEYWORD_UTF8: + value_kind = ValueKind.CONSTANT_Utf8; + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + value = lexer.lex(); + expected(value, ParsedSymbol.TYPE_STRING, "String"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + value_index = constants.forceGetStringId((String) value.value); + break; + case ParsedSymbol.TYPE_KEYWORD_TRUE: + value_kind = ValueKind.CONSTANT_True; + break; + case ParsedSymbol.TYPE_KEYWORD_FALSE: + value_kind = ValueKind.CONSTANT_False; + break; + case ParsedSymbol.TYPE_KEYWORD_NULL: + value_kind = ValueKind.CONSTANT_Null; + break; + case ParsedSymbol.TYPE_KEYWORD_NAMESPACE: + case ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS: + case ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE: + case ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE: + case ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS: + case ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE: + case ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE: + + switch (type.type) { + case ParsedSymbol.TYPE_KEYWORD_NAMESPACE: + value_kind = ValueKind.CONSTANT_Namespace; + break; + case ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS: + value_kind = ValueKind.CONSTANT_PackageInternalNs; + break; + case ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE: + value_kind = ValueKind.CONSTANT_ProtectedNamespace; + break; + case ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE: + value_kind = ValueKind.CONSTANT_ExplicitNamespace; + break; + case ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS: + value_kind = ValueKind.CONSTANT_StaticProtectedNs; + break; + case ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE: + value_kind = ValueKind.CONSTANT_PrivateNs; + break; + case ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE: + value_kind = ValueKind.CONSTANT_PackageNamespace; + break; + } + lexer.pushback(type); + value_index = parseNamespace(constants, lexer); + break; + } + return new ValueKind(value_index, value_kind); + } + + public static AVM2Code parse(InputStream is, ConstantPool constants, Trait trait, MissingSymbolHandler missingHandler, MethodBody body, MethodInfo info) throws IOException, ParseException { AVM2Code code = new AVM2Code(); List offsetItems = new ArrayList<>(); @@ -83,12 +479,170 @@ public class ASM3Parser { List exceptionIndices = new ArrayList<>(); int offset = 0; + Flasm3Lexer lexer = new Flasm3Lexer(new InputStreamReader(is, "UTF-8")); ParsedSymbol symb; AVM2Instruction lastIns = null; + List exceptionsFrom = new ArrayList<>(); + List exceptionsTo = new ArrayList<>(); + List exceptionsTargets = new ArrayList<>(); + info.flags = 0; + info.name_index = 0; + List paramTypes = new ArrayList<>(); + List paramNames = new ArrayList<>(); + List optional = new ArrayList<>(); do { - symb = lexer.yylex(); + symb = lexer.lex(); + if (Arrays.asList(ParsedSymbol.TYPE_KEYWORD_BODY, ParsedSymbol.TYPE_KEYWORD_CODE, ParsedSymbol.TYPE_KEYWORD_METHOD).contains(symb.type)) { + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_TRAIT) { + if (trait == null) { + throw new ParseException("No trait expected", lexer.yyline()); + } + symb = lexer.lex(); + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_METHOD: + case ParsedSymbol.TYPE_KEYWORD_GETTER: + case ParsedSymbol.TYPE_KEYWORD_SETTER: + if (!(trait instanceof TraitMethodGetterSetter)) { + throw new ParseException("Unxpected trait type", lexer.yyline()); + } + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) trait; + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_METHOD: + tm.kindType = Trait.TRAIT_METHOD; + break; + case ParsedSymbol.TYPE_KEYWORD_GETTER: + tm.kindType = Trait.TRAIT_GETTER; + break; + case ParsedSymbol.TYPE_KEYWORD_SETTER: + tm.kindType = Trait.TRAIT_SETTER; + break; + } + tm.name_index = parseMultiName(constants, lexer); + expected(ParsedSymbol.TYPE_KEYWORD_DISPID, "dispid", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + tm.disp_id = (int) (long) (Long) symb.value; + + break; + case ParsedSymbol.TYPE_KEYWORD_FUNCTION: + if (!(trait instanceof TraitFunction)) { + throw new ParseException("Unxpected trait type", lexer.yyline()); + } + break; + + } + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_NAME) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_STRING, "String"); + info.name_index = constants.forceGetStringId((String) symb.value); + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_PARAM) { + paramTypes.add(parseMultiName(constants, lexer)); + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_PARAMNAME) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_STRING, "String"); + paramNames.add(constants.forceGetStringId((String) symb.value)); + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_OPTIONAL) { + optional.add(parseValue(constants, lexer)); + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_MAXSTACK) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + body.max_stack = (int) (long) (Long) symb.value; + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_LOCALCOUNT) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + body.max_regs = (int) (long) (Long) symb.value; + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_INITSCOPEDEPTH) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + body.init_scope_depth = (int) (long) (Long) symb.value; + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_MAXSCOPEDEPTH) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + body.max_scope_depth = (int) (long) (Long) symb.value; + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_RETURNS) { + info.ret_type = parseMultiName(constants, lexer); + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_FLAG) { + symb = lexer.lex(); + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_EXPLICIT: + info.setFlagExplicit(); + break; + case ParsedSymbol.TYPE_KEYWORD_HAS_OPTIONAL: + info.setFlagHas_optional(); + break; + case ParsedSymbol.TYPE_KEYWORD_HAS_PARAM_NAMES: + info.setFlagHas_paramnames(); + break; + case ParsedSymbol.TYPE_KEYWORD_IGNORE_REST: + info.setFlagIgnore_Rest(); + break; + case ParsedSymbol.TYPE_KEYWORD_NEED_ACTIVATION: + info.setFlagNeed_activation(); + break; + case ParsedSymbol.TYPE_KEYWORD_NEED_ARGUMENTS: + info.setFlagNeed_Arguments(); + break; + case ParsedSymbol.TYPE_KEYWORD_NEED_REST: + info.setFlagNeed_rest(); + break; + case ParsedSymbol.TYPE_KEYWORD_SET_DXNS: + info.setFlagSetsdxns(); + break; + } + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_TRY) { + expected(ParsedSymbol.TYPE_KEYWORD_FROM, "From", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_IDENTIFIER, "Identifier"); + exceptionsFrom.add((String) symb.value); + expected(ParsedSymbol.TYPE_KEYWORD_TO, "To", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_IDENTIFIER, "Identifier"); + exceptionsTo.add((String) symb.value); + expected(ParsedSymbol.TYPE_KEYWORD_TARGET, "Target", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_IDENTIFIER, "Identifier"); + exceptionsTargets.add((String) symb.value); + expected(ParsedSymbol.TYPE_KEYWORD_TYPE, "Type", lexer); + ABCException ex = new ABCException(); + ex.type_index = parseMultiName(constants, lexer); + expected(ParsedSymbol.TYPE_KEYWORD_NAME, "Name", lexer); + ex.name_index = parseMultiName(constants, lexer); + exceptions.add(ex); + continue; + } if (symb.type == ParsedSymbol.TYPE_EXCEPTION_START) { int exIndex = (Integer) symb.value; int listIndex = exceptionIndices.indexOf(exIndex); @@ -127,15 +681,15 @@ public class ASM3Parser { } if (symb.type == ParsedSymbol.TYPE_INSTRUCTION_NAME) { if (((String) symb.value).toLowerCase(Locale.ENGLISH).equals("exception")) { - ParsedSymbol exIndex = lexer.yylex(); + ParsedSymbol exIndex = lexer.lex(); if (exIndex.type != ParsedSymbol.TYPE_INTEGER) { throw new ParseException("Index expected", lexer.yyline()); } - ParsedSymbol exName = lexer.yylex(); + ParsedSymbol exName = lexer.lex(); if (exName.type != ParsedSymbol.TYPE_MULTINAME) { throw new ParseException("Multiname expected", lexer.yyline()); } - ParsedSymbol exType = lexer.yylex(); + ParsedSymbol exType = lexer.lex(); if (exType.type != ParsedSymbol.TYPE_MULTINAME) { throw new ParseException("Multiname expected", lexer.yyline()); } @@ -154,14 +708,16 @@ public class ASM3Parser { List operandsList = new ArrayList<>(); for (int i = 0; i < def.operands.length; i++) { - ParsedSymbol parsedOperand = lexer.yylex(); + ParsedSymbol parsedOperand = lexer.lex(); switch (def.operands[i]) { case AVM2Code.DAT_MULTINAME_INDEX: - if (parsedOperand.type == ParsedSymbol.TYPE_MULTINAME) { - operandsList.add(checkMultinameIndex(constants, (int) (long) (Long) parsedOperand.value, lexer.yyline())); - } else { - throw new ParseException("Multiname expected", lexer.yyline()); - } + lexer.pushback(parsedOperand); + operandsList.add(parseMultiName(constants, lexer)); + /*if (parsedOperand.type == ParsedSymbol.TYPE_MULTINAME) { + operandsList.add(checkMultinameIndex(constants, (int) (long) (Long) parsedOperand.value, lexer.yyline())); + } else { + throw new ParseException("Multiname expected", lexer.yyline()); + }*/ break; case AVM2Code.DAT_STRING_INDEX: if (parsedOperand.type == ParsedSymbol.TYPE_STRING) { @@ -257,7 +813,7 @@ public class ASM3Parser { operandsList.add(patCount); for (int c = 0; c <= patCount; c++) { - parsedOperand = lexer.yylex(); + parsedOperand = lexer.lex(); if (parsedOperand.type == ParsedSymbol.TYPE_IDENTIFIER) { offsetItems.add(new CaseOffsetItem((String) parsedOperand.value, code.code.size(), i + (c + 1))); operandsList.add(0); @@ -306,6 +862,23 @@ public class ASM3Parser { } while (symb.type != ParsedSymbol.TYPE_EOF); code.compact(); + for (LabelItem li : labelItems) { + int ind; + ind = exceptionsFrom.indexOf(li.label); + if (ind > -1) { + exceptions.get(ind).start = li.offset; + } + + ind = exceptionsTo.indexOf(li.label); + if (ind > -1) { + exceptions.get(ind).end = li.offset; + } + + ind = exceptionsTargets.indexOf(li.label); + if (ind > -1) { + exceptions.get(ind).target = li.offset; + } + } for (OffsetItem oi : offsetItems) { for (LabelItem li : labelItems) { @@ -325,6 +898,25 @@ public class ASM3Parser { for (int e = 0; e < exceptions.size(); e++) { body.exceptions[e] = exceptions.get(e); } + + info.param_types = new int[paramTypes.size()]; + for (int i = 0; i < paramTypes.size(); i++) { + info.param_types[i] = paramTypes.get(i); + } + + if (info.flagHas_paramnames()) { + info.paramNames = new int[paramNames.size()]; + for (int i = 0; i < paramNames.size(); i++) { + info.paramNames[i] = paramNames.get(i); + } + } + + if (info.flagHas_optional()) { + info.optional = new ValueKind[optional.size()]; + for (int i = 0; i < optional.size(); i++) { + info.optional[i] = optional.get(i); + } + } return code; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/Flasm3Lexer.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/Flasm3Lexer.java index 9229c9bac..5eaa2c27e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/Flasm3Lexer.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/Flasm3Lexer.java @@ -1,25 +1,15 @@ -/* - * Copyright (C) 2010-2013 JPEXS - * - * 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 3 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, see . - */ +/* The following code was generated by JFlex 1.4.3 on 11.9.13 21:54 */ + +/* Flash assembler language lexer specification */ package com.jpexs.decompiler.flash.abc.avm2.parser; +import java.util.Stack; + /** - * This class is a scanner generated by JFlex - * 1.4.3 on 19.9.10 10:36 from the specification file - * D:/Dokumenty/Programovani/JavaSE/ASDec/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex + * This class is a scanner generated by + * JFlex 1.4.3 on 11.9.13 21:54 from the + * specification file + * D:/Dropbox/Programovani/JavaSE/FFDec/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex */ public final class Flasm3Lexer { @@ -49,93 +39,119 @@ public final class Flasm3Lexer { * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = - "\11\12\1\4\1\2\1\0\1\4\1\1\16\12\4\0\1\40\1\0" - + "\1\43\1\0\1\11\2\0\1\46\3\0\1\23\1\0\1\17\1\20" - + "\1\0\1\16\3\47\4\24\2\7\1\15\1\3\5\0\4\11\1\21" - + "\25\11\1\6\1\25\1\10\1\0\1\14\1\0\1\36\1\44\1\27" - + "\1\41\1\22\1\45\1\42\1\13\1\32\3\13\1\5\1\34\1\33" - + "\1\30\1\13\1\37\1\35\1\31\3\13\1\26\2\13\4\0\41\12" - + "\2\0\4\11\4\0\1\11\2\0\1\12\7\0\1\11\4\0\1\11" - + "\5\0\27\11\1\0\37\11\1\0\u013f\11\31\0\162\11\4\0\14\11" - + "\16\0\5\11\11\0\1\11\21\0\130\12\5\0\23\12\12\0\1\11" - + "\13\0\1\11\1\0\3\11\1\0\1\11\1\0\24\11\1\0\54\11" - + "\1\0\46\11\1\0\5\11\4\0\202\11\1\0\4\12\3\0\105\11" - + "\1\0\46\11\2\0\2\11\6\0\20\11\41\0\46\11\2\0\1\11" - + "\7\0\47\11\11\0\21\12\1\0\27\12\1\0\3\12\1\0\1\12" - + "\1\0\2\12\1\0\1\12\13\0\33\11\5\0\3\11\15\0\4\12" - + "\14\0\6\12\13\0\32\11\5\0\13\11\16\12\7\0\12\12\4\0" - + "\2\11\1\12\143\11\1\0\1\11\10\12\1\0\6\12\2\11\2\12" - + "\1\0\4\12\2\11\12\12\3\11\2\0\1\11\17\0\1\12\1\11" - + "\1\12\36\11\33\12\2\0\3\11\60\0\46\11\13\12\1\11\u014f\0" - + "\3\12\66\11\2\0\1\12\1\11\20\12\2\0\1\11\4\12\3\0" - + "\12\11\2\12\2\0\12\12\21\0\3\12\1\0\10\11\2\0\2\11" - + "\2\0\26\11\1\0\7\11\1\0\1\11\3\0\4\11\2\0\1\12" - + "\1\11\7\12\2\0\2\12\2\0\3\12\11\0\1\12\4\0\2\11" - + "\1\0\3\11\2\12\2\0\12\12\4\11\15\0\3\12\1\0\6\11" - + "\4\0\2\11\2\0\26\11\1\0\7\11\1\0\2\11\1\0\2\11" - + "\1\0\2\11\2\0\1\12\1\0\5\12\4\0\2\12\2\0\3\12" - + "\13\0\4\11\1\0\1\11\7\0\14\12\3\11\14\0\3\12\1\0" - + "\11\11\1\0\3\11\1\0\26\11\1\0\7\11\1\0\2\11\1\0" - + "\5\11\2\0\1\12\1\11\10\12\1\0\3\12\1\0\3\12\2\0" - + "\1\11\17\0\2\11\2\12\2\0\12\12\1\0\1\11\17\0\3\12" - + "\1\0\10\11\2\0\2\11\2\0\26\11\1\0\7\11\1\0\2\11" - + "\1\0\5\11\2\0\1\12\1\11\6\12\3\0\2\12\2\0\3\12" - + "\10\0\2\12\4\0\2\11\1\0\3\11\4\0\12\12\1\0\1\11" - + "\20\0\1\12\1\11\1\0\6\11\3\0\3\11\1\0\4\11\3\0" - + "\2\11\1\0\1\11\1\0\2\11\3\0\2\11\3\0\3\11\3\0" - + "\10\11\1\0\3\11\4\0\5\12\3\0\3\12\1\0\4\12\11\0" - + "\1\12\17\0\11\12\11\0\1\11\7\0\3\12\1\0\10\11\1\0" - + "\3\11\1\0\27\11\1\0\12\11\1\0\5\11\4\0\7\12\1\0" - + "\3\12\1\0\4\12\7\0\2\12\11\0\2\11\4\0\12\12\22\0" + "\11\12\1\4\1\2\1\0\1\4\1\1\16\12\4\0\1\53\1\0" + + "\1\76\1\0\1\11\2\0\1\111\1\101\1\102\1\0\1\24\1\107" + + "\1\20\1\21\1\0\1\17\3\112\4\25\1\110\1\7\1\16\1\3" + + "\1\103\1\0\1\104\2\0\1\47\1\70\1\31\1\54\1\22\1\62" + + "\1\56\1\74\1\37\1\11\1\72\1\64\1\5\1\43\1\41\1\33" + + "\1\77\1\51\1\45\1\35\1\66\1\105\1\11\1\27\1\60\1\11" + + "\1\6\1\26\1\10\1\0\1\15\1\0\1\50\1\71\1\32\1\55" + + "\1\23\1\63\1\57\1\75\1\40\1\14\1\73\1\65\1\13\1\44" + + "\1\42\1\34\1\100\1\52\1\46\1\36\1\67\1\106\1\14\1\30" + + "\1\61\1\14\4\0\41\12\2\0\4\11\4\0\1\11\2\0\1\12" + + "\7\0\1\11\4\0\1\11\5\0\27\11\1\0\37\11\1\0\u01ca\11" + + "\4\0\14\11\16\0\5\11\7\0\1\11\1\0\1\11\21\0\160\12" + + "\5\11\1\0\2\11\2\0\4\11\10\0\1\11\1\0\3\11\1\0" + + "\1\11\1\0\24\11\1\0\123\11\1\0\213\11\1\0\5\12\2\0" + + "\236\11\11\0\46\11\2\0\1\11\7\0\47\11\11\0\55\12\1\0" + + "\1\12\1\0\2\12\1\0\2\12\1\0\1\12\10\0\33\11\5\0" + + "\3\11\15\0\4\12\7\0\1\11\4\0\13\12\5\0\53\11\37\12" + + "\4\0\2\11\1\12\143\11\1\0\1\11\10\12\1\0\6\12\2\11" + + "\2\12\1\0\4\12\2\11\12\12\3\11\2\0\1\11\17\0\1\12" + + "\1\11\1\12\36\11\33\12\2\0\131\11\13\12\1\11\16\0\12\12" + + "\41\11\11\12\2\11\4\0\1\11\5\0\26\11\4\12\1\11\11\12" + + "\1\11\3\12\1\11\5\12\22\0\31\11\3\12\244\0\4\12\66\11" + + "\3\12\1\11\22\12\1\11\7\12\12\11\2\12\2\0\12\12\1\0" + + "\7\11\1\0\7\11\1\0\3\12\1\0\10\11\2\0\2\11\2\0" + + "\26\11\1\0\7\11\1\0\1\11\3\0\4\11\2\0\1\12\1\11" + + "\7\12\2\0\2\12\2\0\3\12\1\11\10\0\1\12\4\0\2\11" + + "\1\0\3\11\2\12\2\0\12\12\4\11\7\0\1\11\5\0\3\12" + + "\1\0\6\11\4\0\2\11\2\0\26\11\1\0\7\11\1\0\2\11" + + "\1\0\2\11\1\0\2\11\2\0\1\12\1\0\5\12\4\0\2\12" + + "\2\0\3\12\3\0\1\12\7\0\4\11\1\0\1\11\7\0\14\12" + + "\3\11\1\12\13\0\3\12\1\0\11\11\1\0\3\11\1\0\26\11" + + "\1\0\7\11\1\0\2\11\1\0\5\11\2\0\1\12\1\11\10\12" + + "\1\0\3\12\1\0\3\12\2\0\1\11\17\0\2\11\2\12\2\0" + + "\12\12\1\0\1\11\17\0\3\12\1\0\10\11\2\0\2\11\2\0" + + "\26\11\1\0\7\11\1\0\2\11\1\0\5\11\2\0\1\12\1\11" + + "\7\12\2\0\2\12\2\0\3\12\10\0\2\12\4\0\2\11\1\0" + + "\3\11\2\12\2\0\12\12\1\0\1\11\20\0\1\12\1\11\1\0" + + "\6\11\3\0\3\11\1\0\4\11\3\0\2\11\1\0\1\11\1\0" + + "\2\11\3\0\2\11\3\0\3\11\3\0\14\11\4\0\5\12\3\0" + + "\3\12\1\0\4\12\2\0\1\11\6\0\1\12\16\0\12\12\11\0" + + "\1\11\7\0\3\12\1\0\10\11\1\0\3\11\1\0\27\11\1\0" + + "\12\11\1\0\5\11\3\0\1\11\7\12\1\0\3\12\1\0\4\12" + + "\7\0\2\12\1\0\2\11\6\0\2\11\2\12\2\0\12\12\22\0" + "\2\12\1\0\10\11\1\0\3\11\1\0\27\11\1\0\12\11\1\0" + "\5\11\2\0\1\12\1\11\7\12\1\0\3\12\1\0\4\12\7\0" - + "\2\12\7\0\1\11\1\0\2\11\4\0\12\12\22\0\2\12\1\0" - + "\10\11\1\0\3\11\1\0\27\11\1\0\20\11\4\0\6\12\2\0" - + "\3\12\1\0\4\12\11\0\1\12\10\0\2\11\4\0\12\12\22\0" - + "\2\12\1\0\22\11\3\0\30\11\1\0\11\11\1\0\1\11\2\0" - + "\7\11\3\0\1\12\4\0\6\12\1\0\1\12\1\0\10\12\22\0" - + "\2\12\15\0\60\11\1\12\2\11\7\12\4\0\10\11\10\12\1\0" - + "\12\12\47\0\2\11\1\0\1\11\2\0\2\11\1\0\1\11\2\0" - + "\1\11\6\0\4\11\1\0\7\11\1\0\3\11\1\0\1\11\1\0" - + "\1\11\2\0\2\11\1\0\4\11\1\12\2\11\6\12\1\0\2\12" - + "\1\11\2\0\5\11\1\0\1\11\1\0\6\12\2\0\12\12\2\0" - + "\2\11\42\0\1\11\27\0\2\12\6\0\12\12\13\0\1\12\1\0" - + "\1\12\1\0\1\12\4\0\2\12\10\11\1\0\42\11\6\0\24\12" - + "\1\0\2\12\4\11\4\0\10\12\1\0\44\12\11\0\1\12\71\0" - + "\42\11\1\0\5\11\1\0\2\11\1\0\7\12\3\0\4\12\6\0" - + "\12\12\6\0\6\11\4\12\106\0\46\11\12\0\51\11\7\0\132\11" - + "\5\0\104\11\5\0\122\11\6\0\7\11\1\0\77\11\1\0\1\11" - + "\1\0\4\11\2\0\7\11\1\0\1\11\1\0\4\11\2\0\47\11" - + "\1\0\1\11\1\0\4\11\2\0\37\11\1\0\1\11\1\0\4\11" - + "\2\0\7\11\1\0\1\11\1\0\4\11\2\0\7\11\1\0\7\11" - + "\1\0\27\11\1\0\37\11\1\0\1\11\1\0\4\11\2\0\7\11" - + "\1\0\47\11\1\0\23\11\16\0\11\12\56\0\125\11\14\0\u026c\11" - + "\2\0\10\11\12\0\32\11\5\0\113\11\3\0\3\11\17\0\15\11" + + "\2\12\7\0\1\11\1\0\2\11\2\12\2\0\12\12\1\0\2\11" + + "\17\0\2\12\1\0\10\11\1\0\3\11\1\0\51\11\2\0\1\11" + + "\7\12\1\0\3\12\1\0\4\12\1\11\10\0\1\12\10\0\2\11" + + "\2\12\2\0\12\12\12\0\6\11\2\0\2\12\1\0\22\11\3\0" + + "\30\11\1\0\11\11\1\0\1\11\2\0\7\11\3\0\1\12\4\0" + + "\6\12\1\0\1\12\1\0\10\12\22\0\2\12\15\0\60\11\1\12" + + "\2\11\7\12\4\0\10\11\10\12\1\0\12\12\47\0\2\11\1\0" + + "\1\11\2\0\2\11\1\0\1\11\2\0\1\11\6\0\4\11\1\0" + + "\7\11\1\0\3\11\1\0\1\11\1\0\1\11\2\0\2\11\1\0" + + "\4\11\1\12\2\11\6\12\1\0\2\12\1\11\2\0\5\11\1\0" + + "\1\11\1\0\6\12\2\0\12\12\2\0\2\11\42\0\1\11\27\0" + + "\2\12\6\0\12\12\13\0\1\12\1\0\1\12\1\0\1\12\4\0" + + "\2\12\10\11\1\0\44\11\4\0\24\12\1\0\2\12\5\11\13\12" + + "\1\0\44\12\11\0\1\12\71\0\53\11\24\12\1\11\12\12\6\0" + + "\6\11\4\12\4\11\3\12\1\11\3\12\2\11\7\12\3\11\4\12" + + "\15\11\14\12\1\11\17\12\2\0\46\11\12\0\53\11\1\0\1\11" + + "\3\0\u0149\11\1\0\4\11\2\0\7\11\1\0\1\11\1\0\4\11" + + "\2\0\51\11\1\0\4\11\2\0\41\11\1\0\4\11\2\0\7\11" + + "\1\0\1\11\1\0\4\11\2\0\17\11\1\0\71\11\1\0\4\11" + + "\2\0\103\11\2\0\3\12\40\0\20\11\20\0\125\11\14\0\u026c\11" + + "\2\0\21\11\1\0\32\11\5\0\113\11\3\0\3\11\17\0\15\11" + "\1\0\4\11\3\12\13\0\22\11\3\12\13\0\22\11\2\12\14\0" + "\15\11\1\0\3\11\1\0\2\12\14\0\64\11\40\12\3\0\1\11" + "\3\0\2\11\1\12\2\0\12\12\41\0\3\12\2\0\12\12\6\0" - + "\130\11\10\0\51\11\1\12\126\0\35\11\3\0\14\12\4\0\14\12" - + "\12\0\12\12\36\11\2\0\5\11\u038b\0\154\11\224\0\234\11\4\0" - + "\132\11\6\0\26\11\2\0\6\11\2\0\46\11\2\0\6\11\2\0" - + "\10\11\1\0\1\11\1\0\1\11\1\0\1\11\1\0\37\11\2\0" - + "\65\11\1\0\7\11\1\0\1\11\3\0\3\11\1\0\7\11\3\0" - + "\4\11\2\0\6\11\4\0\15\11\5\0\3\11\1\0\7\11\17\0" - + "\4\12\32\0\5\12\20\0\2\11\23\0\1\11\13\0\4\12\6\0" - + "\6\12\1\0\1\11\15\0\1\11\40\0\22\11\36\0\15\12\4\0" - + "\1\12\3\0\6\12\27\0\1\11\4\0\1\11\2\0\12\11\1\0" - + "\1\11\3\0\5\11\6\0\1\11\1\0\1\11\1\0\1\11\1\0" - + "\4\11\1\0\3\11\1\0\7\11\3\0\3\11\5\0\5\11\26\0" - + "\44\11\u0e81\0\3\11\31\0\11\11\6\12\1\0\5\11\2\0\5\11" - + "\4\0\126\11\2\0\2\12\2\0\3\11\1\0\137\11\5\0\50\11" - + "\4\0\136\11\21\0\30\11\70\0\20\11\u0200\0\u19b6\11\112\0\u51a6\11" - + "\132\0\u048d\11\u0773\0\u2ba4\11\u215c\0\u012e\11\2\0\73\11\225\0\7\11" - + "\14\0\5\11\5\0\1\11\1\12\12\11\1\0\15\11\1\0\5\11" - + "\1\0\1\11\1\0\2\11\1\0\2\11\1\0\154\11\41\0\u016b\11" - + "\22\0\100\11\2\0\66\11\50\0\15\11\3\0\20\12\20\0\4\12" - + "\17\0\2\11\30\0\3\11\31\0\1\11\6\0\5\11\1\0\207\11" - + "\2\0\1\12\4\0\1\11\13\0\12\12\7\0\32\11\4\0\1\11" - + "\1\0\32\11\12\0\132\11\3\0\6\11\2\0\6\11\2\0\6\11" - + "\2\0\3\11\3\0\2\11\3\0\2\11\22\0\3\12\4\0"; + + "\130\11\10\0\51\11\1\12\1\11\5\0\106\11\12\0\35\11\3\0" + + "\14\12\4\0\14\12\12\0\12\12\36\11\2\0\5\11\13\0\54\11" + + "\4\0\21\12\7\11\2\12\6\0\12\12\46\0\27\11\5\12\4\0" + + "\65\11\12\12\1\0\35\12\2\0\13\12\6\0\12\12\15\0\1\11" + + "\130\0\5\12\57\11\21\12\7\11\4\0\12\12\21\0\11\12\14\0" + + "\3\12\36\11\12\12\3\0\2\11\12\12\6\0\46\11\16\12\14\0" + + "\44\11\24\12\10\0\12\12\3\0\3\11\12\12\44\11\122\0\3\12" + + "\1\0\25\12\4\11\1\12\4\11\1\12\15\0\300\11\47\12\25\0" + + "\4\12\u0116\11\2\0\6\11\2\0\46\11\2\0\6\11\2\0\10\11" + + "\1\0\1\11\1\0\1\11\1\0\1\11\1\0\37\11\2\0\65\11" + + "\1\0\7\11\1\0\1\11\3\0\3\11\1\0\7\11\3\0\4\11" + + "\2\0\6\11\4\0\15\11\5\0\3\11\1\0\7\11\16\0\5\12" + + "\32\0\5\12\20\0\2\11\23\0\1\11\13\0\5\12\5\0\6\12" + + "\1\0\1\11\15\0\1\11\20\0\15\11\3\0\32\11\26\0\15\12" + + "\4\0\1\12\3\0\14\12\21\0\1\11\4\0\1\11\2\0\12\11" + + "\1\0\1\11\3\0\5\11\6\0\1\11\1\0\1\11\1\0\1\11" + + "\1\0\4\11\1\0\13\11\2\0\4\11\5\0\5\11\4\0\1\11" + + "\21\0\51\11\u0a77\0\57\11\1\0\57\11\1\0\205\11\6\0\4\11" + + "\3\12\16\0\46\11\12\0\66\11\11\0\1\11\17\0\1\12\27\11" + + "\11\0\7\11\1\0\7\11\1\0\7\11\1\0\7\11\1\0\7\11" + + "\1\0\7\11\1\0\7\11\1\0\7\11\1\0\40\12\57\0\1\11" + + "\u01d5\0\3\11\31\0\11\11\6\12\1\0\5\11\2\0\5\11\4\0" + + "\126\11\2\0\2\12\2\0\3\11\1\0\132\11\1\0\4\11\5\0" + + "\51\11\3\0\136\11\21\0\33\11\65\0\20\11\u0200\0\u19b6\11\112\0" + + "\u51cc\11\64\0\u048d\11\103\0\56\11\2\0\u010d\11\3\0\20\11\12\12" + + "\2\11\24\0\57\11\1\12\14\0\2\12\1\0\31\11\10\0\120\11" + + "\2\12\45\0\11\11\2\0\147\11\2\0\4\11\1\0\2\11\16\0" + + "\12\11\120\0\10\11\1\12\3\11\1\12\4\11\1\12\27\11\5\12" + + "\20\0\1\11\7\0\64\11\14\0\2\12\62\11\21\12\13\0\12\12" + + "\6\0\22\12\6\11\3\0\1\11\4\0\12\12\34\11\10\12\2\0" + + "\27\11\15\12\14\0\35\11\3\0\4\12\57\11\16\12\16\0\1\11" + + "\12\12\46\0\51\11\16\12\11\0\3\11\1\12\10\11\2\12\2\0" + + "\12\12\6\0\27\11\3\0\1\11\1\12\4\0\60\11\1\12\1\11" + + "\3\12\2\11\2\12\5\11\2\12\1\11\1\12\1\11\30\0\3\11" + + "\43\0\6\11\2\0\6\11\2\0\6\11\11\0\7\11\1\0\7\11" + + "\221\0\43\11\10\12\1\0\2\12\2\0\12\12\6\0\u2ba4\11\14\0" + + "\27\11\4\0\61\11\u2104\0\u012e\11\2\0\76\11\2\0\152\11\46\0" + + "\7\11\14\0\5\11\5\0\1\11\1\12\12\11\1\0\15\11\1\0" + + "\5\11\1\0\1\11\1\0\2\11\1\0\2\11\1\0\154\11\41\0" + + "\u016b\11\22\0\100\11\2\0\66\11\50\0\15\11\3\0\20\12\20\0" + + "\7\12\14\0\2\11\30\0\3\11\31\0\1\11\6\0\5\11\1\0" + + "\207\11\2\0\1\12\4\0\1\11\13\0\12\12\7\0\32\11\4\0" + + "\1\11\1\0\32\11\13\0\131\11\3\0\6\11\2\0\6\11\2\0" + + "\6\11\2\0\3\11\3\0\2\11\3\0\2\11\22\0\3\12\4\0"; /** * Translates characters to character classes */ @@ -145,16 +161,51 @@ public final class Flasm3Lexer { */ private static final int[] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\3\0\2\1\1\2\1\1\1\2\1\3\2\4\1\1" - + "\1\5\2\6\1\7\1\10\1\11\1\10\1\11\2\1" - + "\1\12\1\0\1\13\1\2\1\14\2\15\1\16\1\17" - + "\1\20\1\21\1\22\1\23\1\24\1\25\1\0\1\26" - + "\1\0\1\26\1\0\1\2\1\15\1\0\1\26\1\0" - + "\1\2\1\0\1\2\1\27\15\2\1\0\2\2\2\0" - + "\2\2\1\30\1\2\6\0\1\31\1\32"; + "\3\0\4\1\2\2\1\1\1\2\1\1\1\2\1\1" + + "\1\2\1\1\1\2\1\1\1\2\1\1\1\2\1\1" + + "\1\2\1\1\1\2\1\1\1\2\1\1\1\2\1\1" + + "\1\2\1\3\2\4\1\1\1\5\2\6\1\7\1\10" + + "\1\11\1\12\1\13\1\10\1\12\2\1\16\10\1\14" + + "\1\10\1\15\1\16\1\17\1\20\1\10\1\21\1\0" + + "\1\22\2\0\2\2\1\0\1\2\1\0\1\2\1\0" + + "\1\2\1\0\1\2\1\0\1\2\1\0\1\2\1\0" + + "\1\2\1\0\1\2\1\0\1\2\1\0\1\2\1\0" + + "\1\2\1\23\2\24\1\25\1\26\1\27\1\30\1\31" + + "\1\32\1\33\1\34\1\0\2\10\1\35\1\0\1\35" + + "\1\0\5\10\1\36\33\10\2\0\2\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\0\1\37\1\2\1\37" + + "\1\0\1\2\1\0\1\2\1\0\1\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\0\1\2\1\24\1\0" + + "\2\10\1\35\1\0\41\10\2\0\2\2\1\0\1\2" + + "\2\40\1\0\1\2\1\0\1\2\1\0\1\2\1\0" + + "\1\2\2\41\1\0\1\2\2\42\1\0\1\2\2\43" + + "\1\0\12\10\1\44\1\45\4\10\1\46\1\47\3\10" + + "\1\50\7\10\1\51\1\10\1\52\5\10\3\0\3\2" + + "\1\0\1\2\2\53\2\54\1\0\1\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\55\4\10\1\56\1\57" + + "\23\10\1\60\1\61\5\10\1\62\1\63\1\64\2\0" + + "\1\64\2\2\1\0\1\2\1\0\1\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\0\1\2\1\10\1\64" + + "\5\10\1\65\10\10\1\66\1\10\1\67\2\10\1\70" + + "\1\71\1\72\5\10\1\73\2\0\2\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\0\1\2\2\74\1\0" + + "\1\2\7\10\1\75\10\10\1\76\1\77\5\10\1\0" + + "\1\100\1\2\1\100\1\0\1\2\1\0\1\2\1\0" + + "\1\2\2\101\1\0\1\2\1\102\1\10\1\103\4\10" + + "\1\104\1\10\1\105\4\10\1\106\1\10\1\107\1\110" + + "\1\111\1\112\3\10\1\0\1\2\1\0\1\2\2\113" + + "\1\0\1\2\1\0\1\2\1\114\10\10\1\115\1\116" + + "\1\10\1\117\1\120\2\10\1\0\1\2\3\0\3\2" + + "\1\0\1\2\2\121\1\122\13\10\1\0\1\2\3\0" + + "\3\2\1\0\1\2\1\123\5\10\1\124\5\10\1\0" + + "\1\2\3\0\3\2\1\0\1\2\11\10\1\125\2\126" + + "\3\0\2\2\1\0\1\2\11\10\4\0\2\2\2\127" + + "\6\10\1\130\2\10\1\131\2\0\1\2\5\10\1\132" + + "\1\10\1\133\3\0\2\10\1\134\1\135\2\10\2\0" + + "\1\136\1\137\1\140\1\10\1\141\1\142\1\143"; private static int[] zzUnpackAction() { - int[] result = new int[81]; + int[] result = new int[615]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -178,20 +229,86 @@ public final class Flasm3Lexer { */ private static final int[] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\50\0\120\0\170\0\240\0\310\0\360\0\u0118" - + "\0\u0140\0\u0168\0\170\0\u0190\0\170\0\u01b8\0\170\0\u01e0" - + "\0\u0208\0\u0230\0\u0258\0\u0280\0\u02a8\0\u02d0\0\170\0\360" - + "\0\170\0\u02f8\0\170\0\u0320\0\u0348\0\170\0\170\0\170" - + "\0\170\0\170\0\170\0\170\0\170\0\u0370\0\u0398\0\u03c0" - + "\0\u0280\0\u02d0\0\u03e8\0\170\0\u0410\0\u0438\0\u0438\0\u0460" - + "\0\u0488\0\u04b0\0\170\0\u04d8\0\u0500\0\u0528\0\u0550\0\u0578" - + "\0\u05a0\0\u05c8\0\u05f0\0\u0618\0\u0640\0\u0668\0\u0690\0\u06b8" - + "\0\u06e0\0\u0708\0\u0730\0\u0758\0\u0780\0\u07a8\0\u07d0\0\170" - + "\0\u07f8\0\u0820\0\u0848\0\u0870\0\u0898\0\u08c0\0\u08e8\0\170" - + "\0\170"; + "\0\0\0\113\0\226\0\341\0\u012c\0\u0177\0\u01c2\0\u020d" + + "\0\u0258\0\u02a3\0\u02ee\0\u0339\0\u0384\0\u03cf\0\u041a\0\u0465" + + "\0\u04b0\0\u04fb\0\u0546\0\u0591\0\u05dc\0\u0627\0\u0672\0\u06bd" + + "\0\u0708\0\u0753\0\u079e\0\u07e9\0\u0834\0\u087f\0\u08ca\0\u0915" + + "\0\u0960\0\341\0\u09ab\0\341\0\u09f6\0\341\0\u0a41\0\u0a8c" + + "\0\341\0\u0ad7\0\341\0\u0b22\0\u0b6d\0\u0bb8\0\u0c03\0\u0c4e" + + "\0\u0c99\0\u0ce4\0\u0d2f\0\u0d7a\0\u0dc5\0\u0e10\0\u0e5b\0\u0ea6" + + "\0\u0ef1\0\u0f3c\0\u0f87\0\u0fd2\0\u101d\0\341\0\u1068\0\341" + + "\0\341\0\341\0\341\0\u10b3\0\341\0\u01c2\0\341\0\u10fe" + + "\0\u1149\0\u1194\0\u11df\0\u122a\0\u1275\0\u12c0\0\u130b\0\u1356" + + "\0\u13a1\0\u13ec\0\u1437\0\u1482\0\u14cd\0\u1518\0\u1563\0\u15ae" + + "\0\u15f9\0\u1644\0\u168f\0\u16da\0\u1725\0\u1770\0\u17bb\0\u1806" + + "\0\u1851\0\341\0\u189c\0\u18e7\0\341\0\341\0\341\0\341" + + "\0\341\0\341\0\341\0\341\0\u1932\0\u197d\0\u19c8\0\u1a13" + + "\0\u1a5e\0\u0b6d\0\u0c03\0\u1aa9\0\u1af4\0\u1b3f\0\u1b8a\0\u1bd5" + + "\0\u0b22\0\u1c20\0\u1c6b\0\u1cb6\0\u1d01\0\u1d4c\0\u1d97\0\u1de2" + + "\0\u1e2d\0\u1e78\0\u1ec3\0\u1f0e\0\u1f59\0\u1fa4\0\u1fef\0\u203a" + + "\0\u2085\0\u20d0\0\u211b\0\u2166\0\u21b1\0\u21fc\0\u2247\0\u2292" + + "\0\u22dd\0\u2328\0\u2373\0\u23be\0\u2409\0\u2454\0\u249f\0\u24ea" + + "\0\u2535\0\u2580\0\u25cb\0\u2616\0\u2661\0\u26ac\0\u26f7\0\u01c2" + + "\0\u2742\0\u0258\0\u278d\0\u27d8\0\u2823\0\u286e\0\u28b9\0\u2904" + + "\0\u294f\0\u299a\0\u29e5\0\u2a30\0\u2a7b\0\u2ac6\0\u2b11\0\u2b5c" + + "\0\341\0\u2ba7\0\u2bf2\0\u2c3d\0\u2c88\0\u2c88\0\u2cd3\0\u2d1e" + + "\0\u2d69\0\u2db4\0\u2dff\0\u2e4a\0\u2e95\0\u2ee0\0\u2f2b\0\u2f76" + + "\0\u2fc1\0\u300c\0\u3057\0\u30a2\0\u30ed\0\u3138\0\u3183\0\u31ce" + + "\0\u3219\0\u3264\0\u32af\0\u32fa\0\u3345\0\u3390\0\u33db\0\u3426" + + "\0\u3471\0\u34bc\0\u3507\0\u3552\0\u359d\0\u35e8\0\u3633\0\u367e" + + "\0\u36c9\0\u3714\0\u375f\0\u37aa\0\u37f5\0\u01c2\0\u0258\0\u3840" + + "\0\u388b\0\u38d6\0\u3921\0\u396c\0\u39b7\0\u3a02\0\u3a4d\0\u01c2" + + "\0\u0258\0\u3a98\0\u3ae3\0\u01c2\0\u0258\0\u3b2e\0\u3b79\0\u01c2" + + "\0\u0258\0\u3bc4\0\u3c0f\0\u3c5a\0\u3ca5\0\u3cf0\0\u3d3b\0\u3d86" + + "\0\u3dd1\0\u3e1c\0\u3e67\0\u3eb2\0\u0b22\0\u3efd\0\u3f48\0\u3f93" + + "\0\u3fde\0\u4029\0\u4074\0\u0b22\0\u40bf\0\u410a\0\u4155\0\u41a0" + + "\0\u41eb\0\u4236\0\u4281\0\u42cc\0\u4317\0\u4362\0\u43ad\0\u0b22" + + "\0\u43f8\0\u0b22\0\u4443\0\u448e\0\u44d9\0\u4524\0\u456f\0\u45ba" + + "\0\u4605\0\u4650\0\u469b\0\u46e6\0\u4731\0\u477c\0\u47c7\0\u4812" + + "\0\u485d\0\u01c2\0\u0258\0\u48a8\0\u48f3\0\u493e\0\u4989\0\u49d4" + + "\0\u4a1f\0\u4a6a\0\u4ab5\0\341\0\u4b00\0\u4b4b\0\u4b96\0\u4be1" + + "\0\u0b22\0\u0b22\0\u4c2c\0\u4c77\0\u4cc2\0\u4d0d\0\u4d58\0\u4da3" + + "\0\u4dee\0\u4e39\0\u4e84\0\u4ecf\0\u4f1a\0\u4f65\0\u4fb0\0\u4ffb" + + "\0\u5046\0\u5091\0\u50dc\0\u5127\0\u5172\0\u0b22\0\u0b22\0\u51bd" + + "\0\u5208\0\u5253\0\u529e\0\u52e9\0\u5334\0\u0b22\0\u01c2\0\u537f" + + "\0\u53ca\0\u0258\0\u5415\0\u5460\0\u54ab\0\u54f6\0\u5541\0\u558c" + + "\0\u55d7\0\u5622\0\u566d\0\u56b8\0\u5703\0\u574e\0\u5799\0\u57e4" + + "\0\u582f\0\u0b22\0\u587a\0\u58c5\0\u5910\0\u595b\0\u59a6\0\u0b22" + + "\0\u59f1\0\u5a3c\0\u5a87\0\u5ad2\0\u5b1d\0\u5b68\0\u5bb3\0\u5bfe" + + "\0\u0b22\0\u5c49\0\u0b22\0\u5c94\0\u5cdf\0\u0b22\0\u0b22\0\u0b22" + + "\0\u5d2a\0\u5d75\0\u5dc0\0\u5e0b\0\u5e56\0\u0b22\0\u5ea1\0\u5eec" + + "\0\u5f37\0\u5f82\0\u5fcd\0\u6018\0\u6063\0\u60ae\0\u60f9\0\u6144" + + "\0\u618f\0\u61da\0\u01c2\0\u0258\0\u6225\0\u6270\0\u62bb\0\u6306" + + "\0\u6351\0\u639c\0\u63e7\0\u6432\0\u647d\0\u0b22\0\u64c8\0\u6513" + + "\0\u655e\0\u65a9\0\u65f4\0\u663f\0\u668a\0\u66d5\0\u6720\0\u0b22" + + "\0\u676b\0\u67b6\0\u6801\0\u684c\0\u6897\0\u68e2\0\u01c2\0\u692d" + + "\0\u0258\0\u6978\0\u69c3\0\u6a0e\0\u6a59\0\u6aa4\0\u6aef\0\u01c2" + + "\0\u0258\0\u6b3a\0\u6b85\0\u0b22\0\u6bd0\0\u6c1b\0\u6c66\0\u6cb1" + + "\0\u6cfc\0\u6d47\0\u0b22\0\u6d92\0\u0b22\0\u6ddd\0\u6e28\0\u6e73" + + "\0\u6ebe\0\u0b22\0\u6f09\0\u0b22\0\u6f54\0\u0b22\0\u0b22\0\u6f9f" + + "\0\u6fea\0\u7035\0\u7080\0\u70cb\0\u7116\0\u7161\0\u01c2\0\u0258" + + "\0\u71ac\0\u71f7\0\u7242\0\u728d\0\u72d8\0\u7323\0\u736e\0\u73b9" + + "\0\u7404\0\u744f\0\u749a\0\u74e5\0\u7530\0\u0b22\0\u0b22\0\u757b" + + "\0\u0b22\0\u0b22\0\u75c6\0\u7611\0\u765c\0\u76a7\0\u76f2\0\u773d" + + "\0\u7788\0\u77d3\0\u781e\0\u7869\0\u78b4\0\u78ff\0\u01c2\0\u0258" + + "\0\u794a\0\u7995\0\u79e0\0\u7a2b\0\u7a76\0\u7ac1\0\u7b0c\0\u7b57" + + "\0\u7ba2\0\u7bed\0\u7c38\0\u7c83\0\u7cce\0\u7d19\0\u7d64\0\u7daf" + + "\0\u7dfa\0\u7e45\0\u7e90\0\u7edb\0\u7f26\0\u7f71\0\u0b22\0\u7fbc" + + "\0\u8007\0\u8052\0\u809d\0\u80e8\0\u0b22\0\u8133\0\u817e\0\u81c9" + + "\0\u8214\0\u825f\0\u82aa\0\u82f5\0\u8340\0\u838b\0\u83d6\0\u8421" + + "\0\u846c\0\u84b7\0\u8502\0\u854d\0\u8598\0\u85e3\0\u862e\0\u8679" + + "\0\u86c4\0\u870f\0\u875a\0\u87a5\0\u87f0\0\u0b22\0\u01c2\0\u0258" + + "\0\u883b\0\u8886\0\u88d1\0\u891c\0\u8967\0\u89b2\0\u89fd\0\u8a48" + + "\0\u8a93\0\u8ade\0\u8b29\0\u8b74\0\u8bbf\0\u8c0a\0\u8c55\0\u8ca0" + + "\0\u8ceb\0\u8d36\0\u8d81\0\u8dcc\0\u8e17\0\u8e62\0\u01c2\0\u0258" + + "\0\u8ead\0\u8ef8\0\u8f43\0\u8f8e\0\u8fd9\0\u9024\0\u0b22\0\u906f" + + "\0\u90ba\0\341\0\u9105\0\u9150\0\u919b\0\u91e6\0\u9231\0\u927c" + + "\0\u92c7\0\u9312\0\u0b22\0\u935d\0\u0b22\0\u93a8\0\u93f3\0\u943e" + + "\0\u9489\0\u94d4\0\u0b22\0\u0b22\0\u951f\0\u956a\0\u95b5\0\u9600" + + "\0\341\0\u0b22\0\u0b22\0\u964b\0\u0b22\0\341\0\u0b22"; private static int[] zzUnpackRowMap() { - int[] result = new int[81]; + int[] result = new int[615]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -212,118 +329,2090 @@ public final class Flasm3Lexer { */ private static final int[] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\4\4\1\5\1\6\3\4\1\7\1\4\1\6\1\7" - + "\4\4\1\7\1\10\3\4\12\6\1\5\2\6\1\4" - + "\2\6\2\4\1\11\1\12\1\13\22\11\1\14\15\11" - + "\1\15\4\11\1\4\1\16\1\17\1\20\1\4\1\21" - + "\1\4\1\22\1\4\1\23\1\4\2\23\1\4\1\24" - + "\1\25\1\26\2\23\1\4\1\22\1\4\12\23\1\4" - + "\2\23\1\27\2\23\1\4\1\22\54\0\1\5\33\0" - + "\1\5\14\0\1\6\1\0\1\6\1\0\2\30\2\6" - + "\1\31\1\6\2\0\1\30\1\6\1\0\1\6\1\0" - + "\12\6\1\0\2\6\1\0\2\6\1\0\1\6\5\0" - + "\1\30\1\0\1\30\1\0\4\30\1\31\1\30\2\0" - + "\2\30\1\0\1\30\1\0\12\30\1\0\2\30\1\0" - + "\2\30\1\0\1\30\5\0\1\6\1\0\1\6\1\0" - + "\2\30\2\6\1\31\1\6\2\0\1\30\1\6\1\0" - + "\1\6\1\0\1\32\11\6\1\0\2\6\1\0\2\6" - + "\1\0\1\6\1\11\2\0\22\11\1\0\15\11\1\0" - + "\4\11\2\0\1\13\45\0\2\33\1\0\13\33\1\34" - + "\5\33\1\35\1\36\3\33\1\37\2\33\1\40\2\33" - + "\1\41\3\33\1\42\1\43\1\44\1\45\1\34\2\0" - + "\1\17\45\0\1\20\2\0\45\20\5\0\1\23\1\46" - + "\1\23\1\0\4\23\1\0\1\23\2\0\2\23\1\0" - + "\1\23\1\0\12\23\1\0\2\23\1\0\2\23\1\0" - + "\1\23\7\0\1\22\6\0\1\22\1\0\1\47\2\50" - + "\1\0\1\22\22\0\1\22\5\0\1\23\1\0\1\23" - + "\1\0\4\23\1\0\1\23\2\0\2\23\1\0\1\23" - + "\1\0\12\23\1\0\2\23\1\0\2\23\1\0\1\23" - + "\7\0\1\51\6\0\1\51\1\0\1\47\2\50\1\0" - + "\1\51\22\0\1\51\7\0\1\22\6\0\1\51\1\0" - + "\1\52\3\0\1\22\22\0\1\22\7\0\1\47\6\0" - + "\1\47\5\0\1\47\22\0\1\47\5\0\1\6\1\0" - + "\1\6\1\0\2\30\2\6\1\31\1\6\2\0\1\30" - + "\1\6\1\0\1\6\1\0\1\6\1\53\10\6\1\0" - + "\2\6\1\0\2\6\1\0\1\6\16\0\1\35\5\0" - + "\1\35\22\0\1\35\16\0\1\54\5\0\1\54\22\0" - + "\1\54\7\0\1\55\6\0\1\55\5\0\1\55\22\0" - + "\1\55\7\0\1\47\6\0\1\47\2\0\2\50\1\0" - + "\1\47\22\0\1\47\7\0\1\56\6\0\1\56\1\57" - + "\3\0\1\57\1\56\22\0\1\56\5\0\1\6\1\0" - + "\1\6\1\0\2\30\2\6\1\31\1\6\2\0\1\30" - + "\1\60\1\0\1\6\1\0\12\6\1\0\2\6\1\0" - + "\2\6\1\0\1\6\7\0\1\55\1\61\5\0\1\55" - + "\5\0\1\55\22\0\1\55\7\0\1\56\6\0\1\56" - + "\5\0\1\56\22\0\1\56\5\0\1\6\1\0\1\6" - + "\1\0\2\30\2\6\1\31\1\6\2\0\1\30\1\6" - + "\1\0\1\6\1\0\2\6\1\62\7\6\1\0\2\6" - + "\1\0\2\6\1\0\1\6\43\0\1\63\11\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\3\6\1\64\6\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\4\6\1\65\5\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\5\6\1\66\4\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\6\6\1\67\3\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\70\1\0\1\6\1\0\3\6\1\71\3\6" - + "\1\72\2\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\6\6" - + "\1\73\3\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\10\6" - + "\1\74\1\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\3\6" - + "\1\75\6\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\12\6" - + "\1\0\1\76\1\6\1\0\2\6\1\0\1\6\5\0" - + "\1\6\1\0\1\6\1\0\2\30\2\6\1\31\1\6" - + "\2\0\1\30\1\6\1\0\1\6\1\0\11\6\1\77" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\10\6\1\100\1\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\12\6\1\101\2\6" - + "\1\0\2\6\1\0\1\6\5\0\1\6\1\0\1\6" - + "\1\0\2\30\2\6\1\31\1\6\2\0\1\30\1\6" - + "\1\0\1\6\1\0\12\6\1\0\1\6\1\102\1\0" - + "\2\6\1\0\1\6\5\0\1\6\1\0\1\6\1\0" - + "\2\30\2\6\1\31\1\6\2\0\1\30\1\6\1\0" - + "\1\6\1\0\11\6\1\103\1\0\2\6\1\0\2\6" - + "\1\0\1\6\7\0\1\104\6\0\1\105\5\0\1\104" - + "\22\0\1\104\5\0\1\6\1\0\1\6\1\0\2\30" - + "\2\6\1\31\1\6\2\0\1\30\1\106\1\0\1\6" - + "\1\0\12\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\3\6" - + "\1\107\6\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\7\0\1\104\5\0\1\110\1\104\5\0\1\104\22\0" - + "\1\104\15\0\1\110\37\0\1\6\1\0\1\6\1\0" - + "\2\30\2\6\1\31\1\6\2\0\1\30\1\6\1\0" - + "\1\6\1\0\3\6\1\111\6\6\1\0\2\6\1\0" - + "\2\6\1\0\1\6\5\0\1\6\1\0\1\6\1\0" - + "\2\30\2\6\1\31\1\6\2\0\1\30\1\6\1\0" - + "\1\6\1\0\12\6\1\112\2\6\1\0\2\6\1\0" - + "\1\6\5\0\1\6\1\0\1\6\1\0\2\30\2\6" - + "\1\31\1\6\2\0\1\30\1\6\1\0\1\6\1\0" - + "\12\6\1\113\2\6\1\0\2\6\1\0\1\6\7\0" - + "\1\114\6\0\1\115\5\0\1\114\22\0\1\114\7\0" - + "\1\116\6\0\1\117\5\0\1\116\22\0\1\116\7\0" - + "\1\114\5\0\1\120\1\114\5\0\1\114\22\0\1\114" - + "\15\0\1\120\41\0\1\116\5\0\1\121\1\116\5\0" - + "\1\116\22\0\1\116\15\0\1\121\32\0"; + "\4\4\1\5\1\6\3\4\1\7\1\4\1\10\1\11" + + "\1\7\4\4\1\12\1\13\3\4\1\7\1\11\1\14" + + "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24" + + "\1\25\1\26\1\27\1\7\1\11\1\7\1\11\1\30" + + "\1\31\1\5\1\7\1\11\1\7\1\11\1\7\1\11" + + "\1\32\1\33\1\34\1\35\1\7\1\11\1\36\1\37" + + "\1\7\1\11\1\7\1\11\1\4\1\7\1\11\4\4" + + "\1\7\1\11\4\4\1\40\1\41\1\42\23\40\1\43" + + "\47\40\1\44\14\40\1\4\1\45\1\46\1\47\1\4" + + "\1\50\1\51\1\52\1\53\1\54\1\4\1\50\2\54" + + "\1\4\1\55\1\56\1\57\2\60\1\4\1\52\1\4" + + "\2\54\2\61\2\62\2\63\2\64\2\65\2\66\2\67" + + "\2\54\2\70\1\4\2\71\2\72\2\54\2\73\2\54" + + "\2\74\4\54\2\75\1\76\2\77\1\100\1\101\1\102" + + "\1\103\2\104\1\105\1\52\1\4\1\52\117\0\1\5" + + "\46\0\1\5\44\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\110\1\0\1\106\1\0\20\106" + + "\2\111\2\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\110\1\112" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\111\1\113\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\2\114\22\106\1\0\22\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\114\1\115\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\12\106\2\116\10\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\116\1\117\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\20\106\2\120\2\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\106\1\0\1\11\1\0\2\106\3\11" + + "\1\107\1\11\2\0\1\106\1\11\1\0\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\120\1\121\1\106\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\4\0\1\106\1\11\1\0\1\11\1\0" + + "\1\11\5\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\22\106\2\122" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\122\1\123\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\14\106" + + "\2\124\6\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\124" + + "\1\125\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\4\106\2\126\16\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\126\1\127\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\20\106\2\130\2\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\130" + + "\1\131\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\132\1\0\1\106\1\0\24\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\132\1\133\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\24\106\1\0\10\106" + + "\2\134\10\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\134\1\135" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\12\106" + + "\2\136\10\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\136\1\137\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\12\106\2\140\10\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\140" + + "\1\141\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\1\40\2\0" + + "\23\40\1\0\47\40\1\0\14\40\2\0\1\42\110\0" + + "\2\142\1\0\14\142\1\143\5\142\1\144\1\145\6\142" + + "\2\146\4\142\2\147\4\142\2\150\7\142\2\151\4\142" + + "\2\152\4\142\1\153\12\142\1\154\1\143\2\0\1\46" + + "\110\0\1\47\2\0\110\47\5\0\1\54\1\155\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\156\1\0\1\54" + + "\1\0\24\54\1\0\12\54\2\157\6\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\7\0\1\52" + + "\7\0\1\52\1\0\1\160\2\161\1\0\1\52\62\0" + + "\1\52\1\0\1\52\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\24\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\7\0\1\162\7\0\1\162\1\0" + + "\1\160\2\161\1\0\1\162\62\0\1\162\1\0\1\162" + + "\7\0\1\52\7\0\1\162\1\0\1\163\3\0\1\52" + + "\62\0\1\52\1\0\1\52\7\0\1\160\7\0\1\160" + + "\5\0\1\160\62\0\1\160\1\0\1\160\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\2\164\22\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\12\54\2\165\10\54\1\0" + + "\10\54\2\166\10\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\167\2\170\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\12\54\2\171\4\54\2\172\2\173\1\0" + + "\4\54\2\174\14\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\14\54\2\175\6\54\1\0\2\54\2\176\16\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\177\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\200\1\0\1\54\1\0\20\54\2\201\2\54\1\0" + + "\12\54\2\202\6\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\203\1\0\1\54\1\0" + + "\6\54\2\204\14\54\1\0\10\54\2\205\10\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\6\54\2\206\14\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\207\1\0\1\54\1\0\10\54\2\210" + + "\2\211\10\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\212\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\10\54\2\213\6\54\2\214\2\215\1\0\12\54" + + "\2\216\6\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\6\54" + + "\2\217\2\220\2\54\2\221\6\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\20\54\2\222\2\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\14\54\2\223" + + "\6\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\224\2\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\6\106\2\225\14\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\2\226\22\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\225\1\227\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\226" + + "\1\230\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\2\106\2\231\20\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\231\1\232\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\0\2\233\20\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\11\1\0" + + "\2\106\3\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\233" + + "\1\234\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\22\106\2\235\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\235\1\236\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\20\106\2\237\2\106\1\0\4\106\2\240\14\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\237" + + "\1\241\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\240\1\242\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\10\106\2\243\12\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\243\1\244\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\6\106" + + "\2\245\14\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\245\1\246\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\247\1\0\1\106" + + "\1\0\2\106\1\247\2\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\24\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\247" + + "\1\0\1\11\1\0\2\106\1\250\2\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\6\106\2\251\14\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\106\1\0\1\11\1\0\2\106\3\11" + + "\1\107\1\11\2\0\1\106\1\11\1\0\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\251\1\252" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\4\0\1\106\1\11\1\0\1\11\1\0" + + "\1\11\5\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\20\106\2\253" + + "\2\106\1\0\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\11\1\0" + + "\2\106\3\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\253\1\254\1\106\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\2\106\2\255\20\106\1\0\22\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\255\1\256" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\24\106\1\0\2\257\20\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\257\1\260\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\17\0\1\144" + + "\5\0\1\144\64\0\1\144\17\0\1\261\5\0\1\261" + + "\64\0\1\261\7\0\1\262\7\0\1\262\5\0\1\262" + + "\62\0\1\262\1\0\1\262\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\6\54\2\263\14\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\10\54\2\264\10\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\7\0\1\160\7\0\1\160\2\0\2\161\1\0\1\160" + + "\62\0\1\160\1\0\1\160\7\0\1\265\7\0\1\265" + + "\1\266\3\0\1\266\1\265\62\0\1\265\1\0\1\265" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\4\54\2\267\16\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\270\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\271\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\2\54\2\272\20\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\10\54\2\273\2\274" + + "\10\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\22\54\2\275\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\12\54\2\276\6\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\4\54\2\277\16\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\6\54\2\300\14\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\301\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\302\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\303\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\304\1\0\1\54" + + "\1\0\2\54\1\304\2\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\10\54\2\305\10\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\6\54\2\306\14\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\20\54" + + "\2\307\2\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\12\54\2\310\10\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\311" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\2\54\2\312\20\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\16\54\2\313\4\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\12\54\2\314\6\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\6\54\2\315\14\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\316\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\10\54" + + "\2\317\10\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\12\54" + + "\2\320\10\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\14\54\2\321\6\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\6\54\2\322\12\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\14\54\2\323\6\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\2\324\20\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\325\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\20\54\2\326\2\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\10\54\2\327" + + "\10\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\24\106\1\0" + + "\20\106\2\330\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\16\106" + + "\2\331\4\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\330\1\332\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\331\1\333\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\334\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\334\1\335" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\336\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\336\1\337" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\20\106\2\340\2\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\340\1\341\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\10\106\2\342\12\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\342" + + "\1\343\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\6\106\2\344\14\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\344" + + "\1\345\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\10\106" + + "\2\346\12\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\346\1\347\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\350\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\350\1\351" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\12\106\2\352\6\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\352\1\353\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\24\106\1\0\2\106\2\354\16\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\354\1\355" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\20\106\2\356\2\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\356\1\357\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\0\4\106\2\360\14\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\360\1\361\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\7\0\1\262\1\362\6\0" + + "\1\262\5\0\1\262\62\0\1\262\1\0\1\262\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\20\54\2\363\2\54\1\0" + + "\20\54\2\364\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\6\54" + + "\2\365\14\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\7\0\1\265\7\0\1\265" + + "\5\0\1\265\62\0\1\265\1\0\1\265\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\10\54\2\366\10\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\16\54\2\367\4\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\16\54" + + "\2\370\4\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\16\54\2\371\2\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\372\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\6\54\2\373\14\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\2\54" + + "\2\374\16\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\375\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\376\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\377\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\12\54" + + "\2\u0100\10\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\22\54\2\u0101\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\2\u0102\20\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u0103" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\10\54\2\u0104\10\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\4\54\1\u0105\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\6\54\2\u0106" + + "\14\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\6\54\2\u0107\14\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u0108\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\14\54\2\u0109\6\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u010a" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\4\54\2\u010b\16\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\14\54\2\u010c\4\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\6\54\2\u010d\14\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u010e" + + "\2\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\u010f\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\u0110\1\0" + + "\1\54\1\0\2\54\1\u0110\2\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\2\54\2\u0111\20\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\u0112\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\6\54\2\u0113" + + "\14\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\u0114\1\0\1\54\1\0" + + "\24\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\4\54\1\u0115\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\u0116\1\0\1\54" + + "\1\0\2\54\1\u0116\2\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\12\54\2\u0117\6\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\12\106\2\u0118\10\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\2\106" + + "\2\u0119\2\106\2\u011a\14\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0118" + + "\1\u011b\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\u0119" + + "\1\u011c\1\106\1\11\1\u011a\1\u011d\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\4\106\2\u011e\16\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\u011e\1\u011f\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\u0120\1\0\1\106\1\0\2\106\1\u0120\2\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\u0120\1\0\1\11\1\0\2\106" + + "\1\u0121\2\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\6\106\2\u0122\14\106\1\0\22\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u0122\1\u0123\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\16\106\2\u0124\4\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\u0124\1\u0125\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\12\106\2\u0126\10\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\106\1\0\1\11\1\0\2\106\3\11" + + "\1\107\1\11\2\0\1\106\1\11\1\0\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u0126\1\u0127\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\4\0\1\106\1\11\1\0\1\11\1\0" + + "\1\11\5\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\22\106\2\u0128" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u0128\1\u0129\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\0\10\106\2\u012a\10\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u012a\1\u012b\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\76\0\1\u012c\21\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\2\u012d\20\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\12\54\2\u012e\10\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u012f" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\10\54\2\u0130\12\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u0131\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\16\54\2\u0132\4\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u0133" + + "\2\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\u0134\2\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u0135\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u0136\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\14\54\2\u0137\6\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\2\54\2\u0138" + + "\16\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\22\54\2\u0139" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\22\54" + + "\2\u013a\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\4\54\1\u013b\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\16\54\2\u013c\4\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\2\u013d\20\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u013e\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\10\54\2\u013f\12\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u0140" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\u0141\2\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\u0142\1\0" + + "\1\54\1\0\2\54\1\u0142\2\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\10\54\2\u0143\12\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\10\54\2\u0144\10\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\u0145\1\0\1\54\1\0" + + "\24\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\24\54\1\0\10\54\2\u0146\10\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u0147\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u0148\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u0149\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\6\54\2\u014a" + + "\12\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\4\54\2\u014b" + + "\4\54\2\u014c\10\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u014d\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u014e\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\24\106\1\0\2\u014f\20\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\12\106\2\u0150\10\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\20\106\2\u0151\2\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\u014f\1\u0152" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u0150\1\u0153\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0151\1\u0154\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\6\106" + + "\2\u0155\14\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0155\1\u0156\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\14\106\2\u0157\6\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0157\1\u0158\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\2\106\2\u0159\20\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\u0159\1\u015a\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\14\106\2\u015b\6\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\u015b\1\u015c\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\14\106" + + "\2\u015d\6\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u015d" + + "\1\u015e\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\2\106\2\u015f\20\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\u015f" + + "\1\u0160\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\20\54\2\u0161\2\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\2\u0162" + + "\20\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\14\54\2\u0163" + + "\6\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\2\54\2\u0164\20\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\2\54\2\u0165\16\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\6\54\2\u0166\14\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\2\54\2\u0167" + + "\20\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\6\54\2\u0168\14\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\20\54\2\u0169\2\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u016a\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u016b\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\10\54\2\u016c\12\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u016d" + + "\2\u016e\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\4\54\2\u016f\16\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\2\u0170\22\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\22\54\2\u0171\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\2\54\2\u0172\20\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\2\u0173\20\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\u0174\1\0\1\54\1\0\2\54" + + "\1\u0174\2\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u0175\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\2\u0176\20\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u0177\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\22\54\2\u0178\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\10\54\2\u0179\12\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\2\54\2\u017a\16\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\10\54\2\u017b\12\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\20\54\2\u017c\2\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\4\54\2\u017d\16\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\20\54" + + "\2\u017e\2\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\4\106\2\u017f\16\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\2\106\2\u0180\20\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\u017f\1\u0181\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\u0180\1\u0182\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\10\106\2\u0183\12\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0183\1\u0184\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\20\106" + + "\2\u0185\2\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u0185\1\u0186\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\12\106\2\u0187\10\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0187" + + "\1\u0188\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\20\106\2\u0189\2\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0189" + + "\1\u018a\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\16\106\2\u018b\4\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u018b" + + "\1\u018c\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\12\106" + + "\2\u018d\10\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\u018d\1\u018e\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\6\54\2\u018f\14\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\20\54\2\u0190\2\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\10\54\2\u0191\12\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\u0192\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\u0193\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\6\54" + + "\2\u0194\14\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\u0195\1\0\1\54" + + "\1\0\2\54\1\u0195\2\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\22\54\2\u0196\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\4\54\1\u0197\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\2\u0198" + + "\20\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\2\54\2\u0199" + + "\16\54\2\u019a\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u019b\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u019c\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\u019d\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\4\54\2\u019e\16\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\u019f\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\10\54\2\u01a0\10\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\12\54\2\u01a1\10\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u01a2" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\u01a3\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\22\54\2\u01a4\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\6\54\2\u01a5" + + "\14\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\u01a6\1\0\1\106\1\0" + + "\24\106\1\0\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\24\106\1\0\16\106\2\u01a7\2\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\u01a6" + + "\1\u01a8\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u01a7" + + "\1\u01a9\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\12\106\2\u01aa\10\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u01aa\1\u01ab\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\u01ac\1\0\1\106\1\0\2\106\1\u01ac\2\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\24\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\u01ac\1\0\1\11\1\0\2\106\1\u01ad" + + "\2\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\4\106" + + "\2\u01ae\16\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\u01ae" + + "\1\u01af\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\10\106\2\u01b0\10\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u01b0\1\u01b1\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\24\106\1\0\12\106\2\u01b2\6\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\u01b2\1\u01b3" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u01b4\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\u01b5\1\0\1\54\1\0\2\54" + + "\1\u01b5\2\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\6\54\2\u01b6\14\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\10\54\2\u01b7\2\54\2\u01b8\6\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\u01b9\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u01ba\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u01bb\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\22\54\2\u01bc\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u01bd\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u01be\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\2\54\2\u01bf" + + "\16\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\16\54\2\u01c0" + + "\4\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\2\54\2\u01c1\20\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\16\54\2\u01c2\4\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\22\54\2\u01c3\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u01c4\2\54" + + "\1\0\10\54\2\u01c5\10\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\14\54\2\u01c6\6\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\22\54\2\u01c7\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u01c8\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\20\54\2\u01c9\2\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u01ca" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\24\106\1\0\2\u01cb\20\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\u01cb\1\u01cc\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\14\106\2\u01cd\6\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u01cd\1\u01ce\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\u01cf" + + "\1\0\1\106\1\0\24\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\u01cf\1\u01d0\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\u01d1" + + "\1\0\1\106\1\0\24\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\u01d1\1\u01d2\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\14\106\2\u01d3\6\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u01d3\1\u01d4\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u01d5\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\14\54\2\u01d6\6\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\u01d7\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u01d8\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\20\54\2\u01d9\2\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\2\u01da" + + "\20\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\u01db\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u01dc" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\24\54\1\0\12\54\2\u01dd\6\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u01de\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u01df\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\12\54\2\u01e0\10\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u01e1" + + "\2\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\24\54\1\0\2\u01e2\20\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\u01e3\1\0\1\54" + + "\1\0\2\54\1\u01e3\2\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\12\54\2\u01e4\10\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\u01e5\1\0\1\106\1\0\24\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\u01e5\1\u01e6\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\u01e7\1\0\1\106\1\0\6\106\2\u01e8\6\106" + + "\2\u01e9\4\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\u01e7\1\u01ea" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u01e8\1\u01eb\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u01e9\1\u01ec\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\2\u01ed\20\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\u01ed\1\u01ee\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\6\106\2\u01ef\14\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\u01ef\1\u01f0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\10\54\2\u01f1" + + "\10\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u01f2" + + "\2\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\6\54\2\u01f3\14\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\u01f4\1\0" + + "\1\54\1\0\2\54\1\u01f4\2\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\u01f5\1\0\1\54\1\0\2\54\1\u01f5\2\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\14\54\2\u01f6" + + "\6\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\u01f7\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\u01f8\1\0\1\54\1\0\1\54\5\0\1\u01f9\1\0" + + "\1\54\1\0\2\54\1\u01f9\2\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\6\54\2\u01fa\14\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\4\54\1\u01fb" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\u01fc\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\4\106\2\u01fd\16\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\u01fd\1\u01fe\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\14\106\2\u01ff\6\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\20\106\2\u0200\2\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\6\106" + + "\2\u0201\14\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u01ff" + + "\1\u0202\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u0200\1\u0203\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0201\1\u0204\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\u0205\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\u0205\1\u0206" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u0207\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\u0208" + + "\1\0\1\54\1\0\2\54\1\u0208\2\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u0209\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u020a\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u020b\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u020c\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\6\54" + + "\2\u020d\14\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u020e\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u020f" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u0210" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\u0211\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u0212\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\6\106" + + "\2\u0213\14\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0213\1\u0214\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\2\u0215\20\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\22\106\2\u0216\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\20\106\2\u0217\2\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\u0215\1\u0218\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0216\1\u0219\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0217" + + "\1\u021a\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\4\106\2\u021b\16\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\u021b\1\u021c\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\u021d\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\22\54" + + "\2\u021e\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\u021f\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\16\54\2\u0220\4\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\u0221\1\0\1\54\1\0\2\54\1\u0221\2\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\6\54\2\u0222" + + "\14\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\14\54\2\u0223\6\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\2\54\2\u0224\20\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\20\54\2\u0225\2\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\10\54\2\u0226\10\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\24\106\1\0\20\106\2\u0227\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u0227\1\u0228\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\u0229\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\2\106\2\u022a\16\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\22\106\2\u022b\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u0229\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\u022a\1\u022c\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u022b\1\u022d\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\6\106\2\u022e\14\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\106\1\0\1\11\1\0\2\106\3\11" + + "\1\107\1\11\2\0\1\106\1\11\1\0\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\u022e\1\u022f" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\4\0\1\106\1\11\1\0\1\11\1\0" + + "\1\11\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\16\54\2\u0230" + + "\4\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\14\54\2\u0231\6\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\4\54\2\u0232\16\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\4\54\2\u0233\16\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\u0234\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u0235" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\6\54\2\u0236\14\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u0237\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\u0238\1\0\1\54\1\0\2\54\1\u0238\2\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\7\0\1\u0239\7\0\1\u023a\5\0\1\u0239\62\0" + + "\1\u0239\1\0\1\u0239\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\u023b\1\0\1\106\1\0" + + "\24\106\1\0\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\6\106\2\u023c\14\106\1\0\22\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\u023b" + + "\1\u023d\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u023c\1\u023e\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\24\106\1\0\20\106\2\u023f\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u023f\1\u0240\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\4\54\2\u0241\16\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u0242\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\20\54" + + "\2\u0243\2\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u0244\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\16\54\2\u0245\4\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\12\54\2\u0246\10\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\16\54" + + "\2\u0247\4\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u0248\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u0249\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\7\0\1\u0239\6\0\1\u024a" + + "\1\u0239\5\0\1\u0239\62\0\1\u0239\1\0\1\u0239\16\0" + + "\1\u024a\101\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\6\106\2\u024b" + + "\14\106\1\0\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\24\106\1\u024c\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\11\1\0" + + "\2\106\3\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u024b\1\u024d\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\106\1\0\1\11\1\0" + + "\2\106\3\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\u024c\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\u024e\2\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\10\54\2\u024f\10\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\2\54\2\u0250\20\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\2\54\2\u0251" + + "\20\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\4\54\2\u0252\16\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\14\54\2\u0253\6\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\2\u0254\20\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\16\54\2\u0255\4\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\u0256\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\7\0\1\u0257\7\0\1\u0258\5\0\1\u0257" + + "\62\0\1\u0257\1\0\1\u0257\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0256" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\2\54\2\u0259\20\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\u025a\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u025b\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u025c\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u025d\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\u025e\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\7\0\1\u025f\7\0\1\u0260" + + "\5\0\1\u025f\62\0\1\u025f\1\0\1\u025f\7\0\1\u0257" + + "\6\0\1\u0261\1\u0257\5\0\1\u0257\62\0\1\u0257\1\0" + + "\1\u0257\16\0\1\u0261\101\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\u0262\1\0\1\54\1\0" + + "\24\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\u0263\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\2\54\2\u0264\20\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\16\54\2\u0265\4\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\7\0\1\u025f\6\0\1\u0266\1\u025f\5\0\1\u025f" + + "\62\0\1\u025f\1\0\1\u025f\16\0\1\u0266\101\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u0267" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54"; private static int[] zzUnpackTrans() { - int[] result = new int[2320]; + int[] result = new int[38550]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -360,14 +2449,33 @@ public final class Flasm3Lexer { */ private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\3\0\1\11\6\1\1\11\1\1\1\11\1\1\1\11" - + "\7\1\1\11\1\0\1\11\1\1\1\11\2\1\10\11" - + "\1\0\1\1\1\0\1\1\1\0\1\1\1\11\1\0" - + "\1\1\1\0\1\1\1\0\1\1\1\11\15\1\1\0" - + "\2\1\2\0\2\1\1\11\1\1\6\0\2\11"; + "\3\0\1\11\35\1\1\11\1\1\1\11\1\1\1\11" + + "\2\1\1\11\1\1\1\11\22\1\1\11\1\1\4\11" + + "\1\1\1\11\1\0\1\11\2\0\2\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\11\2\1\10\11\1\0" + + "\3\1\1\0\1\1\1\0\41\1\2\0\2\1\1\0" + + "\1\1\1\0\1\1\1\0\1\1\1\0\3\1\1\0" + + "\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0" + + "\1\1\1\0\1\1\1\0\1\1\1\11\1\0\3\1" + + "\1\0\41\1\2\0\2\1\1\0\3\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\0\3\1\1\0\3\1" + + "\1\0\3\1\1\0\45\1\3\0\3\1\1\0\5\1" + + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1" + + "\1\11\43\1\2\0\3\1\1\0\1\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\37\1" + + "\2\0\2\1\1\0\1\1\1\0\1\1\1\0\1\1" + + "\1\0\3\1\1\0\30\1\1\0\3\1\1\0\1\1" + + "\1\0\1\1\1\0\3\1\1\0\30\1\1\0\1\1" + + "\1\0\3\1\1\0\1\1\1\0\21\1\1\0\1\1" + + "\3\0\3\1\1\0\17\1\1\0\1\1\3\0\3\1" + + "\1\0\15\1\1\0\1\1\3\0\3\1\1\0\15\1" + + "\3\0\2\1\1\0\12\1\4\0\15\1\1\11\2\0" + + "\11\1\3\0\6\1\2\0\1\11\4\1\1\11\1\1"; private static int[] zzUnpackAttribute() { - int[] result = new int[81]; + int[] result = new int[615]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -465,6 +2573,23 @@ public final class Flasm3Lexer { public int yyline() { return yyline + 1; } + private Stack pushedBack = new Stack<>(); + + public void pushback(ParsedSymbol symb) { + pushedBack.push(symb); + last = null; + } + ParsedSymbol last; + + public ParsedSymbol lex() throws java.io.IOException, ParseException { + ParsedSymbol ret = null; + if (!pushedBack.isEmpty()) { + ret = last = pushedBack.pop(); + } else { + ret = last = yylex(); + } + return ret; + } /** * Creates a new scanner There is also a java.io.InputStream version of this @@ -496,7 +2621,7 @@ public final class Flasm3Lexer { char[] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 1738) { + while (i < 2260) { int count = packed.charAt(i++); char value = packed.charAt(i++); do { @@ -575,9 +2700,9 @@ public final class Flasm3Lexer { * Resets the scanner to read from a new input stream. Does not close the * old reader. * - * All internal variables are reset, the old input stream cannot be - * reused (internal buffer is discarded and lost). Lexical state is set to - * ZZ_INITIAL. + * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). Lexical + * state is set to ZZ_INITIAL. * * @param reader the new input stream */ @@ -812,43 +2937,184 @@ public final class Flasm3Lexer { zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 45: { + isMultiname = true; + String s = yytext(); + multinameId = Long.parseLong(s.substring(2, s.length() - 2)); + yybegin(STRING); + string.setLength(0); + } + case 100: + break; + case 37: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPE, yytext()); + } + case 101: + break; + case 57: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DOUBLE, yytext()); + } + case 102: + break; + case 32: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CODE, yytext()); + } + case 103: + break; + case 52: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METHOD, yytext()); + } + case 104: + break; + case 47: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CLASS, yytext()); + } + case 105: + break; + case 79: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMELA, yytext()); + } + case 106: + break; + case 74: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UINTEGER, yytext()); + } + case 107: + break; + case 59: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAMEA, yytext()); + } + case 108: + break; case 8: { return new ParsedSymbol(ParsedSymbol.TYPE_IDENTIFIER, yytext()); } - case 27: + case 109: break; - case 21: { - string.append('\''); + case 58: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_GETTER, yytext()); } - case 28: + case 110: break; - case 9: { - return new ParsedSymbol(ParsedSymbol.TYPE_INTEGER, new Long(Long.parseLong((yytext())))); + case 53: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TARGET, yytext()); } - case 29: + case 111: break; - case 26: { - String s = yytext(); - return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_TARGET, Integer.parseInt(s.substring(16, s.length() - 1))); + case 69: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OVERRIDE, yytext()); } - case 30: + case 112: break; - case 3: { - string.append(yytext()); + case 92: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE, yytext()); } - case 31: + case 113: break; - case 13: { - char val = (char) Integer.parseInt(yytext().substring(1), 8); - string.append(val); + case 61: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INTEGER, yytext()); } - case 32: + case 114: break; - case 25: { + case 22: { + string.append('\t'); + } + case 115: + break; + case 94: { String s = yytext(); return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_START, Integer.parseInt(s.substring(15, s.length() - 1))); } - case 33: + case 116: + break; + case 54: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SETTER, yytext()); + } + case 117: + break; + case 15: { + return new ParsedSymbol(ParsedSymbol.TYPE_LOWERTHAN, yytext()); + } + case 118: + break; + case 19: { + throw new ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); + } + case 119: + break; + case 42: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UTF8, yytext()); + } + case 120: + break; + case 95: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE, yytext()); + } + case 121: + break; + case 89: { + String s = yytext(); + return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_END, Integer.parseInt(s.substring(13, s.length() - 1))); + } + case 122: + break; + case 35: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_BODY, yytext()); + } + case 123: + break; + case 34: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FLAG, yytext()); + } + case 124: + break; + case 83: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMELA, yytext()); + } + case 125: + break; + case 78: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAMESPACE, yytext()); + } + case 126: + break; + case 93: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE, yytext()); + } + case 127: + break; + case 9: { + return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_OPEN, yytext()); + } + case 128: + break; + case 91: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_PARAM_NAMES, yytext()); + } + case 129: + break; + case 23: { + string.append('\n'); + } + case 130: + break; + case 64: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSTACK, yytext()); + } + case 131: + break; + case 36: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRUE, yytext()); + } + case 132: break; case 5: { yybegin(PARAMETERS); @@ -859,105 +3125,353 @@ public final class Flasm3Lexer { return new ParsedSymbol(ParsedSymbol.TYPE_STRING, string.toString()); } } - case 34: + case 133: break; - case 6: { - yybegin(YYINITIAL); + case 44: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRAIT, yytext()); } - case 35: + case 134: + break; + case 97: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS, yytext()); + } + case 135: + break; + case 80: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UNDEFINED, yytext()); + } + case 136: + break; + case 67: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICIT, yytext()); + } + case 137: + break; + case 4: { + throw new ParseException("Unterminated string at end of line", yyline + 1); + } + case 138: + break; + case 10: { + return new ParsedSymbol(ParsedSymbol.TYPE_INTEGER, new Long(Long.parseLong((yytext())))); + } + case 139: + break; + case 31: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRY, yytext()); + } + case 140: + break; + case 60: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RETURNS, yytext()); + } + case 141: + break; + case 88: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ARGUMENTS, yytext()); + } + case 142: + break; + case 43: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAM, yytext()); + } + case 143: + break; + case 98: { + String s = yytext(); + return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_TARGET, Integer.parseInt(s.substring(16, s.length() - 1))); + } + case 144: + break; + case 56: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DISPID, yytext()); + } + case 145: + break; + case 66: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METADATA, yytext()); + } + case 146: + break; + case 18: { + String s = yytext(); + return new ParsedSymbol(ParsedSymbol.TYPE_LABEL, s.substring(0, s.length() - 1)); + } + case 147: + break; + case 76: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAME, yytext()); + } + case 148: + break; + case 72: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEL, yytext()); + } + case 149: + break; + case 85: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_OPTIONAL, yytext()); + } + case 150: + break; + case 29: { + return new ParsedSymbol(ParsedSymbol.TYPE_FLOAT, new Double(Double.parseDouble((yytext())))); + } + case 151: + break; + case 30: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TO, yytext()); + } + case 152: + break; + case 46: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CONST, yytext()); + } + case 153: + break; + case 24: { + string.append('\r'); + } + case 154: + break; + case 48: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FINAL, yytext()); + } + case 155: + break; + case 63: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DECIMAL, yytext()); + } + case 156: + break; + case 26: { + string.append('\b'); + } + case 157: + break; + case 86: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSCOPEDEPTH, yytext()); + } + case 158: + break; + case 49: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FALSE, yytext()); + } + case 159: + break; + case 73: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FUNCTION, yytext()); + } + case 160: + break; + case 27: { + string.append('\"'); + } + case 161: + break; + case 70: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SET_DXNS, yytext()); + } + case 162: + break; + case 39: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NULL, yytext()); + } + case 163: + break; + case 87: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INITSCOPEDEPTH, yytext()); + } + case 164: + break; + case 41: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FROM, yytext()); + } + case 165: + break; + case 14: { + return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_CLOSE, yytext()); + } + case 166: break; case 2: { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_INSTRUCTION_NAME, yytext()); } - case 36: + case 167: break; - case 17: { - string.append('\r'); + case 28: { + string.append('\''); } - case 37: - break; - case 24: { - String s = yytext(); - return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_END, Integer.parseInt(s.substring(13, s.length() - 1))); - } - case 38: - break; - case 7: { - return new ParsedSymbol(ParsedSymbol.TYPE_COMMENT, yytext().substring(1)); - } - case 39: - break; - case 19: { - string.append('\b'); - } - case 40: + case 168: break; case 11: { - String s = yytext(); - return new ParsedSymbol(ParsedSymbol.TYPE_LABEL, s.substring(0, s.length() - 1)); + return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_CLOSE, yytext()); } - case 41: + case 169: break; - case 4: { - throw new ParseException("Unterminated string at end of line", yyline + 1); + case 21: { + string.append('\\'); } - case 42: + case 170: break; - case 10: { + case 6: { + yybegin(YYINITIAL); + } + case 171: + break; + case 17: { + return new ParsedSymbol(ParsedSymbol.TYPE_COMMA, yytext()); + } + case 172: + break; + case 96: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS, yytext()); + } + case 173: + break; + case 16: { + return new ParsedSymbol(ParsedSymbol.TYPE_GREATERTHAN, yytext()); + } + case 174: + break; + case 77: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_REST, yytext()); + } + case 175: + break; + case 12: { isMultiname = false; yybegin(STRING); string.setLength(0); } - case 43: + case 176: break; - case 15: { - string.append('\t'); + case 68: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPENAME, yytext()); } - case 44: + case 177: break; - case 22: { - return new ParsedSymbol(ParsedSymbol.TYPE_FLOAT, new Double(Double.parseDouble((yytext())))); + case 40: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOT, yytext()); } - case 45: + case 178: break; - case 14: { - string.append('\\'); + case 99: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE, yytext()); } - case 46: + case 179: break; - case 12: { - throw new ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); + case 75: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAMNAME, yytext()); } - case 47: + case 180: break; - case 23: { - isMultiname = true; - String s = yytext(); - multinameId = Long.parseLong(s.substring(2, s.length() - 2)); - yybegin(STRING); - string.setLength(0); - } - case 48: - break; - case 16: { - string.append('\n'); - } - case 49: - break; - case 20: { + case 25: { string.append('\f'); } - case 50: + case 181: break; - case 18: { - string.append('\"'); + case 13: { + return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_OPEN, yytext()); } - case 51: + case 182: + break; + case 33: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME, yytext()); + } + case 183: + break; + case 90: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ACTIVATION, yytext()); + } + case 184: + break; + case 51: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_VALUE, yytext()); + } + case 185: + break; + case 55: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOTID, yytext()); + } + case 186: + break; + case 84: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_IGNORE_REST, yytext()); + } + case 187: + break; + case 50: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAME, yytext()); + } + case 188: + break; + case 3: { + string.append(yytext()); + } + case 189: + break; + case 7: { + return new ParsedSymbol(ParsedSymbol.TYPE_COMMENT, yytext().substring(1)); + } + case 190: + break; + case 81: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_LOCALCOUNT, yytext()); + } + case 191: + break; + case 71: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEA, yytext()); + } + case 192: + break; + case 65: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OPTIONAL, yytext()); + } + case 193: + break; + case 20: { + char val = (char) Integer.parseInt(yytext().substring(1), 8); + string.append(val); + } + case 194: + break; + case 38: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME, yytext()); + } + case 195: + break; + case 82: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMEL, yytext()); + } + case 196: + break; + case 62: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAME, yytext()); + } + case 197: break; case 1: { } - case 52: + case 198: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ParsedSymbol.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ParsedSymbol.java index 18f0815c0..e8a7f468d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ParsedSymbol.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ParsedSymbol.java @@ -32,6 +32,79 @@ public class ParsedSymbol { public static final int TYPE_EXCEPTION_START = 10; public static final int TYPE_EXCEPTION_END = 11; public static final int TYPE_EXCEPTION_TARGET = 12; + public static final int TYPE_KEYWORD_QNAME = 13; + public static final int TYPE_KEYWORD_QNAMEA = 14; + public static final int TYPE_KEYWORD_RTQNAME = 15; + public static final int TYPE_KEYWORD_RTQNAMEA = 16; + public static final int TYPE_KEYWORD_RTQNAMEL = 17; + public static final int TYPE_KEYWORD_RTQNAMELA = 18; + public static final int TYPE_KEYWORD_MULTINAME = 19; + public static final int TYPE_KEYWORD_MULTINAMEA = 20; + public static final int TYPE_KEYWORD_MULTINAMEL = 21; + public static final int TYPE_KEYWORD_MULTINAMELA = 22; + public static final int TYPE_KEYWORD_TYPENAME = 23; + public static final int TYPE_PARENT_OPEN = 24; + public static final int TYPE_PARENT_CLOSE = 25; + public static final int TYPE_COMMA = 26; + public static final int TYPE_KEYWORD_NULL = 27; + public static final int TYPE_BRACKET_OPEN = 28; + public static final int TYPE_BRACKET_CLOSE = 29; + public static final int TYPE_LOWERTHAN = 30; + public static final int TYPE_GREATERTHAN = 31; + public static final int TYPE_KEYWORD_NAMESPACE = 32; + public static final int TYPE_KEYWORD_PRIVATENAMESPACE = 33; + public static final int TYPE_KEYWORD_PACKAGENAMESPACE = 34; + public static final int TYPE_KEYWORD_PACKAGEINTERNALNS = 35; + public static final int TYPE_KEYWORD_PROTECTEDNAMESPACE = 36; + public static final int TYPE_KEYWORD_EXPLICITNAMESPACE = 37; + public static final int TYPE_KEYWORD_STATICPROTECTEDNS = 38; + public static final int TYPE_KEYWORD_TRY = 39; + public static final int TYPE_KEYWORD_FROM = 40; + public static final int TYPE_KEYWORD_TO = 41; + public static final int TYPE_KEYWORD_TARGET = 42; + public static final int TYPE_KEYWORD_TYPE = 43; + public static final int TYPE_KEYWORD_NAME = 44; + public static final int TYPE_KEYWORD_FLAG = 45; + public static final int TYPE_KEYWORD_EXPLICIT = 46; + public static final int TYPE_KEYWORD_HAS_OPTIONAL = 47; + public static final int TYPE_KEYWORD_HAS_PARAM_NAMES = 48; + public static final int TYPE_KEYWORD_IGNORE_REST = 49; + public static final int TYPE_KEYWORD_NEED_ACTIVATION = 50; + public static final int TYPE_KEYWORD_NEED_ARGUMENTS = 51; + public static final int TYPE_KEYWORD_NEED_REST = 52; + public static final int TYPE_KEYWORD_SET_DXNS = 53; + public static final int TYPE_KEYWORD_PARAM = 54; + public static final int TYPE_KEYWORD_PARAMNAME = 55; + public static final int TYPE_KEYWORD_OPTIONAL = 56; + public static final int TYPE_KEYWORD_RETURNS = 57; + public static final int TYPE_KEYWORD_BODY = 58; + public static final int TYPE_KEYWORD_MAXSTACK = 59; + public static final int TYPE_KEYWORD_LOCALCOUNT = 60; + public static final int TYPE_KEYWORD_INITSCOPEDEPTH = 61; + public static final int TYPE_KEYWORD_MAXSCOPEDEPTH = 62; + public static final int TYPE_KEYWORD_CODE = 63; + public static final int TYPE_KEYWORD_INTEGER = 64; + public static final int TYPE_KEYWORD_UINTEGER = 65; + public static final int TYPE_KEYWORD_DOUBLE = 66; + public static final int TYPE_KEYWORD_DECIMAL = 67; + public static final int TYPE_KEYWORD_UTF8 = 68; + public static final int TYPE_KEYWORD_TRUE = 69; + public static final int TYPE_KEYWORD_FALSE = 70; + public static final int TYPE_KEYWORD_UNDEFINED = 71; + public static final int TYPE_KEYWORD_TRAIT = 72; + public static final int TYPE_KEYWORD_SLOT = 73; + public static final int TYPE_KEYWORD_CONST = 74; + public static final int TYPE_KEYWORD_METHOD = 75; + public static final int TYPE_KEYWORD_GETTER = 76; + public static final int TYPE_KEYWORD_SETTER = 77; + public static final int TYPE_KEYWORD_CLASS = 78; + public static final int TYPE_KEYWORD_FUNCTION = 79; + public static final int TYPE_KEYWORD_DISPID = 80; + public static final int TYPE_KEYWORD_SLOTID = 81; + public static final int TYPE_KEYWORD_VALUE = 82; + public static final int TYPE_KEYWORD_FINAL = 83; + public static final int TYPE_KEYWORD_METADATA = 84; + public static final int TYPE_KEYWORD_OVERRIDE = 85; public ParsedSymbol(int type, Object value) { this.type = type; diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex index b00259707..8b61417ec 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex @@ -2,12 +2,14 @@ package com.jpexs.decompiler.flash.abc.avm2.parser; +import java.util.Stack; %% %public %class Flasm3Lexer %final %unicode +%ignorecase %char %line %column @@ -37,6 +39,26 @@ package com.jpexs.decompiler.flash.abc.avm2.parser; return yyline+1; } + + + private Stack pushedBack=new Stack<>(); + + + public void pushback(ParsedSymbol symb) { + pushedBack.push(symb); + last = null; + } + ParsedSymbol last; + public ParsedSymbol lex() throws java.io.IOException, ParseException{ + ParsedSymbol ret=null; + if(!pushedBack.isEmpty()){ + ret = last = pushedBack.pop(); + }else{ + ret = last = yylex(); + } + return ret; + } + %} /* main character classes */ @@ -107,7 +129,23 @@ ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":" String s=yytext(); return new ParsedSymbol(ParsedSymbol.TYPE_LABEL,s.substring(0,s.length()-1)); } - + "name" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME,yytext());} + "try" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRY,yytext());} + "flag" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FLAG,yytext());} + "param" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAM,yytext());} + "paramname" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAMNAME,yytext());} + "optional" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OPTIONAL,yytext());} + "returns" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RETURNS,yytext());} + "body" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_BODY,yytext());} + "maxstack" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSTACK,yytext());} + "localcount" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_LOCALCOUNT,yytext());} + "initscopedepth" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INITSCOPEDEPTH,yytext());} + "maxscopedepth" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSCOPEDEPTH,yytext());} + "code" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CODE,yytext());} + "trait" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRAIT,yytext());} + "method" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METHOD,yytext());} + + /* identifiers */ {InstructionName} { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_INSTRUCTION_NAME,yytext()); @@ -128,7 +166,78 @@ ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":" yybegin(STRING); string.setLength(0); } + /* multinames */ + "QName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAME,yytext());} + "QNameA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAMEA,yytext());} + "RTQName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAME,yytext());} + "RTQNameA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEA,yytext());} + "RTQNameL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEL,yytext());} + "RTQNameLA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMELA,yytext());} + "Multiname" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAME,yytext());} + "MultinameL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMEL,yytext());} + "MultinameLA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMELA,yytext());} + "TypeName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPENAME,yytext());} + "null" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NULL,yytext());} + "(" { return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_OPEN,yytext());} + ")" { return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_CLOSE,yytext());} + "[" { return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_OPEN,yytext());} + "]" { return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_CLOSE,yytext());} + "<" { return new ParsedSymbol(ParsedSymbol.TYPE_LOWERTHAN,yytext());} + ">" { return new ParsedSymbol(ParsedSymbol.TYPE_GREATERTHAN,yytext());} + "Namespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAMESPACE,yytext());} + "PrivateNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE,yytext());} + "PackageNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE,yytext());} + "PackageInternalNs" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS,yytext());} + "ProtectedNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE,yytext());} + "ExplicitNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE,yytext());} + "StaticProtectedNs" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS,yytext());} + "," { return new ParsedSymbol(ParsedSymbol.TYPE_COMMA,yytext());} + /*Try*/ + "from" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FROM,yytext());} + "to" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TO,yytext());} + "target" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TARGET,yytext());} + "name" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME,yytext());} + "type" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPE,yytext());} + + "slot" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOT,yytext());} + "const" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CONST,yytext());} + "method" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METHOD,yytext());} + "getter" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_GETTER,yytext());} + "setter" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SETTER,yytext());} + "class" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CLASS,yytext());} + "function" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FUNCTION,yytext());} + "dispid" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DISPID,yytext());} + "slotid" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOTID,yytext());} + "value" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_VALUE,yytext());} + + + + /*Flags*/ + "EXPLICIT" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICIT,yytext());} + "HAS_OPTIONAL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_OPTIONAL,yytext());} + "HAS_PARAM_NAMES" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_PARAM_NAMES,yytext());} + "IGNORE_REST" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_IGNORE_REST,yytext());} + "NEED_ACTIVATION" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ACTIVATION,yytext());} + "NEED_ARGUMENTS" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ARGUMENTS,yytext());} + "NEED_REST" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_REST,yytext());} + "SET_DXNS" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SET_DXNS,yytext());} + + /* Value types*/ + "Integer" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INTEGER,yytext());} + "UInteger" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UINTEGER,yytext());} + "Double" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DOUBLE,yytext());} + "Decimal" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DECIMAL,yytext());} + "Utf8" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UTF8,yytext());} + "True" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRUE,yytext());} + "False" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FALSE,yytext());} + "Undefined" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UNDEFINED,yytext());} + + + "FINAL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FINAL,yytext());} + "OVERRIDE" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OVERRIDE,yytext());} + "METADATA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METADATA,yytext());} + /* numeric literals */ {NumberLiteral} { return new ParsedSymbol(ParsedSymbol.TYPE_INTEGER,new Long(Long.parseLong((yytext())))); } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index e257ffb6e..13a624de7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.CodeStats; import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.helpers.Highlighting; @@ -70,16 +71,16 @@ public class MethodBody implements Cloneable, Serializable { return s; } - public int removeDeadCode(ConstantPool constants) { - return code.removeDeadCode(constants, this); + public int removeDeadCode(ConstantPool constants, Trait trait, MethodInfo info) { + return code.removeDeadCode(constants, trait, info, this); } - public void restoreControlFlow(ConstantPool constants) { - code.restoreControlFlow(constants, this); + public void restoreControlFlow(ConstantPool constants, Trait trait, MethodInfo info) { + code.restoreControlFlow(constants, trait, info, this); } - public int removeTraps(ConstantPool constants, ABC abc, int scriptIndex, int classIndex, boolean isStatic, String path) { - return code.removeTraps(constants, this, abc, scriptIndex, classIndex, isStatic, path); + public int removeTraps(ConstantPool constants, ABC abc, Trait trait, int scriptIndex, int classIndex, boolean isStatic, String path) { + return code.removeTraps(constants, trait, abc.method_info[method_info], this, abc, scriptIndex, classIndex, isStatic, path); } public HashMap getLocalRegNames(ABC abc) { @@ -108,13 +109,13 @@ public class MethodBody implements Cloneable, Serializable { return ret; } - public String toString(final String path, boolean pcode, final boolean isStatic, final int scriptIndex, final int classIndex, final ABC abc, final ConstantPool constants, final MethodInfo[] method_info, final Stack scopeStack, final boolean isStaticInitializer, final boolean hilight, final boolean replaceIndents, final List fullyQualifiedNames, final Traits initTraits) { + public String toString(final String path, boolean pcode, final boolean isStatic, final int scriptIndex, final int classIndex, final ABC abc, final Trait trait, final ConstantPool constants, final MethodInfo[] method_info, final Stack scopeStack, final boolean isStaticInitializer, final boolean hilight, final boolean replaceIndents, final List fullyQualifiedNames, final Traits initTraits) { if (debugMode) { System.err.println("Decompiling " + path); } String s = ""; if (pcode) { - s += code.toASMSource(constants, this, false, hilight); + s += code.toASMSource(constants, trait, method_info[this.method_info], this, false, hilight); } else { if (!Configuration.getConfig("decompile", true)) { s = "//Decompilation skipped"; @@ -128,7 +129,7 @@ public class MethodBody implements Cloneable, Serializable { s += Helper.timedCall(new Callable() { @Override public String call() throws Exception { - return toSource(path, isStatic, scriptIndex, classIndex, abc, constants, method_info, scopeStack, isStaticInitializer, hilight, replaceIndents, fullyQualifiedNames, initTraits); + return toSource(path, isStatic, scriptIndex, classIndex, abc, trait, constants, method_info, scopeStack, isStaticInitializer, hilight, replaceIndents, fullyQualifiedNames, initTraits); } }, timeout, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException ex) { @@ -139,14 +140,14 @@ public class MethodBody implements Cloneable, Serializable { return s; } - public String toSource(String path, boolean isStatic, int scriptIndex, int classIndex, ABC abc, ConstantPool constants, MethodInfo[] method_info, Stack scopeStack, boolean isStaticInitializer, boolean hilight, boolean replaceIndents, List fullyQualifiedNames, Traits initTraits) { + public String toSource(String path, boolean isStatic, int scriptIndex, int classIndex, ABC abc, Trait trait, ConstantPool constants, MethodInfo[] method_info, Stack scopeStack, boolean isStaticInitializer, boolean hilight, boolean replaceIndents, List fullyQualifiedNames, Traits initTraits) { AVM2Code deobfuscated = null; MethodBody b = (MethodBody) Helper.deepCopy(this); deobfuscated = b.code; deobfuscated.markMappedOffsets(); if (Configuration.getConfig("autoDeobfuscate", true)) { try { - deobfuscated.removeTraps(constants, b, abc, scriptIndex, classIndex, isStatic, path); + deobfuscated.removeTraps(constants, trait, method_info[this.method_info], b, abc, scriptIndex, classIndex, isStatic, path); } catch (Exception | StackOverflowError ex) { Logger.getLogger(MethodBody.class.getName()).log(Level.SEVERE, "Error during remove traps in " + path, ex); } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java index ce07d68bb..4b50387c1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java @@ -34,6 +34,18 @@ public class MethodInfo { public int[] paramNames; private MethodBody body; + public void setFlagIgnore_Rest() { + flags |= 16; + } + + public void setFlagExplicit() { + flags |= 32; + } + + public void setFlagNeed_Arguments() { + flags |= 1; + } + public void setFlagSetsdxns() { flags |= 64; } @@ -140,7 +152,7 @@ public class MethodInfo { return (flags & 8) == 8; } - public boolean flagIgnore_restHas_optional() { + public boolean flagIgnore_rest() { return (flags & 16) == 16; } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/Multiname.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/Multiname.java index 822ad01a2..4153a3cc0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/Multiname.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/Multiname.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.abc.types; import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; +import com.jpexs.helpers.Helper; import java.util.List; public class Multiname { @@ -135,42 +136,80 @@ public class Multiname { } - public String toString(ConstantPool constants, List fullyQualifiedNames) { - String kindStr = "?"; - for (int k = 0; k < multinameKinds.length; k++) { - if (multinameKinds[k] == kind) { - kindStr = multinameKindNames[k] + " "; + private static String namespaceToString(ConstantPool constants, int index) { + if (index == 0) { + return "null"; + } + int type = constants.constant_namespace[index].kind; + String name = constants.constant_namespace[index].getName(constants); + int sub = -1; + for (int n = 1; n < constants.constant_namespace.length; n++) { + if (constants.constant_namespace[n].kind == type && constants.constant_namespace[n].getName(constants).equals(name)) { + sub++; + } + if (n == index) { break; } } - String nameStr = ""; - if (name_index > 0) { - nameStr = constants.constant_string[name_index]; - } - if (name_index == 0) { - nameStr = "*"; - } - String namespaceStr = ""; - if (namespace_index > 0) { - namespaceStr = constants.constant_namespace[namespace_index].toString(constants); - } - if (!namespaceStr.equals("")) { - namespaceStr = namespaceStr + "."; - } - if (namespace_index == 0) { - namespaceStr = "*."; - } - String namespaceSetStr = ""; - if (namespace_set_index > 0) { - namespaceSetStr = " "; - } - String typeNameStr = ""; - if (kind == TYPENAME) { - typeNameStr = typeNameToStr(constants, fullyQualifiedNames); - } + return constants.constant_namespace[index].getKindStr() + "(" + "\"" + Helper.escapeString(name) + "\"" + (sub > 0 ? ",\"" + sub + "\"" : "") + ")"; + } - return namespaceStr + nameStr + namespaceSetStr + typeNameStr; + private static String namespaceSetToString(ConstantPool constants, int index) { + if (index == 0) { + return "null"; + } + String ret = "["; + for (int n = 0; n < constants.constant_namespace_set[index].namespaces.length; n++) { + if (n > 0) { + ret += ","; + } + int ns = constants.constant_namespace_set[index].namespaces[n]; + ret += namespaceToString(constants, ns); + } + ret += "]"; + return ret; + } + private static String multinameToString(ConstantPool constants, int index, List fullyQualifiedNames) { + if (index == 0) { + return "null"; + } + return constants.constant_multiname[index].toString(constants, fullyQualifiedNames); + } + + public String toString(ConstantPool constants, List fullyQualifiedNames) { + + switch (kind) { + case QNAME: + case QNAMEA: + return getKindStr() + "(" + namespaceToString(constants, namespace_index) + "," + "\"" + Helper.escapeString(constants.constant_string[name_index]) + "\"" + ")"; + case RTQNAME: + case RTQNAMEA: + return getKindStr() + "(" + "\"" + Helper.escapeString(constants.constant_string[name_index]) + "\"" + ")"; + case RTQNAMEL: + case RTQNAMELA: + return getKindStr() + "()"; + case MULTINAME: + case MULTINAMEA: + return getKindStr() + "(" + "\"" + Helper.escapeString(constants.constant_string[name_index]) + "\"" + "," + namespaceSetToString(constants, namespace_set_index) + ")"; + case MULTINAMEL: + case MULTINAMELA: + return getKindStr() + "(" + namespaceSetToString(constants, namespace_set_index) + ")"; + case TYPENAME: + String tret = getKindStr() + "("; + tret += multinameToString(constants, qname_index, fullyQualifiedNames); + tret += "<"; + for (int i = 0; i < params.size(); i++) { + if (i > 0) { + tret += ","; + } + tret += multinameToString(constants, params.get(i), fullyQualifiedNames); + } + tret += ">"; + tret += ")"; + return tret; + } + return null; } private String typeNameToStr(ConstantPool constants, List fullyQualifiedNames) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/Namespace.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/Namespace.java index ece189934..be9222810 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/Namespace.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/Namespace.java @@ -29,7 +29,7 @@ public class Namespace { public static final int KIND_EXPLICIT = 25; public static final int KIND_STATIC_PROTECTED = 26; public static final int[] nameSpaceKinds = new int[]{KIND_NAMESPACE, KIND_PRIVATE, KIND_PACKAGE, KIND_PACKAGE_INTERNAL, KIND_PROTECTED, KIND_EXPLICIT, KIND_STATIC_PROTECTED}; - public static final String[] nameSpaceKindNames = new String[]{"Namespace", "PrivateNamespace", "PackageNamespace", "PackageInternalNamespace", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNamespace"}; + public static final String[] nameSpaceKindNames = new String[]{"Namespace", "PrivateNamespace", "PackageNamespace", "PackageInternalNs", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNs"}; public static final String[] namePrefixes = new String[]{"", "private", "public", "", "protected", "explicit", "protected"}; public int kind; public int name_index; diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java index 8d9ab7074..85a2904c3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java @@ -22,6 +22,13 @@ public class NamespaceSet { public int[] namespaces; + public NamespaceSet() { + } + + public NamespaceSet(int[] namespaces) { + this.namespaces = namespaces; + } + public String toString(ConstantPool constants) { String s = ""; for (int i = 0; i < this.namespaces.length; i++) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/ValueKind.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/ValueKind.java index c67115002..b3e353019 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/ValueKind.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/ValueKind.java @@ -38,7 +38,7 @@ public class ValueKind { public static final int CONSTANT_StaticProtectedNs = 0x1A;// Namespace public static final int CONSTANT_PrivateNs = 0x05;// namespace private static final int[] optionalKinds = new int[]{0x03, 0x04, 0x06, 0x02, 0x01, 0x0B, 0x0A, 0x0C, 0x00, 0x08, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x05}; - private static final String[] optionalKindNames = new String[]{"Int", "UInt", "Double", "Decimal", "Utf8", "True", "False", "Null", "Undefined", "Namespace", "PackageNamespace", "PackageInternalNs", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNs", "PrivateNs"}; + private static final String[] optionalKindNames = new String[]{"Int", "UInt", "Double", "Decimal", "Utf8", "True", "False", "Null", "Undefined", "Namespace", "PackageNamespace", "PackageInternalNs", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNs", "PrivateNamespace"}; public int value_index; public int value_kind; @@ -120,4 +120,46 @@ public class ValueKind { } return ret; } + + public String toASMString(ConstantPool constants) { + String ret = "?"; + switch (value_kind) { + case CONSTANT_Int: + ret = "Integer(" + constants.constant_int[value_index] + ")"; + break; + case CONSTANT_UInt: + ret = "UInteger(" + constants.constant_uint[value_index] + ")"; + break; + case CONSTANT_Double: + ret = "Double(" + constants.constant_double[value_index] + ")"; + break; + case CONSTANT_Decimal: + ret = "Decimal(" + constants.constant_decimal[value_index] + ")"; + break; + case CONSTANT_Utf8: + ret = "Utf8(\"" + Helper.escapeString(constants.constant_string[value_index]) + "\")"; + break; + case CONSTANT_True: + ret = "True"; + break; + case CONSTANT_False: + ret = "False"; + break; + case CONSTANT_Null: + ret = "Null"; + break; + case CONSTANT_Undefined: + ret = "Undefined"; + break; + case CONSTANT_Namespace: + case CONSTANT_PackageInternalNs: + case CONSTANT_ProtectedNamespace: + case CONSTANT_ExplicitNamespace: + case CONSTANT_StaticProtectedNs: + case CONSTANT_PrivateNs: + ret = constants.constant_namespace[value_index].getKindStr() + "(\"" + constants.constant_namespace[value_index].getName(constants) + "\")"; + break; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index 681fac508..ab64eb9dc 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -445,7 +445,7 @@ public class TraitClass extends Trait implements TraitWithSlot { String bodyStr = ""; bodyIndex = abc.findBodyIndex(abc.class_info[class_info].cinit_index); if (bodyIndex != -1) { - bodyStr = abc.bodies[bodyIndex].toString(path +/*packageName +*/ "/" + abc.instance_info[class_info].getName(abc.constants).getName(abc.constants, fullyQualifiedNames) + ".staticinitializer", pcode, true, scriptIndex, class_info, abc, abc.constants, abc.method_info, new Stack(), true, highlight, true, fullyQualifiedNames, abc.class_info[class_info].static_traits); + bodyStr = abc.bodies[bodyIndex].toString(path +/*packageName +*/ "/" + abc.instance_info[class_info].getName(abc.constants).getName(abc.constants, fullyQualifiedNames) + ".staticinitializer", pcode, true, scriptIndex, class_info, abc, this, abc.constants, abc.method_info, new Stack(), true, highlight, true, fullyQualifiedNames, abc.class_info[class_info].static_traits); } if (Highlighting.stripHilights(bodyStr).trim().equals("")) { toPrint = ABC.addTabs(bodyStr + "/*classInitializer*/", 3); @@ -479,7 +479,7 @@ public class TraitClass extends Trait implements TraitWithSlot { bodyStr = ""; bodyIndex = abc.findBodyIndex(abc.instance_info[class_info].iinit_index); if (bodyIndex != -1) { - bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path +/*packageName +*/ "/" + abc.instance_info[class_info].getName(abc.constants).getName(abc.constants, fullyQualifiedNames) + ".initializer", pcode, false, scriptIndex, class_info, abc, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, abc.instance_info[class_info].instance_traits), 3); + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path +/*packageName +*/ "/" + abc.instance_info[class_info].getName(abc.constants).getName(abc.constants, fullyQualifiedNames) + ".initializer", pcode, false, scriptIndex, class_info, abc, this, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, abc.instance_info[class_info].instance_traits), 3); constructorParams = abc.method_info[abc.instance_info[class_info].iinit_index].getParamStr(abc.constants, abc.bodies[bodyIndex], abc, fullyQualifiedNames); } else { constructorParams = abc.method_info[abc.instance_info[class_info].iinit_index].getParamStr(abc.constants, null, abc, fullyQualifiedNames); @@ -548,11 +548,11 @@ public class TraitClass extends Trait implements TraitWithSlot { int iInitializer = abc.findBodyIndex(abc.instance_info[class_info].iinit_index); int ret = 0; if (iInitializer != -1) { - ret += abc.bodies[iInitializer].removeTraps(abc.constants, abc, scriptIndex, class_info, false, path); + ret += abc.bodies[iInitializer].removeTraps(abc.constants, abc, this, scriptIndex, class_info, false, path); } int sInitializer = abc.findBodyIndex(abc.class_info[class_info].cinit_index); if (sInitializer != -1) { - ret += abc.bodies[sInitializer].removeTraps(abc.constants, abc, scriptIndex, class_info, true, path); + ret += abc.bodies[sInitializer].removeTraps(abc.constants, abc, this, scriptIndex, class_info, true, path); } ret += abc.instance_info[class_info].instance_traits.removeTraps(scriptIndex, class_info, false, abc, path); ret += abc.class_info[class_info].static_traits.removeTraps(scriptIndex, class_info, true, abc, path); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java index bfc4ffba7..a02e0ba72 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java @@ -56,7 +56,7 @@ public class TraitFunction extends Trait implements TraitWithSlot { String bodyStr = ""; int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { - bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path + "." + abc.constants.constant_multiname[name_index].getName(abc.constants, fullyQualifiedNames), pcode, isStatic, scriptIndex, classIndex, abc, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, null), 3); + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path + "." + abc.constants.constant_multiname[name_index].getName(abc.constants, fullyQualifiedNames), pcode, isStatic, scriptIndex, classIndex, abc, this, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, null), 3); } return Graph.INDENT_STRING + Graph.INDENT_STRING + header + (abc.instance_info[classIndex].isInterface() ? ";" : " {\r\n" + bodyStr + "\r\n" + Graph.INDENT_STRING + Graph.INDENT_STRING + "}"); @@ -66,7 +66,7 @@ public class TraitFunction extends Trait implements TraitWithSlot { public int removeTraps(int scriptIndex, int classIndex, boolean isStatic, ABC abc, String path) { int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { - return abc.bodies[bodyIndex].removeTraps(abc.constants, abc, scriptIndex, classIndex, isStatic, path); + return abc.bodies[bodyIndex].removeTraps(abc.constants, abc, this, scriptIndex, classIndex, isStatic, path); } return 0; } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java index 87f2ac11d..f774ea97d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java @@ -60,7 +60,7 @@ public class TraitMethodGetterSetter extends Trait { String bodyStr = ""; int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { - bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path + "." + getName(abc).getName(abc.constants, fullyQualifiedNames), pcode, isStatic, scriptIndex, classIndex, abc, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, null), 3); + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path + "." + getName(abc).getName(abc.constants, fullyQualifiedNames), pcode, isStatic, scriptIndex, classIndex, abc, this, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, null), 3); } return Graph.INDENT_STRING + Graph.INDENT_STRING + header + ((classIndex != -1 && abc.instance_info[classIndex].isInterface()) ? ";" : " {\r\n" + bodyStr + "\r\n" + Graph.INDENT_STRING + Graph.INDENT_STRING + "}"); } @@ -69,7 +69,7 @@ public class TraitMethodGetterSetter extends Trait { public int removeTraps(int scriptIndex, int classIndex, boolean isStatic, ABC abc, String path) { int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { - return abc.bodies[bodyIndex].removeTraps(abc.constants, abc, scriptIndex, classIndex, isStatic, path); + return abc.bodies[bodyIndex].removeTraps(abc.constants, abc, this, scriptIndex, classIndex, isStatic, path); } return 0; } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java index 33473d67c..6fa1b164e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java @@ -127,7 +127,7 @@ public class Traits implements Serializable { ExecutorService executor = null; List> futureResults = null; List traitConvertTasks = null; - + if (parallel) { executor = Executors.newFixedThreadPool(20); futureResults = new ArrayList<>(); diff --git a/trunk/src/com/jpexs/decompiler/flash/action/ActionListReader.java b/trunk/src/com/jpexs/decompiler/flash/action/ActionListReader.java index 24a69a1b7..9b37c366b 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/ActionListReader.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/ActionListReader.java @@ -81,7 +81,7 @@ public class ActionListReader { */ public static List readActionList(List listeners, long containerSWFOffset, ReReadableInputStream rri, int version, int ip, int endIp, String path) throws IOException { boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); - + ConstantPool cpool = new ConstantPool(); SWFInputStream sis = new SWFInputStream(rri, version); @@ -89,8 +89,8 @@ public class ActionListReader { // List of the actions. N. item contains the action which starts in offset N. List actionMap = new ArrayList<>(); List nextOffsets = new ArrayList<>(); - Action entryAction = readActionListAtPos(listeners, containerSWFOffset, cpool, - sis, rri, + Action entryAction = readActionListAtPos(listeners, containerSWFOffset, cpool, + sis, rri, actionMap, nextOffsets, ip, ip, endIp, version, path, false, new ArrayList()); @@ -107,7 +107,7 @@ public class ActionListReader { jump.setJumpOffset((int) (entryAction.getAddress() - size)); actions.add(jump); } - + // remove nulls index = getNextNotNullIndex(actionMap, index); while (index > -1) { @@ -126,7 +126,7 @@ public class ActionListReader { } index = nextIndex; } - + // Map for storing the targers of the "jump" actions // "jump" action can be ActionIf, ActionJump and any ActionStore Map jumps = new HashMap<>(); @@ -137,7 +137,7 @@ public class ActionListReader { updateActionStores(actions, jumps); updateContainerSizes(actions, containerLastActions); updateActionLengths(actions, version); - + // add end action Action lastAction = actions.get(actions.size() - 1); if (!(lastAction instanceof ActionEnd)) { @@ -153,7 +153,7 @@ public class ActionListReader { return actions; } - + /** * Reads list of actions from the stream. Reading ends with * ActionEndFlag(=0) or end of the stream. @@ -173,7 +173,7 @@ public class ActionListReader { byte[] data = Action.actionsToBytes(actions, true, version); ReReadableInputStream rri = new ReReadableInputStream(new ByteArrayInputStream(data)); int endIp = data.length; - + List retdups = new ArrayList<>(); for (int i = 0; i <= endIp; i++) { Action a = new ActionNop(); @@ -224,7 +224,7 @@ public class ActionListReader { } return reta; } - + private static int getPrevNotNullIndex(List actionMap, int startIndex) { startIndex = Math.min(startIndex, actionMap.size() - 1); for (int i = startIndex; i >= 0; i--) { @@ -234,7 +234,7 @@ public class ActionListReader { } return -1; } - + private static int getNextNotNullIndex(List actionMap, int startIndex) { for (int i = startIndex; i < actionMap.size(); i++) { if (actionMap.get(i) != null) { @@ -243,7 +243,7 @@ public class ActionListReader { } return -1; } - + private static Map actionListToMap(List actions) { Map map = new HashMap<>(actions.size()); for (Action a : actions) { @@ -294,7 +294,7 @@ public class ActionListReader { if (a == null) { continue; } - + if (a instanceof GraphSourceItemContainer) { GraphSourceItemContainer container = (GraphSourceItemContainer) a; List sizes = container.getContainerSizes(); @@ -313,7 +313,7 @@ public class ActionListReader { } } } - + private static long updateAddresses(List actions, long address, int version) { for (int i = 0; i < actions.size(); i++) { Action a = actions.get(i); @@ -327,7 +327,7 @@ public class ActionListReader { } return address; } - + private static void updateActionLengths(List actions, int version) { for (int i = 0; i < actions.size(); i++) { Action a = actions.get(i); @@ -335,7 +335,7 @@ public class ActionListReader { a.actionLength = length - 1 - ((a.actionCode >= 0x80) ? 2 : 0); } } - + private static void updateActionStores(List actions, Map jumps) { Map actionMap = actionListToMap(actions); for (int i = 0; i < actions.size(); i++) { @@ -358,7 +358,7 @@ public class ActionListReader { } } } - + private static void updateContainerSizes(List actions, Map> containerLastActions) { for (int i = 0; i < actions.size(); i++) { Action a = actions.get(i); @@ -383,7 +383,7 @@ public class ActionListReader { } } } - + private static void replaceContainerLastActions(Map> containerLastActions, Action oldTarget, Action newTarget) { for (Action a : containerLastActions.keySet()) { List targets = containerLastActions.get(a); @@ -394,7 +394,7 @@ public class ActionListReader { } } } - + private static void updateJumps(List actions, Map jumps, Map> containerLastActions, long endAddress, int version) { if (actions.isEmpty()) { return; @@ -432,21 +432,21 @@ public class ActionListReader { aJump.setJumpOffset((int) offset); } } - } + } @SuppressWarnings("unchecked") - private static Action readActionListAtPos(List listeners, long containerSWFOffset, ConstantPool cpool, - SWFInputStream sis, ReReadableInputStream rri, - List actions, List nextOffsets, - long ip, long startIp, long endIp, int version, String path, boolean indeterminate, List visitedContainers) throws IOException { - + private static Action readActionListAtPos(List listeners, long containerSWFOffset, ConstantPool cpool, + SWFInputStream sis, ReReadableInputStream rri, + List actions, List nextOffsets, + long ip, long startIp, long endIp, int version, String path, boolean indeterminate, List visitedContainers) throws IOException { + Action entryAction = null; if (visitedContainers.contains(ip)) { return null; } visitedContainers.add(ip); - + Queue jumpQueue = new LinkedList<>(); jumpQueue.add(ip); while (!jumpQueue.isEmpty()) { @@ -458,7 +458,7 @@ public class ActionListReader { if ((a = sis.readAction(rri, cpool)) == null) { break; } - + int actionLengthWithHeader = getTotalActionLength(a); // unknown action, replace with jump @@ -470,25 +470,25 @@ public class ActionListReader { a = aJump; actionLengthWithHeader = getTotalActionLength(a); } - + if (entryAction == null) { entryAction = a; } ensureCapacity(actions, nextOffsets, ip); - + Action existingAction = actions.get((int) ip); if (existingAction != null) { break; } - + actions.set((int) ip, a); nextOffsets.set((int) ip, ip + actionLengthWithHeader); - + for (int i = 0; i < listeners.size(); i++) { listeners.get(i).progress("Reading", rri.getCount(), rri.length()); } - + a.containerSWFOffset = containerSWFOffset; a.setAddress(ip, version, false); @@ -501,7 +501,7 @@ public class ActionListReader { cpool.setNew(((ActionConstantPool) a).constantPool); } else if (a instanceof ActionIf) { ActionIf aIf = (ActionIf) a; - long nIp = ip + actionLengthWithHeader + aIf.getJumpOffset(); + long nIp = ip + actionLengthWithHeader + aIf.getJumpOffset(); if (nIp >= 0) { jumpQueue.add(nIp); } @@ -520,17 +520,17 @@ public class ActionListReader { if (size != 0) { long ip2 = ip + actionLengthWithHeader; //long endIp2 = ip + actionLengthWithHeader + size; - readActionListAtPos(listeners, containerSWFOffset, cpool, - sis, rri, + readActionListAtPos(listeners, containerSWFOffset, cpool, + sis, rri, actions, nextOffsets, ip2, startIp, endIp, version, newPath, indeterminate, visitedContainers); actionLengthWithHeader += size; } } } - + ip = ip + actionLengthWithHeader; - + if (a.isExit()) { break; } @@ -542,7 +542,7 @@ public class ActionListReader { private static int getTotalActionLength(Action action) { return action.actionLength + 1 + ((action.actionCode >= 0x80) ? 2 : 0); } - + private static void ensureCapacity(List actions, List nextOffsets, long index) { while (actions.size() <= index) { actions.add(null); @@ -635,14 +635,14 @@ public class ActionListReader { if (deobfuscate) { top = stack.pop(); } - int nip = (int)rri.getPos() + aif.getJumpOffset(); + int nip = (int) rri.getPos() + aif.getJumpOffset(); if (decideBranch) { System.out.print("newip " + nip + ", "); System.out.print("Action: jump(j),ignore(i),compute(c)?"); String next = sc.next(); if (next.equals("j")) { - newip = (int)rri.getPos() + aif.getJumpOffset(); + newip = (int) rri.getPos() + aif.getJumpOffset(); rri.setPos(newip); } else if (next.equals("i")) { @@ -655,7 +655,7 @@ public class ActionListReader { System.err.print("is compiletime -> "); } if (EcmaScript.toBoolean(top.getResult())) { - newip = (int)rri.getPos() + aif.getJumpOffset(); + newip = (int) rri.getPos() + aif.getJumpOffset(); aif.jumpUsed = true; if (aif.ignoreUsed) { aif.compileTime = false; @@ -679,7 +679,7 @@ public class ActionListReader { goaif = true; } } else if (a instanceof ActionJump) { - newip = (int)rri.getPos() + ((ActionJump) a).getJumpOffset(); + newip = (int) rri.getPos() + ((ActionJump) a).getJumpOffset(); } else if (!(a instanceof GraphSourceItemContainer)) { if (deobfuscate) { //return in for..in, TODO:Handle this better way @@ -793,8 +793,8 @@ public class ActionListReader { if ((!stateChanged) && curVisited > 1) { List branches = new ArrayList<>(); - branches.add((int)rri.getPos() + aif.getJumpOffset()); - branches.add((int)rri.getPos()); + branches.add((int) rri.getPos() + aif.getJumpOffset()); + branches.add((int) rri.getPos()); for (int br : branches) { int visc = 0; if (visited.containsKey(br)) { @@ -811,10 +811,10 @@ public class ActionListReader { break loopip; } - int oldPos = (int)rri.getPos(); + int oldPos = (int) rri.getPos(); @SuppressWarnings("unchecked") Stack substack = (Stack) stack.clone(); - deobfustaceActionListAtPosRecursive(listeners, output, containers, containerSWFOffset, prepareLocalBranch(localData), substack, cpool, sis, rri, (int)rri.getPos() + aif.getJumpOffset(), ret, startIp, endip, path, visited, indeterminate, decisionStates, version); + deobfustaceActionListAtPosRecursive(listeners, output, containers, containerSWFOffset, prepareLocalBranch(localData), substack, cpool, sis, rri, (int) rri.getPos() + aif.getJumpOffset(), ret, startIp, endip, path, visited, indeterminate, decisionStates, version); rri.setPos(oldPos); } prevIp = ip; @@ -826,7 +826,7 @@ public class ActionListReader { listener.progress("Deobfuscating", rri.getCount(), rri.length()); } } - + private static List prepareLocalBranch(List localData) { @SuppressWarnings("unchecked") HashMap regNames = (HashMap) localData.get(0); diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java b/trunk/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java index 2a8aba4d9..2e13918d0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java @@ -49,38 +49,38 @@ public class ActionWaitForFrame extends Action implements ActionStore { skipCount = sis.readUI8(); skipped = new ArrayList<>(); /*for (int i = 0; i < skipCount; i++) { - Action a = sis.readAction(cpool); - if (a instanceof ActionEnd) { - skipCount = i; - break; - } - if (a == null) { - skipCount = i; - break; - } - if (a instanceof ActionPush) { - if (cpool != null) { - ((ActionPush) a).constantPool = cpool.constants; - } - } - skipped.add(a); - } - boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); - if (deobfuscate) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - for (int i = 0; i < skipCount; i++) { - baos.write(skipped.get(i).getBytes(sis.getVersion())); - } - baos.write(new ActionEnd().getBytes(sis.getVersion())); - SWFInputStream sis2 = new SWFInputStream(new ByteArrayInputStream(baos.toByteArray()), sis.getVersion()); - skipped = sis2.readActionList(new ArrayList(), 0, ""); - if (!skipped.isEmpty()) { - if (skipped.get(skipped.size() - 1) instanceof ActionEnd) { - skipped.remove(skipped.size() - 1); - } - } - skipCount = skipped.size(); - }*/ + Action a = sis.readAction(cpool); + if (a instanceof ActionEnd) { + skipCount = i; + break; + } + if (a == null) { + skipCount = i; + break; + } + if (a instanceof ActionPush) { + if (cpool != null) { + ((ActionPush) a).constantPool = cpool.constants; + } + } + skipped.add(a); + } + boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); + if (deobfuscate) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int i = 0; i < skipCount; i++) { + baos.write(skipped.get(i).getBytes(sis.getVersion())); + } + baos.write(new ActionEnd().getBytes(sis.getVersion())); + SWFInputStream sis2 = new SWFInputStream(new ByteArrayInputStream(baos.toByteArray()), sis.getVersion()); + skipped = sis2.readActionList(new ArrayList(), 0, ""); + if (!skipped.isEmpty()) { + if (skipped.get(skipped.size() - 1) instanceof ActionEnd) { + skipped.remove(skipped.size() - 1); + } + } + skipCount = skipped.size(); + }*/ } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java index bbc33c928..649b0b9a6 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java @@ -63,33 +63,33 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { skipCount = sis.readUI8(); skipped = new ArrayList<>(); /*for (int i = 0; i < skipCount; i++) { - Action a = sis.readAction(cpool); - if (a instanceof ActionEnd) { - skipCount = i; - break; - } - if (a == null) { - skipCount = i; - break; - } - skipped.add(a); - } - boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); - if (deobfuscate) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - for (int i = 0; i < skipCount; i++) { - baos.write(skipped.get(i).getBytes(sis.getVersion())); - } - baos.write(new ActionEnd().getBytes(sis.getVersion())); - SWFInputStream sis2 = new SWFInputStream(new ByteArrayInputStream(baos.toByteArray()), sis.getVersion()); - skipped = sis2.readActionList(new ArrayList(), 0, ""); - if (!skipped.isEmpty()) { - if (skipped.get(skipped.size() - 1) instanceof ActionEnd) { - skipped.remove(skipped.size() - 1); - } - } - skipCount = skipped.size(); - }*/ + Action a = sis.readAction(cpool); + if (a instanceof ActionEnd) { + skipCount = i; + break; + } + if (a == null) { + skipCount = i; + break; + } + skipped.add(a); + } + boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); + if (deobfuscate) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int i = 0; i < skipCount; i++) { + baos.write(skipped.get(i).getBytes(sis.getVersion())); + } + baos.write(new ActionEnd().getBytes(sis.getVersion())); + SWFInputStream sis2 = new SWFInputStream(new ByteArrayInputStream(baos.toByteArray()), sis.getVersion()); + skipped = sis2.readActionList(new ArrayList(), 0, ""); + if (!skipped.isEmpty()) { + if (skipped.get(skipped.size() - 1) instanceof ActionEnd) { + skipped.remove(skipped.size() - 1); + } + } + skipCount = skipped.size(); + }*/ } public ActionWaitForFrame2(FlasmLexer lexer) throws IOException, ParseException { diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index aabb12f93..d7a5e26db 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -69,7 +69,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta long endPos = sis.getPos(); //code = new ArrayList(); hdrSize = endPos - startPos; - int posBef2 = (int)rri.getPos(); + int posBef2 = (int) rri.getPos(); //code = sis.readActionList(rri.getPos(), getFileAddress() + hdrSize, rri, codeSize); //rri.setPos(posBef2 + codeSize); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java index e0552f323..656ede840 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java @@ -110,8 +110,7 @@ public class ActionWith extends Action implements GraphSourceItemContainer { public void setContainerSize(int index, long size) { if (index == 0) { codeSize = (int) size; - } - else { + } else { throw new IllegalArgumentException("Index must be 0."); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index 6337f4daa..720491cfe 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -101,7 +101,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont long posAfter = sis.getPos(); hdrSize = posAfter - posBef; //code = new ArrayList(); - int posBef2 = (int)rri.getPos(); + int posBef2 = (int) rri.getPos(); //code = sis.readActionList(rri.getPos(), getFileAddress() + hdrSize, rri, codeSize); //rri.setPos(posBef2 + codeSize); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java b/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java index 5d991ed70..b35669f76 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java @@ -208,7 +208,7 @@ public class ActionTry extends Action implements GraphSourceItemContainer { public long getTrySize() { return trySize; } - + @Override public List getContainerSizes() { List ret = new ArrayList<>(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index 59fdf9027..abb19226a 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -105,7 +105,7 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { } public void setDrawable(final DrawableTag drawable, final SWF swf, final HashMap characters, int frameRate) { - pause(); + pause(); this.drawable = drawable; this.swf = swf; this.characters = characters; @@ -139,11 +139,11 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { if (drawable == null) { return 0; } - int ret=(int)Math.ceil(percent * drawable.getNumFrames() / 100.0); - if(ret==0){ + int ret = (int) Math.ceil(percent * drawable.getNumFrames() / 100.0); + if (ret == 0) { ret = 1; } - return ret; + return ret; } @Override @@ -163,7 +163,7 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { } private void drawFrame() { - if(drawable == null){ + if (drawable == null) { return; } int nframe = percent * drawable.getNumFrames() / 100; @@ -210,9 +210,9 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { @Override public void gotoFrame(int frame) { - if(drawable==null){ + if (drawable == null) { percent = 0; - }else{ + } else { percent = frame * 100 / drawable.getNumFrames(); } drawFrame(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java index 2abe879f7..5118616ed 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java @@ -31,7 +31,6 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -41,14 +40,12 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; -import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextField; -import javax.swing.SwingConstants; import javax.swing.SwingWorker; import javax.swing.filechooser.FileFilter; @@ -178,8 +175,8 @@ public class LoadFromCacheFrame extends AppFrame implements ActionListener { } } filter(); - - + + return null; } @@ -190,7 +187,6 @@ public class LoadFromCacheFrame extends AppFrame implements ActionListener { refreshButton.setEnabled(true); progressBar.setVisible(false); } - }.execute(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java index 8baf4a12b..8d4329eb8 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java @@ -2,7 +2,6 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.Configuration; import com.jpexs.decompiler.flash.SWF; -import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.helpers.Helper; import com.jpexs.helpers.LimitedInputStream; import com.jpexs.helpers.PosMarkedInputStream; @@ -24,7 +23,6 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -101,17 +99,17 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { setProgress(pos * 100 / ret.size()); pos++; try { - PosMarkedInputStream pmi=new PosMarkedInputStream(ret.get(addr)); + PosMarkedInputStream pmi = new PosMarkedInputStream(ret.get(addr)); ReReadableInputStream is = new ReReadableInputStream(pmi); SWF swf = new SWF(is, null, false, true); long limit = pmi.getPos(); - is.setPos(0); + is.setPos(0); is = new ReReadableInputStream(new LimitedInputStream(is, limit)); if (swf.fileSize > 0 && swf.version > 0 && !swf.tags.isEmpty() && swf.version < 25/*Needs to be fixed when SWF versions reaches this value*/) { - String p=translate("swfitem").replace("%version%", "" + swf.version).replace("%size%", "" + swf.fileSize); + String p = translate("swfitem").replace("%version%", "" + swf.version).replace("%size%", "" + swf.fileSize); publish(p); swfStreams.add(is); - } + } } catch (OutOfMemoryError ome) { System.gc(); @@ -292,11 +290,11 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { JButton openButton = new JButton(translate("button.open")); openButton.setActionCommand("OPENSWF"); openButton.addActionListener(this); - + JButton saveButton = new JButton(translate("button.save")); saveButton.setActionCommand("SAVE"); saveButton.addActionListener(this); - + rightButtonsPanel.add(openButton); rightButtonsPanel.add(saveButton); rightPanel.add(rightButtonsPanel, BorderLayout.SOUTH); @@ -335,7 +333,7 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { return; } int[] selected = listRes.getSelectedIndices(); - if (selected.length>0) { + if (selected.length > 0) { JFileChooser fc = new JFileChooser(); fc.setCurrentDirectory(new File(Configuration.getConfig("lastSaveDir", "."))); if (selected.length > 1) { @@ -362,14 +360,14 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { File file = Helper.fixDialogFile(fc.getSelectedFile()); try { if (selected.length == 1) { - ReReadableInputStream bis=foundIs.get(selected[0]); + ReReadableInputStream bis = foundIs.get(selected[0]); bis.setPos(0); Helper.saveStream(bis, file); } else { for (int sel : selected) { - ReReadableInputStream bis=foundIs.get(sel); + ReReadableInputStream bis = foundIs.get(sel); bis.setPos(0); - Helper.saveStream(bis, new File(file, "movie"+sel+".swf")); + Helper.saveStream(bis, new File(file, "movie" + sel + ".swf")); } } Configuration.setConfig("lastSaveDir", file.getParentFile().getAbsolutePath()); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/Main.java b/trunk/src/com/jpexs/decompiler/flash/gui/Main.java index 1f36a28f4..6c4ceee84 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/Main.java @@ -325,7 +325,7 @@ public class Main { } else { if (inputStream instanceof FileInputStream) { openFile(file); - } else if(inputStream instanceof ReReadableInputStream){ + } else if (inputStream instanceof ReReadableInputStream) { try { ((ReReadableInputStream) inputStream).setPos(0); } catch (IOException ex) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java index 0581e8534..0b25c4671 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java @@ -2794,9 +2794,9 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel } else { int bi = abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getBodyIndex(); if (bi != -1) { - abcPanel.abc.bodies[bi].restoreControlFlow(abcPanel.abc.constants); + abcPanel.abc.bodies[bi].restoreControlFlow(abcPanel.abc.constants, abcPanel.decompiledTextArea.getCurrentTrait(), abcPanel.abc.method_info[abcPanel.abc.bodies[bi].method_info]); } - abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc, abcPanel.decompiledTextArea.getCurrentTrait()); } Main.stopWork(); View.showMessageDialog(null, "Control flow restored"); @@ -2862,17 +2862,18 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel } } else { int bi = abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getBodyIndex(); + Trait t = abcPanel.decompiledTextArea.getCurrentTrait(); if (bi != -1) { if (deobfuscationDialog.codeProcessingLevel.getValue() == DeobfuscationDialog.LEVEL_REMOVE_DEAD_CODE) { - abcPanel.abc.bodies[bi].removeDeadCode(abcPanel.abc.constants); + abcPanel.abc.bodies[bi].removeDeadCode(abcPanel.abc.constants, t, abcPanel.abc.method_info[abcPanel.abc.bodies[bi].method_info]); } else if (deobfuscationDialog.codeProcessingLevel.getValue() == DeobfuscationDialog.LEVEL_REMOVE_TRAPS) { - abcPanel.abc.bodies[bi].removeTraps(abcPanel.abc.constants, abcPanel.abc, abcPanel.decompiledTextArea.getScriptLeaf().scriptIndex, abcPanel.decompiledTextArea.getClassIndex(), abcPanel.decompiledTextArea.getIsStatic(), ""/*FIXME*/); + abcPanel.abc.bodies[bi].removeTraps(abcPanel.abc.constants, abcPanel.abc, t, abcPanel.decompiledTextArea.getScriptLeaf().scriptIndex, abcPanel.decompiledTextArea.getClassIndex(), abcPanel.decompiledTextArea.getIsStatic(), ""/*FIXME*/); } else if (deobfuscationDialog.codeProcessingLevel.getValue() == DeobfuscationDialog.LEVEL_RESTORE_CONTROL_FLOW) { - abcPanel.abc.bodies[bi].removeTraps(abcPanel.abc.constants, abcPanel.abc, abcPanel.decompiledTextArea.getScriptLeaf().scriptIndex, abcPanel.decompiledTextArea.getClassIndex(), abcPanel.decompiledTextArea.getIsStatic(), ""/*FIXME*/); - abcPanel.abc.bodies[bi].restoreControlFlow(abcPanel.abc.constants); + abcPanel.abc.bodies[bi].removeTraps(abcPanel.abc.constants, abcPanel.abc, t, abcPanel.decompiledTextArea.getScriptLeaf().scriptIndex, abcPanel.decompiledTextArea.getClassIndex(), abcPanel.decompiledTextArea.getIsStatic(), ""/*FIXME*/); + abcPanel.abc.bodies[bi].restoreControlFlow(abcPanel.abc.constants, t, abcPanel.abc.method_info[abcPanel.abc.bodies[bi].method_info]); } } - abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc, t); } } catch (Exception ex) { Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, "Deobfuscation error", ex); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java index 1185d3de2..ac4d764b3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java @@ -66,7 +66,7 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public void run() { buffering.setVisible(true); - SWF.framesToImage(0, frameImages, 0, swf.frameCount-1, swf.tags, swf.tags, swf.displayRect, swf.frameCount, new Stack()); + SWF.framesToImage(0, frameImages, 0, swf.frameCount - 1, swf.tags, swf.tags, swf.displayRect, swf.frameCount, new Stack()); buffering.setVisible(false); } }.start(); @@ -104,8 +104,8 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { } }, 0, 1000 / swf.frameRate); } - - private void drawFrame(){ + + private void drawFrame() { pan.setImage(frameImages.get(frame - 1)); } @@ -116,7 +116,7 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public int getTotalFrames() { - if(swf==null){ + if (swf == null) { return 0; } return swf.frameCount; @@ -124,10 +124,10 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public void pause() { - if(timer!=null){ + if (timer != null) { timer.cancel(); timer = null; - } + } } @Override @@ -138,7 +138,7 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public boolean isPlaying() { - return timer!=null; + return timer != null; } @Override @@ -149,7 +149,7 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public int getFrameRate() { - if(swf==null){ + if (swf == null) { return 1; } return swf.frameRate; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 1139352fb..f6abe42a5 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -462,7 +462,7 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Fr switchAbc(listIndex); decompiledTextArea.clearScriptCache(); decompiledTextArea.reloadClass(); - detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(-1, abc); + detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(-1, abc, decompiledTextArea.getCurrentTrait()); } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java index a2aee303a..305694be1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java @@ -21,7 +21,9 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.graph.AVM2Graph; import com.jpexs.decompiler.flash.abc.avm2.parser.ASM3Parser; +import com.jpexs.decompiler.flash.abc.avm2.parser.MissingSymbolHandler; import com.jpexs.decompiler.flash.abc.avm2.parser.ParseException; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.gui.GraphFrame; import com.jpexs.decompiler.flash.gui.View; import com.jpexs.decompiler.flash.helpers.Highlighting; @@ -47,6 +49,7 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi private String textWithHex = ""; private String textNoHex = ""; private boolean hex = false; + private Trait trait; public boolean isHex() { return hex; @@ -102,14 +105,15 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi return super.getName(); } - public void setBodyIndex(int bodyIndex, ABC abc, String name) { + public void setBodyIndex(int bodyIndex, ABC abc, String name, Trait trait) { this.bodyIndex = bodyIndex; this.abc = abc; this.name = name; + this.trait = trait; if (bodyIndex == -1) { return; } - String textWithHexTags = abc.bodies[bodyIndex].code.toASMSource(abc.constants, abc.bodies[bodyIndex], true, true); + String textWithHexTags = abc.bodies[bodyIndex].code.toASMSource(abc.constants, trait, abc.method_info[abc.bodies[bodyIndex].method_info], abc.bodies[bodyIndex], true, true); textWithHex = Helper.hexToComments(textWithHexTags); textNoHex = Helper.stripComments(textWithHexTags); setText(hex ? textWithHex : textNoHex); @@ -130,7 +134,28 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi public boolean save(ConstantPool constants) { try { - AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(getText().getBytes("UTF-8")), constants, new DialogMissingSymbolHandler(), abc.bodies[bodyIndex]); + AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(getText().getBytes("UTF-8")), constants, trait, new MissingSymbolHandler() { + //no longer ask for adding new constants + @Override + public boolean missingString(String value) { + return true; + } + + @Override + public boolean missingInt(long value) { + return true; + } + + @Override + public boolean missingUInt(long value) { + return true; + } + + @Override + public boolean missingDouble(double value) { + return true; + } + }, abc.bodies[bodyIndex], abc.method_info[abc.bodies[bodyIndex].method_info]); acode.getBytes(abc.bodies[bodyIndex].codeBytes); abc.bodies[bodyIndex].code = acode; } catch (IOException ex) { @@ -147,6 +172,7 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi disassembledHilights = Highlighting.getInstrHighlights(t); t = Highlighting.stripHilights(t); super.setText(t); + setCaretPosition(0); } public void selectInstruction(int pos) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index 0f3c5f236..453266b31 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -23,6 +23,8 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; 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.TraitFunction; +import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import com.jpexs.decompiler.flash.gui.View; @@ -53,6 +55,11 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL private int classIndex = -1; private boolean isStatic = false; private Cache cache = Cache.getInstance(true); + private Trait currentTrait = null; + + public Trait getCurrentTrait() { + return currentTrait; + } public ScriptPack getScriptLeaf() { return script; @@ -103,11 +110,22 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL public void run() { } }); + //fix for inner functions: + if (trait instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) trait; + if (tm.method_info != methodIndex) { + trait = null; + } + } + if (trait instanceof TraitFunction) { + TraitFunction tf = (TraitFunction) trait; + if (tf.method_info != methodIndex) { + trait = null; + } + } abcPanel.detailPanel.showCard(DetailPanel.METHOD_TRAIT_CARD, trait); if (reset || (abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getBodyIndex() != bi)) { - abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abc, name); - abcPanel.detailPanel.methodTraitPanel.methodBodyParamsPanel.loadFromBody(abc.bodies[bi]); - abcPanel.detailPanel.methodTraitPanel.methodInfoPanel.load(abc.bodies[bi].method_info, abc); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abc, name, trait); abcPanel.detailPanel.setEditMode(false); this.isStatic = isStatic; } @@ -205,21 +223,21 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL name = abc.instance_info[classIndex].getName(abc.constants).getNameWithNamespace(abc.constants); } } - Trait t = null; + currentTrait = null; for (Highlighting th : traitHighlights) { if ((pos >= th.startPos) && (pos < th.startPos + th.len)) { lastTraitIndex = (int) th.offset; if ((abc != null) && (classIndex != -1)) { - t = abc.findTraitByTraitId(classIndex, lastTraitIndex); + currentTrait = abc.findTraitByTraitId(classIndex, lastTraitIndex); isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); - if (t != null) { - name += ":" + t.getName(abc).getName(abc.constants, new ArrayList()); + if (currentTrait != null) { + name += ":" + currentTrait.getName(abc).getName(abc.constants, new ArrayList()); } } } } - displayMethod(pos, (int) tm.offset, name, t, isStatic); + displayMethod(pos, (int) tm.offset, name, currentTrait, isStatic); currentMethodHighlight = tm; @@ -231,32 +249,33 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL setNoTrait(); return; } + currentTrait = null; for (Highlighting th : traitHighlights) { if ((pos >= th.startPos) && (pos < th.startPos + th.len)) { lastTraitIndex = (int) th.offset; - Trait tr = abc.findTraitByTraitId(classIndex, (int) th.offset); - if (tr != null) { - if (tr instanceof TraitSlotConst) { - abcPanel.detailPanel.slotConstTraitPanel.load((TraitSlotConst) tr, abc, + currentTrait = abc.findTraitByTraitId(classIndex, (int) th.offset); + if (currentTrait != null) { + if (currentTrait instanceof TraitSlotConst) { + abcPanel.detailPanel.slotConstTraitPanel.load((TraitSlotConst) currentTrait, abc, abc.isStaticTraitId(classIndex, lastTraitIndex)); - abcPanel.detailPanel.showCard(DetailPanel.SLOT_CONST_TRAIT_CARD, tr); + abcPanel.detailPanel.showCard(DetailPanel.SLOT_CONST_TRAIT_CARD, currentTrait); abcPanel.detailPanel.setEditMode(false); return; } } currentMethodHighlight = th; String name = ""; - Trait t = null; + currentTrait = null; if (abc != null) { name = abc.instance_info[classIndex].getName(abc.constants).getNameWithNamespace(abc.constants); - t = abc.findTraitByTraitId(classIndex, lastTraitIndex); + currentTrait = abc.findTraitByTraitId(classIndex, lastTraitIndex); isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); - if (t != null) { - name += ":" + t.getName(abc).getName(abc.constants, new ArrayList()); + if (currentTrait != null) { + name += ":" + currentTrait.getName(abc).getName(abc.constants, new ArrayList()); } } - displayMethod(pos, abc.findMethodIdByTraitId(classIndex, (int) th.offset), name, t, isStatic); + displayMethod(pos, abc.findMethodIdByTraitId(classIndex, (int) th.offset), name, currentTrait, isStatic); return; } } @@ -391,7 +410,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL View.execInEventDispatch(new Runnable() { @Override public void run() { - if (hilightedCode.length() > 1000000) { + if (hilightedCode.length() > 1024 * 1024 * 2/*2MB*/) { setContentType("text/plain"); } else { setContentType("text/actionscript"); @@ -421,4 +440,10 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL cache.clear(); setText(""); } + + @Override + public void setText(String t) { + super.setText(t); + setCaretPosition(0); + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java index 3551ec974..bf0580db1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java @@ -20,7 +20,6 @@ import com.jpexs.decompiler.flash.abc.types.traits.Trait; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import com.jpexs.decompiler.flash.gui.HeaderLabel; import com.jpexs.decompiler.flash.gui.View; -import com.jpexs.helpers.Helper; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.FlowLayout; @@ -54,7 +53,7 @@ public class DetailPanel extends JPanel implements ActionListener { private boolean editMode = false; private JPanel buttonsPanel; private ABCPanel abcPanel; - private JLabel traitNameLabel; + private JTextArea traitNameLabel; public DetailPanel(ABCPanel abcPanel) { this.abcPanel = abcPanel; @@ -106,7 +105,7 @@ public class DetailPanel extends JPanel implements ActionListener { selectedLabel.setHorizontalAlignment(SwingConstants.CENTER); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.add(selectedLabel, BorderLayout.NORTH); - traitNameLabel = new JLabel(""); + traitNameLabel = new JTextArea(""); JPanel traitInfoPanel = new JPanel(); traitInfoPanel.setLayout(new BoxLayout(traitInfoPanel, BoxLayout.LINE_AXIS)); traitInfoPanel.add(new JLabel(" " + translate("abc.detail.traitname"))); @@ -156,7 +155,7 @@ public class DetailPanel extends JPanel implements ActionListener { if (trait == null) { traitNameLabel.setText("-"); } else { - traitNameLabel.setText(" m[" + trait.name_index + "]\"" + Helper.escapeString(trait.getName(abcPanel.abc).toString(abcPanel.abc.constants, new ArrayList())) + "\""); + traitNameLabel.setText(" " + trait.getName(abcPanel.abc).getName(abcPanel.abc.constants, new ArrayList()) + " Index: " + trait.name_index); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodBodyParamsPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodBodyParamsPanel.java deleted file mode 100644 index ca096d6f7..000000000 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodBodyParamsPanel.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2011-2013 JPEXS - * - * 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 3 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, see . - */ -package com.jpexs.decompiler.flash.gui.abc; - -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import static com.jpexs.decompiler.flash.gui.AppStrings.translate; -import com.jpexs.decompiler.flash.gui.MyFormattedTextField; -import com.jpexs.decompiler.flash.gui.View; -import java.awt.Color; -import java.awt.Dimension; -import java.text.NumberFormat; -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -/** - * - * @author JPEXS - */ -public class MethodBodyParamsPanel extends JPanel implements ChangeListener { - - public JLabel maxStackLabel; - public JFormattedTextField maxStackField; - public JLabel localCountLabel; - public JFormattedTextField localCountField; - public JLabel initScopeDepthLabel; - public JFormattedTextField initScopeDepthField; - public JLabel maxScopeDepthLabel; - public JFormattedTextField maxScopeDepthField; - public MethodBody body; - public JCheckBox autoFillCheckBox = new JCheckBox(translate("abc.detail.body.params.autofill")); - public JLabel experimentalLabel = new JLabel(translate("abc.detail.body.params.autofill.experimental")); - private ABCPanel abcPanel; - - public MethodBodyParamsPanel(ABCPanel abcPanel) { - setLayout(null); - this.abcPanel = abcPanel; - - JComponent[][] cmps = new JComponent[][]{ - {maxStackLabel = new JLabel(translate("abc.detail.body.params.maxstack"), SwingConstants.RIGHT), maxStackField = new MyFormattedTextField(NumberFormat.getNumberInstance())}, - {localCountLabel = new JLabel(translate("abc.detail.body.params.localregcount"), SwingConstants.RIGHT), localCountField = new MyFormattedTextField(NumberFormat.getNumberInstance())}, - {initScopeDepthLabel = new JLabel(translate("abc.detail.body.params.minscope"), SwingConstants.RIGHT), initScopeDepthField = new MyFormattedTextField(NumberFormat.getNumberInstance())}, - {maxScopeDepthLabel = new JLabel(translate("abc.detail.body.params.maxscope"), SwingConstants.RIGHT), maxScopeDepthField = new MyFormattedTextField(NumberFormat.getNumberInstance())} - }; - - - int maxw = 0; - for (int i = 0; i < cmps.length; i++) { - Dimension d = cmps[i][0].getPreferredSize(); - if (d.width > maxw) { - maxw = d.width; - } - } - - int top = 0; - for (int i = 0; i < cmps.length; i++) { - - cmps[i][0].setBounds(10, top, maxw, cmps[i][1].getPreferredSize().height); - cmps[i][1].setBounds(10 + maxw + 10, top, 75, cmps[i][1].getPreferredSize().height); - add(cmps[i][0]); - add(cmps[i][1]); - top += cmps[i][1].getPreferredSize().height; - } - - add(autoFillCheckBox); - autoFillCheckBox.addChangeListener(this); - - experimentalLabel.setForeground(Color.red); - - autoFillCheckBox.setLocation(0, top); - autoFillCheckBox.setSize(autoFillCheckBox.getPreferredSize()); - experimentalLabel.setLocation(20 + autoFillCheckBox.getWidth(), top); - experimentalLabel.setSize(experimentalLabel.getPreferredSize()); - add(experimentalLabel); - - setPreferredSize(new Dimension(300, 150)); - } - - public void loadFromBody(MethodBody body) { - this.body = body; - if (body == null) { - maxStackField.setText("0"); - localCountField.setText("0"); - initScopeDepthField.setText("0"); - maxScopeDepthField.setText("0"); - return; - } - maxStackField.setText("" + body.max_stack); - localCountField.setText("" + body.max_regs); - initScopeDepthField.setText("" + body.init_scope_depth); - maxScopeDepthField.setText("" + body.max_scope_depth); - } - - public boolean save() { - if (body != null) { - body.init_scope_depth = Integer.parseInt(initScopeDepthField.getText()); - if (!autoFillCheckBox.isSelected()) { - body.max_stack = Integer.parseInt(maxStackField.getText()); - body.max_regs = Integer.parseInt(localCountField.getText()); - body.max_scope_depth = Integer.parseInt(maxScopeDepthField.getText()); - } else { - if (!body.autoFillStats(abcPanel.abc)) { - View.showMessageDialog(null, translate("message.autofill.failed"), translate("message.warning"), JOptionPane.WARNING_MESSAGE); - } - } - return true; - } - return false; - } - - @Override - public void stateChanged(ChangeEvent e) { - if (e.getSource() == autoFillCheckBox) { - if (autoFillCheckBox.isSelected()) { - localCountField.setEnabled(false); - maxScopeDepthField.setEnabled(false); - maxStackField.setEnabled(false); - } else { - localCountField.setEnabled(true); - maxScopeDepthField.setEnabled(true); - maxStackField.setEnabled(true); - } - } - } - - public void setEditMode(boolean val) { - maxStackField.setEditable(val); - localCountField.setEditable(val); - initScopeDepthField.setEditable(val); - maxScopeDepthField.setEditable(val); - autoFillCheckBox.setEnabled(val); - } -} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java index bd252b1da..de8068f9d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.gui.abc; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import com.jpexs.decompiler.flash.gui.Main; import com.jpexs.decompiler.flash.gui.View; @@ -58,12 +59,12 @@ public class MethodCodePanel extends JPanel implements ActionListener { sourceTextArea.hilighOffset(offset); } - public void setBodyIndex(int bodyIndex, ABC abc) { - sourceTextArea.setBodyIndex(bodyIndex, abc, sourceTextArea.getName()); + public void setBodyIndex(int bodyIndex, ABC abc, Trait trait) { + sourceTextArea.setBodyIndex(bodyIndex, abc, sourceTextArea.getName(), trait); } - public void setBodyIndex(int bodyIndex, ABC abc, String name) { - sourceTextArea.setBodyIndex(bodyIndex, abc, name); + public void setBodyIndex(int bodyIndex, ABC abc, String name, Trait trait) { + sourceTextArea.setBodyIndex(bodyIndex, abc, name, trait); } public int getBodyIndex() { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodInfoPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodInfoPanel.java deleted file mode 100644 index 572bba144..000000000 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodInfoPanel.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2011-2013 JPEXS - * - * 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 3 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, see . - */ -package com.jpexs.decompiler.flash.gui.abc; - -import com.jpexs.decompiler.flash.Configuration; -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.methodinfo_parser.MethodInfoParser; -import com.jpexs.decompiler.flash.abc.methodinfo_parser.ParseException; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import static com.jpexs.decompiler.flash.gui.AppStrings.translate; -import com.jpexs.decompiler.flash.gui.View; -import com.jpexs.helpers.Helper; -import java.awt.Dimension; -import java.awt.Font; -import java.util.ArrayList; -import javax.swing.*; -import jsyntaxpane.syntaxkits.Flasm3MethodInfoSyntaxKit; - -/** - * - * @author JPEXS - */ -public class MethodInfoPanel extends JPanel { - - public LineMarkedEditorPane paramEditor; - public JEditorPane returnTypeEditor; - private MethodInfo methodInfo; - private ABC abc; - private JLabel methodIndexLabel; - - public MethodInfoPanel() { - returnTypeEditor = new UndoFixedEditorPane(); - paramEditor = new LineMarkedEditorPane(); - setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); - JPanel miPanel = new JPanel(); - miPanel.setLayout(new BoxLayout(miPanel, BoxLayout.LINE_AXIS)); - miPanel.add(new JLabel(translate("abc.detail.methodinfo.methodindex"))); - methodIndexLabel = new JLabel(" "); - miPanel.add(methodIndexLabel); - add(miPanel); - add(new JLabel(translate("abc.detail.methodinfo.parameters"))); - add(new JScrollPane(paramEditor)); - add(new JLabel(translate("abc.detail.methodinfo.returnvalue"))); - JScrollPane jsp = new JScrollPane(returnTypeEditor); - add(jsp); - paramEditor.setContentType("text/flasm3_methodinfo"); - returnTypeEditor.setContentType("text/flasm3_methodinfo"); - paramEditor.setFont(new Font("Monospaced", Font.PLAIN, paramEditor.getFont().getSize())); - returnTypeEditor.setFont(new Font("Monospaced", Font.PLAIN, returnTypeEditor.getFont().getSize())); - - jsp.setMaximumSize(new Dimension(1024, 25)); - Flasm3MethodInfoSyntaxKit sk = (Flasm3MethodInfoSyntaxKit) returnTypeEditor.getEditorKit(); - sk.deinstallComponent(returnTypeEditor, "jsyntaxpane.components.LineNumbersRuler"); - } - - public void load(int methodInfoIndex, ABC abc) { - this.abc = abc; - if (methodInfoIndex <= 0) { - paramEditor.setText(""); - } - - methodIndexLabel.setText("" + methodInfoIndex); - this.methodInfo = abc.method_info[methodInfoIndex]; - int p = 0; - String ret = ""; - int optParPos = 0; - if (methodInfo.flagHas_optional()) { - optParPos = methodInfo.param_types.length - methodInfo.optional.length; - } - for (int ptype : methodInfo.param_types) { - if (p > 0) { - ret += ",\n"; - } - if (methodInfo.flagHas_paramnames() && Configuration.PARAM_NAMES_ENABLE) { - ret = ret + abc.constants.constant_string[methodInfo.paramNames[p]]; - } else { - ret = ret + "param" + (p + 1); - } - ret += ":"; - if (ptype == 0) { - ret += "*"; - } else { - ret += "m[" + ptype + "]\"" + Helper.escapeString(abc.constants.constant_multiname[ptype].toString(abc.constants, new ArrayList())) + "\""; - } - if (methodInfo.flagHas_optional()) { - if (p >= optParPos) { - ret += "=" + methodInfo.optional[p - optParPos].toString(abc.constants); - } - } - p++; - } - if (methodInfo.flagNeed_rest()) { - if (p > 0) { - ret += ",\n"; - } - ret += "... rest"; - } - paramEditor.setText(ret); - if (methodInfo.ret_type == 0) { - returnTypeEditor.setText("*"); - } else { - returnTypeEditor.setText("m[" + methodInfo.ret_type + "]\"" + Helper.escapeString(abc.constants.constant_multiname[methodInfo.ret_type].toString(abc.constants, new ArrayList())) + "\""); - } - } - - public boolean save() { - try { - MethodInfoParser.parseParams(paramEditor.getText(), methodInfo, abc); - } catch (ParseException ex) { - View.showMessageDialog(paramEditor, ex.text, translate("error.methodinfo.params"), JOptionPane.ERROR_MESSAGE); - return false; - } - try { - MethodInfoParser.parseReturnType(returnTypeEditor.getText(), methodInfo); - } catch (ParseException ex) { - View.showMessageDialog(returnTypeEditor, ex.text, translate("error.methodinfo.returnvalue"), JOptionPane.ERROR_MESSAGE); - return false; - } - return true; - } - - public void setEditMode(boolean val) { - returnTypeEditor.setEditable(val); - paramEditor.setEditable(val); - } -} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodTraitDetailPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodTraitDetailPanel.java index 763928a18..80c47786e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodTraitDetailPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodTraitDetailPanel.java @@ -16,43 +16,30 @@ */ package com.jpexs.decompiler.flash.gui.abc; -import static com.jpexs.decompiler.flash.gui.AppStrings.translate; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; +import java.awt.BorderLayout; +import javax.swing.JPanel; /** * * @author JPEXS */ -public class MethodTraitDetailPanel extends JTabbedPane implements TraitDetail { +public class MethodTraitDetailPanel extends JPanel implements TraitDetail { public MethodCodePanel methodCodePanel; - public MethodBodyParamsPanel methodBodyParamsPanel; - public MethodInfoPanel methodInfoPanel; public ABCPanel abcPanel; public MethodTraitDetailPanel(ABCPanel abcPanel) { this.abcPanel = abcPanel; methodCodePanel = new MethodCodePanel(abcPanel.decompiledTextArea); - methodBodyParamsPanel = new MethodBodyParamsPanel(abcPanel); - methodInfoPanel = new MethodInfoPanel(); - addTab(translate("abc.detail.methodinfo"), methodInfoPanel); - addTab(translate("abc.detail.body.code"), methodCodePanel); - addTab(translate("abc.detail.body.params"), new JScrollPane(methodBodyParamsPanel)); - setSelectedIndex(1); + setLayout(new BorderLayout()); + add(methodCodePanel, BorderLayout.CENTER); } @Override public boolean save() { - if (!methodInfoPanel.save()) { - return false; - } if (!methodCodePanel.save(abcPanel.abc.constants)) { return false; } - if (!methodBodyParamsPanel.save()) { - return false; - } return true; } @@ -60,8 +47,6 @@ public class MethodTraitDetailPanel extends JTabbedPane implements TraitDetail { @Override public void setEditMode(boolean val) { methodCodePanel.setEditMode(val); - methodBodyParamsPanel.setEditMode(val); - methodInfoPanel.setEditMode(val); } private boolean active = false; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/SlotConstTraitDetailPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/SlotConstTraitDetailPanel.java index 082736560..9a317cb15 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/SlotConstTraitDetailPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/SlotConstTraitDetailPanel.java @@ -17,17 +17,19 @@ package com.jpexs.decompiler.flash.gui.abc; import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.methodinfo_parser.MethodInfoParser; -import com.jpexs.decompiler.flash.abc.methodinfo_parser.ParseException; +import com.jpexs.decompiler.flash.abc.avm2.parser.ASM3Parser; +import com.jpexs.decompiler.flash.abc.avm2.parser.ParseException; import com.jpexs.decompiler.flash.abc.types.ValueKind; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import com.jpexs.decompiler.flash.gui.View; -import com.jpexs.helpers.Helper; import java.awt.BorderLayout; -import java.util.ArrayList; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.*; -import jsyntaxpane.syntaxkits.Flasm3MethodInfoSyntaxKit; /** * @@ -41,7 +43,7 @@ public class SlotConstTraitDetailPanel extends JPanel implements TraitDetail { private boolean showWarning = false; public SlotConstTraitDetailPanel() { - slotConstEditor = new UndoFixedEditorPane(); + slotConstEditor = new LineMarkedEditorPane(); setLayout(new BorderLayout()); add(new JLabel(translate("abc.detail.slotconst.typevalue")), BorderLayout.NORTH); add(new JScrollPane(slotConstEditor), BorderLayout.CENTER); @@ -55,27 +57,30 @@ public class SlotConstTraitDetailPanel extends JPanel implements TraitDetail { //warnLabel.setLineWrap(true); warnLabel.setFont(new JLabel().getFont().deriveFont(Font.BOLD)); add(warnLabel, BorderLayout.SOUTH);*/ - slotConstEditor.setContentType("text/flasm3_methodinfo"); - Flasm3MethodInfoSyntaxKit sk = (Flasm3MethodInfoSyntaxKit) slotConstEditor.getEditorKit(); - sk.deinstallComponent(slotConstEditor, "jsyntaxpane.components.LineNumbersRuler"); + slotConstEditor.setContentType("text/flasm3"); + //Flasm3SyntaxKit sk = (Flasm3SyntaxKit) slotConstEditor.getEditorKit(); + //sk.deinstallComponent(slotConstEditor, "jsyntaxpane.components.LineNumbersRuler"); } public void load(TraitSlotConst trait, ABC abc, boolean isStatic) { this.abc = abc; this.trait = trait; - String s; - String typeStr; - if (trait.type_index > 0) { - typeStr = "m[" + trait.type_index + "]\"" + Helper.escapeString(abc.constants.constant_multiname[trait.type_index].toString(abc.constants, new ArrayList())) + "\""; - } else { - typeStr = "*"; - } - String valueStr = ""; - if (trait.value_kind != 0) { - valueStr = " = " + (new ValueKind(trait.value_index, trait.value_kind)).toString(abc.constants); - } + /*String s; + String typeStr; + if (trait.type_index > 0) { + typeStr = "m[" + trait.type_index + "]\"" + Helper.escapeString(abc.constants.constant_multiname[trait.type_index].toString(abc.constants, new ArrayList())) + "\""; + } else { + typeStr = "*"; + } + String valueStr = ""; + if (trait.value_kind != 0) { + valueStr = " = " + (new ValueKind(trait.value_index, trait.value_kind)).toString(abc.constants); + } - s = typeStr + valueStr; + s = typeStr + valueStr; + + * */ + String s = "trait " + abc.constants.multinameToString(trait.name_index) + " " + (trait.isConst() ? "const" : "slot") + " slotid " + trait.slot_id + " type " + abc.constants.multinameToString(trait.type_index) + " value " + (new ValueKind(trait.value_index, trait.value_kind).toASMString(abc.constants)); showWarning = trait.isConst() || isStatic; //warnLabel.setVisible(trait.isConst() || isStatic); @@ -84,13 +89,19 @@ public class SlotConstTraitDetailPanel extends JPanel implements TraitDetail { @Override public boolean save() { - try { - if (!MethodInfoParser.parseSlotConst(slotConstEditor.getText(), trait, abc)) { + try {//(slotConstEditor.getText(), trait, abc) + if (!ASM3Parser.parseSlotConst(new ByteArrayInputStream(slotConstEditor.getText().getBytes("UTF-8")), abc.constants, trait)) { return false; } } catch (ParseException ex) { View.showMessageDialog(slotConstEditor, ex.text, translate("error.slotconst.typevalue"), JOptionPane.ERROR_MESSAGE); return false; + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(SlotConstTraitDetailPanel.class.getName()).log(Level.SEVERE, null, ex); + return false; + } catch (IOException ex) { + Logger.getLogger(SlotConstTraitDetailPanel.class.getName()).log(Level.SEVERE, null, ex); + return false; } return true; } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index 1c096396c..a8af56045 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -565,7 +565,7 @@ public class ActionPanel extends JPanel implements ActionListener { public void setEditMode(boolean val) { // todo: create UI for editing raw data final boolean rawEdit = false; - + if (val) { setText(rawEdit ? srcHexOnly : srcNoHex); editor.setEditable(true); @@ -667,8 +667,7 @@ public class ActionPanel extends JPanel implements ActionListener { String text = editor.getText(); if (text.trim().startsWith("#hexdata")) { src.setActionBytes(getBytesFromHexaText(text)); - } - else { + } else { src.setActions(ASMParser.parse(0, src.getPos(), true, text, SWF.DEFAULT_VERSION, false), SWF.DEFAULT_VERSION); } setSource(this.src, false); @@ -714,7 +713,7 @@ public class ActionPanel extends JPanel implements ActionListener { line = line.replace(" ", ""); for (int i = 0; i < line.length() / 2; i++) { String hexStr = line.substring(i * 2, (i + 1) * 2); - byte b = (byte)Integer.parseInt(hexStr, 16); + byte b = (byte) Integer.parseInt(hexStr, 16); baos.write(b); } } @@ -728,15 +727,15 @@ public class ActionPanel extends JPanel implements ActionListener { result.append("#hexdata").append(nl); /* // hex data from decompiled actions - Scanner scanner = new Scanner(srcWithHex); - while (scanner.hasNextLine()) { - String line = scanner.nextLine().trim(); - if (line.startsWith(";")) { - result.append(line.substring(1).trim()).append(nl); - } else { - result.append(";").append(line).append(nl); - } - }*/ + Scanner scanner = new Scanner(srcWithHex); + while (scanner.hasNextLine()) { + String line = scanner.nextLine().trim(); + if (line.startsWith(";")) { + result.append(line.substring(1).trim()).append(nl); + } else { + result.append(";").append(line).append(nl); + } + }*/ byte[] data = src.getActionBytes(); for (int i = 0; i < data.length; i++) { @@ -745,10 +744,10 @@ public class ActionPanel extends JPanel implements ActionListener { } result.append(String.format("%02x ", data[i])); } - + return result.toString(); } - + public void updateSearchPos() { searchPos.setText((foundPos + 1) + "/" + found.size()); setSource(found.get(foundPos), true); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties index b37bbf2a1..4beb23f05 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties +++ b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties @@ -91,7 +91,7 @@ message.confirm = Potvrzen\u00ed message.confirm.autodeobfuscate = Automatick\u00e1 deobfuskace je zp\u016fsob jak dekompilovat obfuskovan\u00fd k\u00f3d.\r\nDeobfuskace vede k pomalej\u0161\u00ed dekompilaci a n\u011bkter\u00fd nepou\u017eit\u00fd k\u00f3d m\u016f\u017ee b\u00fdt odstran\u011bn.\r\nPokud k\u00f3d nen\u00ed obfuskovan\u00fd, je lep\u0161\u00ed autodeobfuskaci vypnout. message.parallel = parallelismus -message.trait.saved = Vlastnost \u00fasp\u011b\u0161ne ulo\u017eena +message.trait.saved = Vlastnost \u00fasp\u011b\u0161n\u011b ulo\u017eena message.constant.new.string = \u0158et\u011bzec "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java index 49ac0c868..7d3673d58 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java @@ -53,31 +53,31 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { private int frameRate; public boolean functionPlayback = false; - public synchronized String call(String callString){ + public synchronized String call(String callString) { if (pipe != null) { IntByReference ibr = new IntByReference(); Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_CALL}, 1, ibr, null); - int callLen=callString.getBytes().length; - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte)((callLen>>8) &0xff),(byte)(callLen & 0xff)}, 2, ibr, null); + int callLen = callString.getBytes().length; + Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) ((callLen >> 8) & 0xff), (byte) (callLen & 0xff)}, 2, ibr, null); Kernel32.INSTANCE.WriteFile(pipe, callString.getBytes(), callLen, ibr, null); - + byte res[] = new byte[2]; if (Kernel32.INSTANCE.ReadFile(pipe, res, 2, ibr, null)) { int retLen = ((res[0] & 0xff) << 8) + (res[1] & 0xff); res = new byte[retLen]; if (Kernel32.INSTANCE.ReadFile(pipe, res, retLen, ibr, null)) { - String ret=new String(res,0,retLen); + String ret = new String(res, 0, retLen); return ret; - }else{ + } else { return null; } } else { return null; - } + } } return null; } - + private synchronized void resize() { if (pipe != null) { IntByReference ibr = new IntByReference(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java index caac1b1ea..7e9e362ca 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java @@ -49,7 +49,7 @@ public class PlayerControls extends JPanel implements ActionListener { private JLabel timeLabel; private JLabel totalTimeLabel; private static final Icon pauseIcon = View.getIcon("pause16"); - private static final Icon playIcon = View.getIcon("play16"); + private static final Icon playIcon = View.getIcon("play16"); public PlayerControls(final FlashDisplay display) { this.display = display; @@ -81,7 +81,7 @@ public class PlayerControls extends JPanel implements ActionListener { progress.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { - int frame = 1+(int)Math.floor(e.getX() * display.getTotalFrames() / (double)progress.getWidth()); + int frame = 1 + (int) Math.floor(e.getX() * display.getTotalFrames() / (double) progress.getWidth()); boolean p = paused; display.gotoFrame(frame); if (!p) { diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLossless2Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLossless2Tag.java index d3d16b0ae..5c2af0c99 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLossless2Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLossless2Tag.java @@ -25,7 +25,6 @@ import com.jpexs.decompiler.flash.types.ALPHABITMAPDATA; import com.jpexs.decompiler.flash.types.ALPHACOLORMAPDATA; import com.jpexs.decompiler.flash.types.ARGB; import java.awt.Color; -import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -186,7 +185,7 @@ public class DefineBitsLossless2Tag extends ImageTag implements AloneTag { } if ((bitmapFormat == DefineBitsLossless2Tag.FORMAT_32BIT_ARGB)) { c = (multiplyAlpha(bitmapData.bitmapPixelData[pos].toColor())); - } + } bi.setRGB(x, y, c.getRGB()); pos32aligned++; pos++; diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLosslessTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLosslessTag.java index 9ccf26abd..837548d06 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLosslessTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLosslessTag.java @@ -26,7 +26,6 @@ import com.jpexs.decompiler.flash.types.COLORMAPDATA; import com.jpexs.decompiler.flash.types.PIX24; import com.jpexs.decompiler.flash.types.RGB; import java.awt.Color; -import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java b/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java index 609fe7ccd..038dfece1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java @@ -22,5 +22,4 @@ package com.jpexs.decompiler.flash.tags.base; * @author JPEXS */ public interface ContainerItem { - } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/MORPHGRADIENT.java b/trunk/src/com/jpexs/decompiler/flash/types/MORPHGRADIENT.java index 2a1fa90be..f5c1761f6 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/MORPHGRADIENT.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/MORPHGRADIENT.java @@ -29,7 +29,7 @@ public class MORPHGRADIENT { /** * Interpolation mode. See GRADIENT.INTERPOLATION_* constants */ - public int interPolationMode; + public int interPolationMode; public int numGradients; public MORPHGRADRECORD[] gradientRecords; diff --git a/trunk/src/com/jpexs/decompiler/graph/Graph.java b/trunk/src/com/jpexs/decompiler/graph/Graph.java index d77fcad41..bc6955c3f 100644 --- a/trunk/src/com/jpexs/decompiler/graph/Graph.java +++ b/trunk/src/com/jpexs/decompiler/graph/Graph.java @@ -2228,7 +2228,7 @@ public class Graph { continue; } strippedP = Highlighting.stripHilights(parts[p]).trim(); - + if (replaceIndents) { if (strippedP.equals(INDENTOPEN)) { level++; diff --git a/trunk/src/com/jpexs/decompiler/graph/model/BlockItem.java b/trunk/src/com/jpexs/decompiler/graph/model/BlockItem.java index 410f30284..1f7e58877 100644 --- a/trunk/src/com/jpexs/decompiler/graph/model/BlockItem.java +++ b/trunk/src/com/jpexs/decompiler/graph/model/BlockItem.java @@ -37,9 +37,9 @@ public class BlockItem extends GraphTargetItem { @Override public String toString(boolean highlight, List localData) { - return hilight("{", highlight) + "\r\n" + Graph.INDENTOPEN + "\r\n" + - Graph.graphToString(commands, highlight, false, localData) + "\r\n" + - Graph.INDENTCLOSE + "\r\n" + hilight("}", highlight); + return hilight("{", highlight) + "\r\n" + Graph.INDENTOPEN + "\r\n" + + Graph.graphToString(commands, highlight, false, localData) + "\r\n" + + Graph.INDENTCLOSE + "\r\n" + hilight("}", highlight); } @Override diff --git a/trunk/src/com/jpexs/helpers/Helper.java b/trunk/src/com/jpexs/helpers/Helper.java index 4e76481c6..1e921f578 100644 --- a/trunk/src/com/jpexs/helpers/Helper.java +++ b/trunk/src/com/jpexs/helpers/Helper.java @@ -552,7 +552,7 @@ public class Helper { THREAD_POOL.execute(task); return task.get(timeout, timeUnit); } - + public static boolean contains(int[] array, int value) { for (int i : array) { if (i == value) { @@ -561,15 +561,15 @@ public class Helper { } return false; } - - public static void saveStream(InputStream is,File output) throws IOException { - byte[] buf=new byte[1024]; + + public static void saveStream(InputStream is, File output) throws IOException { + byte[] buf = new byte[1024]; int cnt; try (FileOutputStream fos = new FileOutputStream(output)) { - while((cnt=is.read(buf))>0){ - fos.write(buf,0,cnt); + while ((cnt = is.read(buf)) > 0) { + fos.write(buf, 0, cnt); fos.flush(); - } + } } } } diff --git a/trunk/src/com/jpexs/helpers/LimitedInputStream.java b/trunk/src/com/jpexs/helpers/LimitedInputStream.java index d6c82f468..f5ffaa7eb 100644 --- a/trunk/src/com/jpexs/helpers/LimitedInputStream.java +++ b/trunk/src/com/jpexs/helpers/LimitedInputStream.java @@ -31,7 +31,7 @@ public class LimitedInputStream extends InputStream { public int available() throws IOException { int avail = is.available(); if (pos + avail > limit) { - avail = (int)(limit - pos); + avail = (int) (limit - pos); } return avail; } diff --git a/trunk/src/com/jpexs/helpers/ReReadableInputStream.java b/trunk/src/com/jpexs/helpers/ReReadableInputStream.java index dfa0662ea..43186dca6 100644 --- a/trunk/src/com/jpexs/helpers/ReReadableInputStream.java +++ b/trunk/src/com/jpexs/helpers/ReReadableInputStream.java @@ -62,7 +62,7 @@ public class ReReadableInputStream extends InputStream { if (converted == null) { converted = baos.toByteArray(); } - int ret = converted[(int)pos] & 0xff; + int ret = converted[(int) pos] & 0xff; pos++; return ret; } @@ -79,7 +79,7 @@ public class ReReadableInputStream extends InputStream { @Override public int available() throws IOException { - return (count + is.available()) - (int)pos; + return (count + is.available()) - (int) pos; } public long length() throws IOException { diff --git a/trunk/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java b/trunk/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java index b284316a6..220ca9c75 100644 --- a/trunk/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java +++ b/trunk/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java @@ -55,9 +55,7 @@ public class ActionScript2AssemblerTest { assertEquals(actualResult.trim(), "ok = false;"); assertTrue(decompiled.contains("Push \"ok\" false")); - } catch (IOException ex) { - fail(); - } catch (ParseException ex) { + } catch (IOException | ParseException ex) { fail(); } }