diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index bdd27a857..1ab36cbf9 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -73,6 +73,7 @@ NONE : 'none' -> mode(NLSEMI); PRED : 'pred'; TYPE_OF : 'typeOf'-> mode(NLSEMI); IS_COMPARABLE: 'isComparable'-> mode(NLSEMI); +LOW : 'low'-> mode(NLSEMI); SHARE : 'share'; ADDR_MOD : '@'-> mode(NLSEMI); DOT_DOT : '..'; diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 3f08a2fcb..8fe817d16 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -78,6 +78,7 @@ ghostPrimaryExpr: range | typeOf | typeExpr | isComparable + | low | old | before | sConversion @@ -122,6 +123,8 @@ before: BEFORE L_PAREN expression R_PAREN; isComparable: IS_COMPARABLE L_PAREN expression R_PAREN; +low: LOW L_PAREN expression R_PAREN; + typeOf: TYPE_OF L_PAREN expression R_PAREN; access: ACCESS L_PAREN expression (COMMA expression)? R_PAREN; @@ -433,13 +436,13 @@ implicitArray: L_BRACKET ELLIPSIS R_BRACKET elementType; // distinguish low,high cap slice_: L_BRACKET ( - low? COLON high? - | low? COLON high COLON cap + lowSliceArgument? COLON highSliceArgument? + | lowSliceArgument? COLON highSliceArgument COLON capSliceArgument ) R_BRACKET; -low : expression; -high: expression; -cap: expression; +lowSliceArgument : expression; +highSliceArgument: expression; +capSliceArgument: expression; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 0d4c2dd0e..f177cedb8 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,3 +1,4 @@ +// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -10,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -23,25 +24,25 @@ public class GobraLexer extends Lexer { UNION=31, INTERSECTION=32, SETMINUS=33, IMPLIES=34, WAND=35, APPLY=36, QMARK=37, L_PRED=38, R_PRED=39, SEQ=40, SET=41, MSET=42, DICT=43, OPT=44, LEN=45, NEW=46, MAKE=47, CAP=48, SOME=49, GET=50, DOM=51, AXIOM=52, ADT=53, - MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, - DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, - TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, - GHOST_NOT_EQUALS=73, WITH=74, BREAK=75, DEFAULT=76, FUNC=77, INTERFACE=78, - SELECT=79, CASE=80, DEFER=81, GO=82, MAP=83, STRUCT=84, CHAN=85, ELSE=86, - GOTO=87, PACKAGE=88, SWITCH=89, CONST=90, FALLTHROUGH=91, IF=92, RANGE=93, - TYPE=94, CONTINUE=95, FOR=96, IMPORT=97, RETURN=98, VAR=99, NIL_LIT=100, - IDENTIFIER=101, L_PAREN=102, R_PAREN=103, L_CURLY=104, R_CURLY=105, L_BRACKET=106, - R_BRACKET=107, ASSIGN=108, COMMA=109, SEMI=110, COLON=111, DOT=112, PLUS_PLUS=113, - MINUS_MINUS=114, DECLARE_ASSIGN=115, ELLIPSIS=116, LOGICAL_OR=117, LOGICAL_AND=118, - EQUALS=119, NOT_EQUALS=120, LESS=121, LESS_OR_EQUALS=122, GREATER=123, - GREATER_OR_EQUALS=124, OR=125, DIV=126, MOD=127, LSHIFT=128, RSHIFT=129, - BIT_CLEAR=130, EXCLAMATION=131, PLUS=132, MINUS=133, CARET=134, STAR=135, - AMPERSAND=136, RECEIVE=137, DECIMAL_LIT=138, BINARY_LIT=139, OCTAL_LIT=140, - HEX_LIT=141, HEX_FLOAT_LIT=142, IMAGINARY_LIT=143, RUNE_LIT=144, BYTE_VALUE=145, - OCTAL_BYTE_VALUE=146, HEX_BYTE_VALUE=147, LITTLE_U_VALUE=148, BIG_U_VALUE=149, - RAW_STRING_LIT=150, INTERPRETED_STRING_LIT=151, WS=152, COMMENT=153, TERMINATOR=154, - LINE_COMMENT=155, WS_NLSEMI=156, COMMENT_NLSEMI=157, LINE_COMMENT_NLSEMI=158, - EOS=159, OTHER=160; + MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, LOW=59, SHARE=60, + ADDR_MOD=61, DOT_DOT=62, SHARED=63, EXCLUSIVE=64, PREDICATE=65, WRITEPERM=66, + NOPERM=67, TRUSTED=68, OUTLINE=69, INIT_POST=70, IMPORT_PRE=71, PROOF=72, + GHOST_EQUALS=73, GHOST_NOT_EQUALS=74, WITH=75, BREAK=76, DEFAULT=77, FUNC=78, + INTERFACE=79, SELECT=80, CASE=81, DEFER=82, GO=83, MAP=84, STRUCT=85, + CHAN=86, ELSE=87, GOTO=88, PACKAGE=89, SWITCH=90, CONST=91, FALLTHROUGH=92, + IF=93, RANGE=94, TYPE=95, CONTINUE=96, FOR=97, IMPORT=98, RETURN=99, VAR=100, + NIL_LIT=101, IDENTIFIER=102, L_PAREN=103, R_PAREN=104, L_CURLY=105, R_CURLY=106, + L_BRACKET=107, R_BRACKET=108, ASSIGN=109, COMMA=110, SEMI=111, COLON=112, + DOT=113, PLUS_PLUS=114, MINUS_MINUS=115, DECLARE_ASSIGN=116, ELLIPSIS=117, + LOGICAL_OR=118, LOGICAL_AND=119, EQUALS=120, NOT_EQUALS=121, LESS=122, + LESS_OR_EQUALS=123, GREATER=124, GREATER_OR_EQUALS=125, OR=126, DIV=127, + MOD=128, LSHIFT=129, RSHIFT=130, BIT_CLEAR=131, EXCLAMATION=132, PLUS=133, + MINUS=134, CARET=135, STAR=136, AMPERSAND=137, RECEIVE=138, DECIMAL_LIT=139, + BINARY_LIT=140, OCTAL_LIT=141, HEX_LIT=142, HEX_FLOAT_LIT=143, IMAGINARY_LIT=144, + RUNE_LIT=145, BYTE_VALUE=146, OCTAL_BYTE_VALUE=147, HEX_BYTE_VALUE=148, + LITTLE_U_VALUE=149, BIG_U_VALUE=150, RAW_STRING_LIT=151, INTERPRETED_STRING_LIT=152, + WS=153, COMMENT=154, TERMINATOR=155, LINE_COMMENT=156, WS_NLSEMI=157, + COMMENT_NLSEMI=158, LINE_COMMENT_NLSEMI=159, EOS=160, OTHER=161; public static final int NLSEMI=1; public static String[] channelNames = { @@ -61,7 +62,7 @@ private static String[] makeRuleNames() { "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", - "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "TYPE_OF", "IS_COMPARABLE", "LOW", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", @@ -95,12 +96,12 @@ private static String[] makeLiteralNames() { "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'", "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", - "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", - "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", - "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", - "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", - "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", - "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", + "'none'", "'pred'", "'typeOf'", "'isComparable'", "'low'", "'share'", + "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", + "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", + "'proof'", "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", + "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'", + "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", @@ -118,7 +119,7 @@ private static String[] makeSymbolicNames() { "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", - "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "TYPE_OF", "IS_COMPARABLE", "LOW", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", @@ -214,7 +215,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a2\u05db\b\1\b"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a3\u05e3\b\1\b"+ "\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+ "\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+ "\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+ @@ -238,676 +239,679 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+ - "\t\u00ad\4\u00ae\t\u00ae\3\2\3\2\5\2\u0161\n\2\3\2\3\2\3\3\3\3\3\3\3\3"+ - "\5\3\u0169\n\3\3\3\5\3\u016c\n\3\3\3\5\3\u016f\n\3\3\3\3\3\3\3\3\3\5\3"+ - "\u0175\n\3\5\3\u0177\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3"+ - "\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+ - "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3"+ - "\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+ - "\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+ - "\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17"+ - "\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+ - "\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25"+ - "\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27"+ - "\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+ - "\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33"+ - "\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\37"+ - "\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!"+ - "\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$"+ - "\3$\3$\3$\3%\3%\3%\3%\3%\3%\3&\3&\3\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)\3)"+ - "\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,"+ - "\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3\60\3"+ - "\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3"+ - "\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+ - "\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3"+ - "\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3"+ - "8\38\38\38\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3"+ - ";\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3"+ - ">\3>\3>\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3"+ - "A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3"+ - "C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3"+ - "F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+ - "G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3J\3K\3K\3K\3K\3K\3"+ - "L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3"+ - "O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3"+ - "R\3R\3R\3S\3S\3S\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3"+ - "W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3"+ - "Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3"+ - "\\\3\\\3]\3]\3]\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`"+ - "\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3c"+ - "\3c\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\7f\u0426\nf\ff\16f\u0429\13"+ - "f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3i\3j\3j\3j\3j\3k\3k\3l\3l\3l\3l\3m\3m\3"+ - "n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3t\3t\3t\3u\3u\3"+ - "u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y\3y\3y\3z\3z\3{\3{\3{\3|\3|\3}\3}\3"+ - "}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0082\3"+ - "\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085"+ - "\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u008a"+ - "\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\5\u008b\u0491\n\u008b\3\u008b"+ - "\7\u008b\u0494\n\u008b\f\u008b\16\u008b\u0497\13\u008b\5\u008b\u0499\n"+ - "\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\5\u008c\u04a0\n\u008c\3"+ - "\u008c\6\u008c\u04a3\n\u008c\r\u008c\16\u008c\u04a4\3\u008c\3\u008c\3"+ - "\u008d\3\u008d\5\u008d\u04ab\n\u008d\3\u008d\5\u008d\u04ae\n\u008d\3\u008d"+ - "\6\u008d\u04b1\n\u008d\r\u008d\16\u008d\u04b2\3\u008d\3\u008d\3\u008e"+ - "\3\u008e\3\u008e\5\u008e\u04ba\n\u008e\3\u008e\6\u008e\u04bd\n\u008e\r"+ - "\u008e\16\u008e\u04be\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f"+ - "\3\u008f\3\u0090\5\u0090\u04c9\n\u0090\3\u0090\6\u0090\u04cc\n\u0090\r"+ - "\u0090\16\u0090\u04cd\3\u0090\3\u0090\5\u0090\u04d2\n\u0090\3\u0090\7"+ - "\u0090\u04d5\n\u0090\f\u0090\16\u0090\u04d8\13\u0090\5\u0090\u04da\n\u0090"+ - "\3\u0090\3\u0090\3\u0090\5\u0090\u04df\n\u0090\3\u0090\7\u0090\u04e2\n"+ - "\u0090\f\u0090\16\u0090\u04e5\13\u0090\5\u0090\u04e7\n\u0090\3\u0091\3"+ - "\u0091\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\5\u0092"+ - "\u04f2\n\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093"+ - "\5\u0093\u04fb\n\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+ - "\3\u0095\3\u0095\5\u0095\u0505\n\u0095\3\u0096\3\u0096\3\u0096\3\u0096"+ - "\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098"+ - "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ - "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\7\u009a"+ - "\u0525\n\u009a\f\u009a\16\u009a\u0528\13\u009a\3\u009a\3\u009a\3\u009a"+ - "\3\u009a\3\u009b\3\u009b\3\u009b\7\u009b\u0531\n\u009b\f\u009b\16\u009b"+ - "\u0534\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009c\6\u009c\u053b"+ - "\n\u009c\r\u009c\16\u009c\u053c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\7\u009d\u0545\n\u009d\f\u009d\16\u009d\u0548\13\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\6\u009e\u0550\n\u009e\r\u009e"+ - "\16\u009e\u0551\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\7\u009f"+ - "\u055a\n\u009f\f\u009f\16\u009f\u055d\13\u009f\3\u009f\3\u009f\3\u00a0"+ - "\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u0565\n\u00a0\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\5\u00a1\u0581\n\u00a1\3\u00a2"+ - "\3\u00a2\5\u00a2\u0585\n\u00a2\3\u00a2\7\u00a2\u0588\n\u00a2\f\u00a2\16"+ - "\u00a2\u058b\13\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a5\3\u00a5"+ - "\3\u00a6\3\u00a6\5\u00a6\u0595\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3\u00a7"+ - "\5\u00a7\u059b\n\u00a7\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00aa\6\u00aa"+ - "\u05a2\n\u00aa\r\u00aa\16\u00aa\u05a3\3\u00aa\3\u00aa\3\u00ab\3\u00ab"+ - "\3\u00ab\3\u00ab\7\u00ab\u05ac\n\u00ab\f\u00ab\16\u00ab\u05af\13\u00ab"+ - "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+ - "\7\u00ac\u05ba\n\u00ac\f\u00ac\16\u00ac\u05bd\13\u00ac\3\u00ac\3\u00ac"+ - "\3\u00ad\6\u00ad\u05c2\n\u00ad\r\u00ad\16\u00ad\u05c3\3\u00ad\3\u00ad"+ - "\3\u00ad\3\u00ad\3\u00ad\7\u00ad\u05cb\n\u00ad\f\u00ad\16\u00ad\u05ce"+ - "\13\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u05d3\n\u00ad\3\u00ad\3\u00ad"+ - "\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\5\u0546\u05ad\u05cc\2\u00af\4"+ - "\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21"+ - "\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!"+ - "B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:"+ - "t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090"+ - "I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+ - "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+ - "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+ - "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+ - "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+ - "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+ - "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+ - "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\u008e\u011c"+ - "\u008f\u011e\u0090\u0120\2\u0122\2\u0124\u0091\u0126\2\u0128\u0092\u012a"+ - "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+ - "\u0099\u0138\u009a\u013a\u009b\u013c\u009c\u013e\u009d\u0140\2\u0142\2"+ - "\u0144\2\u0146\2\u0148\2\u014a\2\u014c\2\u014e\2\u0150\2\u0152\2\u0154"+ - "\u009e\u0156\u009f\u0158\u00a0\u015a\u00a1\u015c\u00a2\4\2\3\23\3\2\63"+ - ";\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13"+ - "\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5"+ - "\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb"+ - "\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8"+ - "\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1"+ - "\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22"+ - "\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b"+ - "\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52"+ - "\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b"+ - "\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52"+ - "\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071"+ - "\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452"+ - "\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b"+ - "\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52"+ - "\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac"+ - "\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8"+ - "\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0"+ - "\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381"+ - "\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5"+ - "\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b"+ - "\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670"+ - "\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1"+ - "\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f"+ - "\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc"+ - "\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842"+ - "\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b"+ - "\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987"+ - "\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4"+ - "\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1"+ - "\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12"+ - "\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a"+ - "\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f"+ - "\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7"+ - "\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb"+ - "\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34"+ - "\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63"+ - "\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94"+ - "\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6"+ - "\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10"+ - "\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c"+ - "\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94"+ - "\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0"+ - "\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14"+ - "\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63"+ - "\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf"+ - "\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48"+ - "\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f"+ - "\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7"+ - "\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf"+ - "\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02"+ - "\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041"+ - "\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068"+ - "\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9"+ - "\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f"+ - "\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c"+ - "\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2"+ - "\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a"+ - "\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e"+ - "\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702"+ - "\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e"+ - "\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822"+ - "\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7"+ - "\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2"+ - "\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35"+ - "\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02"+ - "\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee"+ - "\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a"+ - "\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b"+ - "\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8"+ - "\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5"+ - "\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073"+ - "\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109"+ - "\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128"+ - "\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141"+ - "\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32"+ - "\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27"+ - "\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82"+ - "\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0"+ - "\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31"+ - "\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098"+ - "\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133"+ - "\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec"+ - "\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c"+ - "\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721"+ - "\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805"+ - "\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5"+ - "\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932"+ - "\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6"+ - "\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46"+ - "\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3"+ - "\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd"+ - "\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10"+ - "\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e"+ - "\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd"+ - "\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f"+ - "\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40"+ - "\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52"+ - "\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe"+ - "\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc"+ - "\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3"+ - "A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321"+ - "\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2"+ - "\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd"+ - "\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762"+ - "\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a"+ - "\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2"+ - "\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9"+ - "\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b"+ - "\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6"+ - "\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02"+ - "\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1"+ - "\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185"+ - "\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213"+ - "\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291"+ - "\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312"+ - "\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f"+ - "\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c"+ - "\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da"+ - "\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b"+ - "\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c"+ - "\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa"+ - "\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02"+ - "\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b"+ - "\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42"+ - "\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79"+ - "\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2"+ - "\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd"+ - "\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402"+ - "\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8"+ - "\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7"+ - "\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b"+ - "\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554"+ - "\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716"+ - "\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c"+ - "\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945"+ - "\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29"+ - "\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d"+ - "\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f"+ - "\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b"+ - "\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66"+ - "\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e"+ - "\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7"+ - "\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4"+ - "\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0606\2\4\3\2\2\2\2\6"+ - "\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2"+ - "\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34"+ - "\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2("+ - "\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2"+ - "\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2"+ - "@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3"+ - "\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2"+ - "\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2"+ - "\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r"+ - "\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2"+ - "\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2"+ - "\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090"+ - "\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2"+ - "\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2"+ - "\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2"+ - "\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4"+ - "\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2"+ - "\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6"+ - "\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2"+ - "\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8"+ - "\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2"+ - "\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea"+ - "\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2"+ - "\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc"+ - "\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2"+ - "\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e"+ - "\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2"+ - "\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u011c\3\2\2\2\2\u011e\3\2\2\2\2\u0124"+ - "\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2"+ - "\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\2\u0138"+ - "\3\2\2\2\2\u013a\3\2\2\2\2\u013c\3\2\2\2\2\u013e\3\2\2\2\3\u0154\3\2\2"+ - "\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\3\u015a\3\2\2\2\3\u015c\3\2\2\2\4\u0160"+ - "\3\2\2\2\6\u0176\3\2\2\2\b\u0178\3\2\2\2\n\u017f\3\2\2\2\f\u0187\3\2\2"+ - "\2\16\u018e\3\2\2\2\20\u0195\3\2\2\2\22\u019c\3\2\2\2\24\u01a3\3\2\2\2"+ - "\26\u01ac\3\2\2\2\30\u01b6\3\2\2\2\32\u01be\3\2\2\2\34\u01c8\3\2\2\2\36"+ - "\u01d4\3\2\2\2 \u01db\3\2\2\2\"\u01e6\3\2\2\2$\u01e9\3\2\2\2&\u01ef\3"+ - "\2\2\2(\u01f8\3\2\2\2*\u01fd\3\2\2\2,\u0204\3\2\2\2.\u020b\3\2\2\2\60"+ - "\u0211\3\2\2\2\62\u0216\3\2\2\2\64\u021d\3\2\2\2\66\u0227\3\2\2\28\u022b"+ - "\3\2\2\2:\u0231\3\2\2\2<\u0234\3\2\2\2>\u0236\3\2\2\2@\u023d\3\2\2\2B"+ - "\u0243\3\2\2\2D\u0250\3\2\2\2F\u0259\3\2\2\2H\u025d\3\2\2\2J\u0261\3\2"+ - "\2\2L\u0267\3\2\2\2N\u0269\3\2\2\2P\u026c\3\2\2\2R\u0271\3\2\2\2T\u0277"+ - "\3\2\2\2V\u027d\3\2\2\2X\u0284\3\2\2\2Z\u028b\3\2\2\2\\\u0294\3\2\2\2"+ - "^\u029a\3\2\2\2`\u02a0\3\2\2\2b\u02a7\3\2\2\2d\u02ad\3\2\2\2f\u02b4\3"+ - "\2\2\2h\u02ba\3\2\2\2j\u02c3\3\2\2\2l\u02cb\3\2\2\2n\u02d1\3\2\2\2p\u02d9"+ - "\3\2\2\2r\u02e0\3\2\2\2t\u02e5\3\2\2\2v\u02ee\3\2\2\2x\u02fd\3\2\2\2z"+ - "\u0303\3\2\2\2|\u0307\3\2\2\2~\u030a\3\2\2\2\u0080\u0311\3\2\2\2\u0082"+ - "\u031b\3\2\2\2\u0084\u0325\3\2\2\2\u0086\u0331\3\2\2\2\u0088\u033a\3\2"+ - "\2\2\u008a\u0344\3\2\2\2\u008c\u034c\3\2\2\2\u008e\u0358\3\2\2\2\u0090"+ - "\u0367\3\2\2\2\u0092\u036d\3\2\2\2\u0094\u0371\3\2\2\2\u0096\u0375\3\2"+ - "\2\2\u0098\u037a\3\2\2\2\u009a\u0382\3\2\2\2\u009c\u038a\3\2\2\2\u009e"+ - "\u038f\3\2\2\2\u00a0\u0399\3\2\2\2\u00a2\u03a0\3\2\2\2\u00a4\u03a5\3\2"+ - "\2\2\u00a6\u03ab\3\2\2\2\u00a8\u03ae\3\2\2\2\u00aa\u03b2\3\2\2\2\u00ac"+ - "\u03b9\3\2\2\2\u00ae\u03be\3\2\2\2\u00b0\u03c3\3\2\2\2\u00b2\u03c8\3\2"+ - "\2\2\u00b4\u03d0\3\2\2\2\u00b6\u03d7\3\2\2\2\u00b8\u03dd\3\2\2\2\u00ba"+ - "\u03eb\3\2\2\2\u00bc\u03ee\3\2\2\2\u00be\u03f4\3\2\2\2\u00c0\u03f9\3\2"+ - "\2\2\u00c2\u0404\3\2\2\2\u00c4\u0408\3\2\2\2\u00c6\u040f\3\2\2\2\u00c8"+ - "\u0418\3\2\2\2\u00ca\u041c\3\2\2\2\u00cc\u0422\3\2\2\2\u00ce\u042c\3\2"+ - "\2\2\u00d0\u042e\3\2\2\2\u00d2\u0432\3\2\2\2\u00d4\u0434\3\2\2\2\u00d6"+ - "\u0438\3\2\2\2\u00d8\u043a\3\2\2\2\u00da\u043e\3\2\2\2\u00dc\u0440\3\2"+ - "\2\2\u00de\u0442\3\2\2\2\u00e0\u0444\3\2\2\2\u00e2\u0446\3\2\2\2\u00e4"+ - "\u0448\3\2\2\2\u00e6\u044d\3\2\2\2\u00e8\u0452\3\2\2\2\u00ea\u0455\3\2"+ - "\2\2\u00ec\u0459\3\2\2\2\u00ee\u045c\3\2\2\2\u00f0\u045f\3\2\2\2\u00f2"+ - "\u0462\3\2\2\2\u00f4\u0465\3\2\2\2\u00f6\u0467\3\2\2\2\u00f8\u046a\3\2"+ - "\2\2\u00fa\u046c\3\2\2\2\u00fc\u046f\3\2\2\2\u00fe\u0471\3\2\2\2\u0100"+ - "\u0473\3\2\2\2\u0102\u0475\3\2\2\2\u0104\u0478\3\2\2\2\u0106\u047b\3\2"+ - "\2\2\u0108\u047e\3\2\2\2\u010a\u0480\3\2\2\2\u010c\u0482\3\2\2\2\u010e"+ - "\u0484\3\2\2\2\u0110\u0486\3\2\2\2\u0112\u0488\3\2\2\2\u0114\u048a\3\2"+ - "\2\2\u0116\u0498\3\2\2\2\u0118\u049c\3\2\2\2\u011a\u04a8\3\2\2\2\u011c"+ - "\u04b6\3\2\2\2\u011e\u04c2\3\2\2\2\u0120\u04e6\3\2\2\2\u0122\u04e8\3\2"+ - "\2\2\u0124\u04f1\3\2\2\2\u0126\u04f7\3\2\2\2\u0128\u04fe\3\2\2\2\u012a"+ - "\u0504\3\2\2\2\u012c\u0506\3\2\2\2\u012e\u050b\3\2\2\2\u0130\u0510\3\2"+ - "\2\2\u0132\u0517\3\2\2\2\u0134\u0522\3\2\2\2\u0136\u052d\3\2\2\2\u0138"+ - "\u053a\3\2\2\2\u013a\u0540\3\2\2\2\u013c\u054f\3\2\2\2\u013e\u0555\3\2"+ - "\2\2\u0140\u0564\3\2\2\2\u0142\u0566\3\2\2\2\u0144\u0582\3\2\2\2\u0146"+ - "\u058c\3\2\2\2\u0148\u058e\3\2\2\2\u014a\u0590\3\2\2\2\u014c\u0592\3\2"+ - "\2\2\u014e\u059a\3\2\2\2\u0150\u059c\3\2\2\2\u0152\u059e\3\2\2\2\u0154"+ - "\u05a1\3\2\2\2\u0156\u05a7\3\2\2\2\u0158\u05b5\3\2\2\2\u015a\u05d2\3\2"+ - "\2\2\u015c\u05d6\3\2\2\2\u015e\u0161\5\6\3\2\u015f\u0161\5\u011e\u008f"+ - "\2\u0160\u015e\3\2\2\2\u0160\u015f\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0163"+ - "\b\2\2\2\u0163\5\3\2\2\2\u0164\u016e\5\u0144\u00a2\2\u0165\u0166\7\60"+ - "\2\2\u0166\u0168\6\3\2\2\u0167\u0169\5\u0144\u00a2\2\u0168\u0167\3\2\2"+ - "\2\u0168\u0169\3\2\2\2\u0169\u016b\3\2\2\2\u016a\u016c\5\u014c\u00a6\2"+ - "\u016b\u016a\3\2\2\2\u016b\u016c\3\2\2\2\u016c\u016f\3\2\2\2\u016d\u016f"+ - "\5\u014c\u00a6\2\u016e\u0165\3\2\2\2\u016e\u016d\3\2\2\2\u016f\u0177\3"+ - "\2\2\2\u0170\u0171\7\60\2\2\u0171\u0172\6\3\3\2\u0172\u0174\5\u0144\u00a2"+ - "\2\u0173\u0175\5\u014c\u00a6\2\u0174\u0173\3\2\2\2\u0174\u0175\3\2\2\2"+ - "\u0175\u0177\3\2\2\2\u0176\u0164\3\2\2\2\u0176\u0170\3\2\2\2\u0177\7\3"+ - "\2\2\2\u0178\u0179\7v\2\2\u0179\u017a\7t\2\2\u017a\u017b\7w\2\2\u017b"+ - "\u017c\7g\2\2\u017c\u017d\3\2\2\2\u017d\u017e\b\4\2\2\u017e\t\3\2\2\2"+ - "\u017f\u0180\7h\2\2\u0180\u0181\7c\2\2\u0181\u0182\7n\2\2\u0182\u0183"+ - "\7u\2\2\u0183\u0184\7g\2\2\u0184\u0185\3\2\2\2\u0185\u0186\b\5\2\2\u0186"+ - "\13\3\2\2\2\u0187\u0188\7c\2\2\u0188\u0189\7u\2\2\u0189\u018a\7u\2\2\u018a"+ - "\u018b\7g\2\2\u018b\u018c\7t\2\2\u018c\u018d\7v\2\2\u018d\r\3\2\2\2\u018e"+ - "\u018f\7c\2\2\u018f\u0190\7u\2\2\u0190\u0191\7u\2\2\u0191\u0192\7w\2\2"+ - "\u0192\u0193\7o\2\2\u0193\u0194\7g\2\2\u0194\17\3\2\2\2\u0195\u0196\7"+ - "k\2\2\u0196\u0197\7p\2\2\u0197\u0198\7j\2\2\u0198\u0199\7c\2\2\u0199\u019a"+ - "\7n\2\2\u019a\u019b\7g\2\2\u019b\21\3\2\2\2\u019c\u019d\7g\2\2\u019d\u019e"+ - "\7z\2\2\u019e\u019f\7j\2\2\u019f\u01a0\7c\2\2\u01a0\u01a1\7n\2\2\u01a1"+ - "\u01a2\7g\2\2\u01a2\23\3\2\2\2\u01a3\u01a4\7t\2\2\u01a4\u01a5\7g\2\2\u01a5"+ - "\u01a6\7s\2\2\u01a6\u01a7\7w\2\2\u01a7\u01a8\7k\2\2\u01a8\u01a9\7t\2\2"+ - "\u01a9\u01aa\7g\2\2\u01aa\u01ab\7u\2\2\u01ab\25\3\2\2\2\u01ac\u01ad\7"+ - "r\2\2\u01ad\u01ae\7t\2\2\u01ae\u01af\7g\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1"+ - "\7g\2\2\u01b1\u01b2\7t\2\2\u01b2\u01b3\7x\2\2\u01b3\u01b4\7g\2\2\u01b4"+ - "\u01b5\7u\2\2\u01b5\27\3\2\2\2\u01b6\u01b7\7g\2\2\u01b7\u01b8\7p\2\2\u01b8"+ - "\u01b9\7u\2\2\u01b9\u01ba\7w\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7g\2\2"+ - "\u01bc\u01bd\7u\2\2\u01bd\31\3\2\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0\7"+ - "p\2\2\u01c0\u01c1\7x\2\2\u01c1\u01c2\7c\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4"+ - "\7k\2\2\u01c4\u01c5\7c\2\2\u01c5\u01c6\7p\2\2\u01c6\u01c7\7v\2\2\u01c7"+ - "\33\3\2\2\2\u01c8\u01c9\7f\2\2\u01c9\u01ca\7g\2\2\u01ca\u01cb\7e\2\2\u01cb"+ - "\u01cc\7t\2\2\u01cc\u01cd\7g\2\2\u01cd\u01ce\7c\2\2\u01ce\u01cf\7u\2\2"+ - "\u01cf\u01d0\7g\2\2\u01d0\u01d1\7u\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d3"+ - "\b\16\2\2\u01d3\35\3\2\2\2\u01d4\u01d5\7r\2\2\u01d5\u01d6\7w\2\2\u01d6"+ - "\u01d7\7t\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01da\b\17"+ - "\2\2\u01da\37\3\2\2\2\u01db\u01dc\7k\2\2\u01dc\u01dd\7o\2\2\u01dd\u01de"+ - "\7r\2\2\u01de\u01df\7n\2\2\u01df\u01e0\7g\2\2\u01e0\u01e1\7o\2\2\u01e1"+ - "\u01e2\7g\2\2\u01e2\u01e3\7p\2\2\u01e3\u01e4\7v\2\2\u01e4\u01e5\7u\2\2"+ - "\u01e5!\3\2\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7u\2\2\u01e8#\3\2\2\2\u01e9"+ - "\u01ea\7q\2\2\u01ea\u01eb\7n\2\2\u01eb\u01ec\7f\2\2\u01ec\u01ed\3\2\2"+ - "\2\u01ed\u01ee\b\22\2\2\u01ee%\3\2\2\2\u01ef\u01f0\7d\2\2\u01f0\u01f1"+ - "\7g\2\2\u01f1\u01f2\7h\2\2\u01f2\u01f3\7q\2\2\u01f3\u01f4\7t\2\2\u01f4"+ - "\u01f5\7g\2\2\u01f5\u01f6\3\2\2\2\u01f6\u01f7\b\23\2\2\u01f7\'\3\2\2\2"+ - "\u01f8\u01f9\7%\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7j\2\2\u01fb\u01fc"+ - "\7u\2\2\u01fc)\3\2\2\2\u01fd\u01fe\7h\2\2\u01fe\u01ff\7q\2\2\u01ff\u0200"+ - "\7t\2\2\u0200\u0201\7c\2\2\u0201\u0202\7n\2\2\u0202\u0203\7n\2\2\u0203"+ - "+\3\2\2\2\u0204\u0205\7g\2\2\u0205\u0206\7z\2\2\u0206\u0207\7k\2\2\u0207"+ - "\u0208\7u\2\2\u0208\u0209\7v\2\2\u0209\u020a\7u\2\2\u020a-\3\2\2\2\u020b"+ - "\u020c\7c\2\2\u020c\u020d\7e\2\2\u020d\u020e\7e\2\2\u020e\u020f\3\2\2"+ - "\2\u020f\u0210\b\27\2\2\u0210/\3\2\2\2\u0211\u0212\7h\2\2\u0212\u0213"+ - "\7q\2\2\u0213\u0214\7n\2\2\u0214\u0215\7f\2\2\u0215\61\3\2\2\2\u0216\u0217"+ - "\7w\2\2\u0217\u0218\7p\2\2\u0218\u0219\7h\2\2\u0219\u021a\7q\2\2\u021a"+ - "\u021b\7n\2\2\u021b\u021c\7f\2\2\u021c\63\3\2\2\2\u021d\u021e\7w\2\2\u021e"+ - "\u021f\7p\2\2\u021f\u0220\7h\2\2\u0220\u0221\7q\2\2\u0221\u0222\7n\2\2"+ - "\u0222\u0223\7f\2\2\u0223\u0224\7k\2\2\u0224\u0225\7p\2\2\u0225\u0226"+ - "\7i\2\2\u0226\65\3\2\2\2\u0227\u0228\7n\2\2\u0228\u0229\7g\2\2\u0229\u022a"+ - "\7v\2\2\u022a\67\3\2\2\2\u022b\u022c\7i\2\2\u022c\u022d\7j\2\2\u022d\u022e"+ - "\7q\2\2\u022e\u022f\7u\2\2\u022f\u0230\7v\2\2\u02309\3\2\2\2\u0231\u0232"+ - "\7k\2\2\u0232\u0233\7p\2\2\u0233;\3\2\2\2\u0234\u0235\7%\2\2\u0235=\3"+ - "\2\2\2\u0236\u0237\7u\2\2\u0237\u0238\7w\2\2\u0238\u0239\7d\2\2\u0239"+ - "\u023a\7u\2\2\u023a\u023b\7g\2\2\u023b\u023c\7v\2\2\u023c?\3\2\2\2\u023d"+ - "\u023e\7w\2\2\u023e\u023f\7p\2\2\u023f\u0240\7k\2\2\u0240\u0241\7q\2\2"+ - "\u0241\u0242\7p\2\2\u0242A\3\2\2\2\u0243\u0244\7k\2\2\u0244\u0245\7p\2"+ - "\2\u0245\u0246\7v\2\2\u0246\u0247\7g\2\2\u0247\u0248\7t\2\2\u0248\u0249"+ - "\7u\2\2\u0249\u024a\7g\2\2\u024a\u024b\7e\2\2\u024b\u024c\7v\2\2\u024c"+ - "\u024d\7k\2\2\u024d\u024e\7q\2\2\u024e\u024f\7p\2\2\u024fC\3\2\2\2\u0250"+ - "\u0251\7u\2\2\u0251\u0252\7g\2\2\u0252\u0253\7v\2\2\u0253\u0254\7o\2\2"+ - "\u0254\u0255\7k\2\2\u0255\u0256\7p\2\2\u0256\u0257\7w\2\2\u0257\u0258"+ - "\7u\2\2\u0258E\3\2\2\2\u0259\u025a\7?\2\2\u025a\u025b\7?\2\2\u025b\u025c"+ - "\7@\2\2\u025cG\3\2\2\2\u025d\u025e\7/\2\2\u025e\u025f\7/\2\2\u025f\u0260"+ - "\7,\2\2\u0260I\3\2\2\2\u0261\u0262\7c\2\2\u0262\u0263\7r\2\2\u0263\u0264"+ - "\7r\2\2\u0264\u0265\7n\2\2\u0265\u0266\7{\2\2\u0266K\3\2\2\2\u0267\u0268"+ - "\7A\2\2\u0268M\3\2\2\2\u0269\u026a\7#\2\2\u026a\u026b\7>\2\2\u026bO\3"+ - "\2\2\2\u026c\u026d\7#\2\2\u026d\u026e\7@\2\2\u026e\u026f\3\2\2\2\u026f"+ - "\u0270\b(\2\2\u0270Q\3\2\2\2\u0271\u0272\7u\2\2\u0272\u0273\7g\2\2\u0273"+ - "\u0274\7s\2\2\u0274\u0275\3\2\2\2\u0275\u0276\b)\2\2\u0276S\3\2\2\2\u0277"+ - "\u0278\7u\2\2\u0278\u0279\7g\2\2\u0279\u027a\7v\2\2\u027a\u027b\3\2\2"+ - "\2\u027b\u027c\b*\2\2\u027cU\3\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7"+ - "u\2\2\u027f\u0280\7g\2\2\u0280\u0281\7v\2\2\u0281\u0282\3\2\2\2\u0282"+ - "\u0283\b+\2\2\u0283W\3\2\2\2\u0284\u0285\7f\2\2\u0285\u0286\7k\2\2\u0286"+ - "\u0287\7e\2\2\u0287\u0288\7v\2\2\u0288\u0289\3\2\2\2\u0289\u028a\b,\2"+ - "\2\u028aY\3\2\2\2\u028b\u028c\7q\2\2\u028c\u028d\7r\2\2\u028d\u028e\7"+ - "v\2\2\u028e\u028f\7k\2\2\u028f\u0290\7q\2\2\u0290\u0291\7p\2\2\u0291\u0292"+ - "\3\2\2\2\u0292\u0293\b-\2\2\u0293[\3\2\2\2\u0294\u0295\7n\2\2\u0295\u0296"+ - "\7g\2\2\u0296\u0297\7p\2\2\u0297\u0298\3\2\2\2\u0298\u0299\b.\2\2\u0299"+ - "]\3\2\2\2\u029a\u029b\7p\2\2\u029b\u029c\7g\2\2\u029c\u029d\7y\2\2\u029d"+ - "\u029e\3\2\2\2\u029e\u029f\b/\2\2\u029f_\3\2\2\2\u02a0\u02a1\7o\2\2\u02a1"+ - "\u02a2\7c\2\2\u02a2\u02a3\7m\2\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\3\2\2"+ - "\2\u02a5\u02a6\b\60\2\2\u02a6a\3\2\2\2\u02a7\u02a8\7e\2\2\u02a8\u02a9"+ - "\7c\2\2\u02a9\u02aa\7r\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02ac\b\61\2\2\u02ac"+ - "c\3\2\2\2\u02ad\u02ae\7u\2\2\u02ae\u02af\7q\2\2\u02af\u02b0\7o\2\2\u02b0"+ - "\u02b1\7g\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b3\b\62\2\2\u02b3e\3\2\2\2"+ - "\u02b4\u02b5\7i\2\2\u02b5\u02b6\7g\2\2\u02b6\u02b7\7v\2\2\u02b7\u02b8"+ - "\3\2\2\2\u02b8\u02b9\b\63\2\2\u02b9g\3\2\2\2\u02ba\u02bb\7f\2\2\u02bb"+ - "\u02bc\7q\2\2\u02bc\u02bd\7o\2\2\u02bd\u02be\7c\2\2\u02be\u02bf\7k\2\2"+ - "\u02bf\u02c0\7p\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\b\64\2\2\u02c2i\3"+ - "\2\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7z\2\2\u02c5\u02c6\7k\2\2\u02c6"+ - "\u02c7\7q\2\2\u02c7\u02c8\7o\2\2\u02c8\u02c9\3\2\2\2\u02c9\u02ca\b\65"+ - "\2\2\u02cak\3\2\2\2\u02cb\u02cc\7c\2\2\u02cc\u02cd\7f\2\2\u02cd\u02ce"+ - "\7v\2\2\u02ce\u02cf\3\2\2\2\u02cf\u02d0\b\66\2\2\u02d0m\3\2\2\2\u02d1"+ - "\u02d2\7o\2\2\u02d2\u02d3\7c\2\2\u02d3\u02d4\7v\2\2\u02d4\u02d5\7e\2\2"+ - "\u02d5\u02d6\7j\2\2\u02d6\u02d7\3\2\2\2\u02d7\u02d8\b\67\2\2\u02d8o\3"+ - "\2\2\2\u02d9\u02da\7p\2\2\u02da\u02db\7q\2\2\u02db\u02dc\7p\2\2\u02dc"+ - "\u02dd\7g\2\2\u02dd\u02de\3\2\2\2\u02de\u02df\b8\2\2\u02dfq\3\2\2\2\u02e0"+ - "\u02e1\7r\2\2\u02e1\u02e2\7t\2\2\u02e2\u02e3\7g\2\2\u02e3\u02e4\7f\2\2"+ - "\u02e4s\3\2\2\2\u02e5\u02e6\7v\2\2\u02e6\u02e7\7{\2\2\u02e7\u02e8\7r\2"+ - "\2\u02e8\u02e9\7g\2\2\u02e9\u02ea\7Q\2\2\u02ea\u02eb\7h\2\2\u02eb\u02ec"+ - "\3\2\2\2\u02ec\u02ed\b:\2\2\u02edu\3\2\2\2\u02ee\u02ef\7k\2\2\u02ef\u02f0"+ - "\7u\2\2\u02f0\u02f1\7E\2\2\u02f1\u02f2\7q\2\2\u02f2\u02f3\7o\2\2\u02f3"+ - "\u02f4\7r\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2\u02f6\u02f7\7c\2\2"+ - "\u02f7\u02f8\7d\2\2\u02f8\u02f9\7n\2\2\u02f9\u02fa\7g\2\2\u02fa\u02fb"+ - "\3\2\2\2\u02fb\u02fc\b;\2\2\u02fcw\3\2\2\2\u02fd\u02fe\7u\2\2\u02fe\u02ff"+ - "\7j\2\2\u02ff\u0300\7c\2\2\u0300\u0301\7t\2\2\u0301\u0302\7g\2\2\u0302"+ - "y\3\2\2\2\u0303\u0304\7B\2\2\u0304\u0305\3\2\2\2\u0305\u0306\b=\2\2\u0306"+ - "{\3\2\2\2\u0307\u0308\7\60\2\2\u0308\u0309\7\60\2\2\u0309}\3\2\2\2\u030a"+ - "\u030b\7u\2\2\u030b\u030c\7j\2\2\u030c\u030d\7c\2\2\u030d\u030e\7t\2\2"+ - "\u030e\u030f\7g\2\2\u030f\u0310\7f\2\2\u0310\177\3\2\2\2\u0311\u0312\7"+ - "g\2\2\u0312\u0313\7z\2\2\u0313\u0314\7e\2\2\u0314\u0315\7n\2\2\u0315\u0316"+ - "\7w\2\2\u0316\u0317\7u\2\2\u0317\u0318\7k\2\2\u0318\u0319\7x\2\2\u0319"+ - "\u031a\7g\2\2\u031a\u0081\3\2\2\2\u031b\u031c\7r\2\2\u031c\u031d\7t\2"+ - "\2\u031d\u031e\7g\2\2\u031e\u031f\7f\2\2\u031f\u0320\7k\2\2\u0320\u0321"+ - "\7e\2\2\u0321\u0322\7c\2\2\u0322\u0323\7v\2\2\u0323\u0324\7g\2\2\u0324"+ - "\u0083\3\2\2\2\u0325\u0326\7y\2\2\u0326\u0327\7t\2\2\u0327\u0328\7k\2"+ - "\2\u0328\u0329\7v\2\2\u0329\u032a\7g\2\2\u032a\u032b\7R\2\2\u032b\u032c"+ - "\7g\2\2\u032c\u032d\7t\2\2\u032d\u032e\7o\2\2\u032e\u032f\3\2\2\2\u032f"+ - "\u0330\bB\2\2\u0330\u0085\3\2\2\2\u0331\u0332\7p\2\2\u0332\u0333\7q\2"+ - "\2\u0333\u0334\7R\2\2\u0334\u0335\7g\2\2\u0335\u0336\7t\2\2\u0336\u0337"+ - "\7o\2\2\u0337\u0338\3\2\2\2\u0338\u0339\bC\2\2\u0339\u0087\3\2\2\2\u033a"+ - "\u033b\7v\2\2\u033b\u033c\7t\2\2\u033c\u033d\7w\2\2\u033d\u033e\7u\2\2"+ - "\u033e\u033f\7v\2\2\u033f\u0340\7g\2\2\u0340\u0341\7f\2\2\u0341\u0342"+ - "\3\2\2\2\u0342\u0343\bD\2\2\u0343\u0089\3\2\2\2\u0344\u0345\7q\2\2\u0345"+ - "\u0346\7w\2\2\u0346\u0347\7v\2\2\u0347\u0348\7n\2\2\u0348\u0349\7k\2\2"+ - "\u0349\u034a\7p\2\2\u034a\u034b\7g\2\2\u034b\u008b\3\2\2\2\u034c\u034d"+ - "\7k\2\2\u034d\u034e\7p\2\2\u034e\u034f\7k\2\2\u034f\u0350\7v\2\2\u0350"+ - "\u0351\7G\2\2\u0351\u0352\7p\2\2\u0352\u0353\7u\2\2\u0353\u0354\7w\2\2"+ - "\u0354\u0355\7t\2\2\u0355\u0356\7g\2\2\u0356\u0357\7u\2\2\u0357\u008d"+ - "\3\2\2\2\u0358\u0359\7k\2\2\u0359\u035a\7o\2\2\u035a\u035b\7r\2\2\u035b"+ - "\u035c\7q\2\2\u035c\u035d\7t\2\2\u035d\u035e\7v\2\2\u035e\u035f\7T\2\2"+ - "\u035f\u0360\7g\2\2\u0360\u0361\7s\2\2\u0361\u0362\7w\2\2\u0362\u0363"+ - "\7k\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2\2\u0365\u0366\7u\2\2\u0366"+ - "\u008f\3\2\2\2\u0367\u0368\7r\2\2\u0368\u0369\7t\2\2\u0369\u036a\7q\2"+ - "\2\u036a\u036b\7q\2\2\u036b\u036c\7h\2\2\u036c\u0091\3\2\2\2\u036d\u036e"+ - "\7?\2\2\u036e\u036f\7?\2\2\u036f\u0370\7?\2\2\u0370\u0093\3\2\2\2\u0371"+ - "\u0372\7#\2\2\u0372\u0373\7?\2\2\u0373\u0374\7?\2\2\u0374\u0095\3\2\2"+ - "\2\u0375\u0376\7y\2\2\u0376\u0377\7k\2\2\u0377\u0378\7v\2\2\u0378\u0379"+ - "\7j\2\2\u0379\u0097\3\2\2\2\u037a\u037b\7d\2\2\u037b\u037c\7t\2\2\u037c"+ - "\u037d\7g\2\2\u037d\u037e\7c\2\2\u037e\u037f\7m\2\2\u037f\u0380\3\2\2"+ - "\2\u0380\u0381\bL\2\2\u0381\u0099\3\2\2\2\u0382\u0383\7f\2\2\u0383\u0384"+ - "\7g\2\2\u0384\u0385\7h\2\2\u0385\u0386\7c\2\2\u0386\u0387\7w\2\2\u0387"+ - "\u0388\7n\2\2\u0388\u0389\7v\2\2\u0389\u009b\3\2\2\2\u038a\u038b\7h\2"+ - "\2\u038b\u038c\7w\2\2\u038c\u038d\7p\2\2\u038d\u038e\7e\2\2\u038e\u009d"+ - "\3\2\2\2\u038f\u0390\7k\2\2\u0390\u0391\7p\2\2\u0391\u0392\7v\2\2\u0392"+ - "\u0393\7g\2\2\u0393\u0394\7t\2\2\u0394\u0395\7h\2\2\u0395\u0396\7c\2\2"+ - "\u0396\u0397\7e\2\2\u0397\u0398\7g\2\2\u0398\u009f\3\2\2\2\u0399\u039a"+ - "\7u\2\2\u039a\u039b\7g\2\2\u039b\u039c\7n\2\2\u039c\u039d\7g\2\2\u039d"+ - "\u039e\7e\2\2\u039e\u039f\7v\2\2\u039f\u00a1\3\2\2\2\u03a0\u03a1\7e\2"+ - "\2\u03a1\u03a2\7c\2\2\u03a2\u03a3\7u\2\2\u03a3\u03a4\7g\2\2\u03a4\u00a3"+ - "\3\2\2\2\u03a5\u03a6\7f\2\2\u03a6\u03a7\7g\2\2\u03a7\u03a8\7h\2\2\u03a8"+ - "\u03a9\7g\2\2\u03a9\u03aa\7t\2\2\u03aa\u00a5\3\2\2\2\u03ab\u03ac\7i\2"+ - "\2\u03ac\u03ad\7q\2\2\u03ad\u00a7\3\2\2\2\u03ae\u03af\7o\2\2\u03af\u03b0"+ - "\7c\2\2\u03b0\u03b1\7r\2\2\u03b1\u00a9\3\2\2\2\u03b2\u03b3\7u\2\2\u03b3"+ - "\u03b4\7v\2\2\u03b4\u03b5\7t\2\2\u03b5\u03b6\7w\2\2\u03b6\u03b7\7e\2\2"+ - "\u03b7\u03b8\7v\2\2\u03b8\u00ab\3\2\2\2\u03b9\u03ba\7e\2\2\u03ba\u03bb"+ - "\7j\2\2\u03bb\u03bc\7c\2\2\u03bc\u03bd\7p\2\2\u03bd\u00ad\3\2\2\2\u03be"+ - "\u03bf\7g\2\2\u03bf\u03c0\7n\2\2\u03c0\u03c1\7u\2\2\u03c1\u03c2\7g\2\2"+ - "\u03c2\u00af\3\2\2\2\u03c3\u03c4\7i\2\2\u03c4\u03c5\7q\2\2\u03c5\u03c6"+ - "\7v\2\2\u03c6\u03c7\7q\2\2\u03c7\u00b1\3\2\2\2\u03c8\u03c9\7r\2\2\u03c9"+ - "\u03ca\7c\2\2\u03ca\u03cb\7e\2\2\u03cb\u03cc\7m\2\2\u03cc\u03cd\7c\2\2"+ - "\u03cd\u03ce\7i\2\2\u03ce\u03cf\7g\2\2\u03cf\u00b3\3\2\2\2\u03d0\u03d1"+ - "\7u\2\2\u03d1\u03d2\7y\2\2\u03d2\u03d3\7k\2\2\u03d3\u03d4\7v\2\2\u03d4"+ - "\u03d5\7e\2\2\u03d5\u03d6\7j\2\2\u03d6\u00b5\3\2\2\2\u03d7\u03d8\7e\2"+ - "\2\u03d8\u03d9\7q\2\2\u03d9\u03da\7p\2\2\u03da\u03db\7u\2\2\u03db\u03dc"+ - "\7v\2\2\u03dc\u00b7\3\2\2\2\u03dd\u03de\7h\2\2\u03de\u03df\7c\2\2\u03df"+ - "\u03e0\7n\2\2\u03e0\u03e1\7n\2\2\u03e1\u03e2\7v\2\2\u03e2\u03e3\7j\2\2"+ - "\u03e3\u03e4\7t\2\2\u03e4\u03e5\7q\2\2\u03e5\u03e6\7w\2\2\u03e6\u03e7"+ - "\7i\2\2\u03e7\u03e8\7j\2\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\b\\\2\2\u03ea"+ - "\u00b9\3\2\2\2\u03eb\u03ec\7k\2\2\u03ec\u03ed\7h\2\2\u03ed\u00bb\3\2\2"+ - "\2\u03ee\u03ef\7t\2\2\u03ef\u03f0\7c\2\2\u03f0\u03f1\7p\2\2\u03f1\u03f2"+ - "\7i\2\2\u03f2\u03f3\7g\2\2\u03f3\u00bd\3\2\2\2\u03f4\u03f5\7v\2\2\u03f5"+ - "\u03f6\7{\2\2\u03f6\u03f7\7r\2\2\u03f7\u03f8\7g\2\2\u03f8\u00bf\3\2\2"+ - "\2\u03f9\u03fa\7e\2\2\u03fa\u03fb\7q\2\2\u03fb\u03fc\7p\2\2\u03fc\u03fd"+ - "\7v\2\2\u03fd\u03fe\7k\2\2\u03fe\u03ff\7p\2\2\u03ff\u0400\7w\2\2\u0400"+ - "\u0401\7g\2\2\u0401\u0402\3\2\2\2\u0402\u0403\b`\2\2\u0403\u00c1\3\2\2"+ - "\2\u0404\u0405\7h\2\2\u0405\u0406\7q\2\2\u0406\u0407\7t\2\2\u0407\u00c3"+ - "\3\2\2\2\u0408\u0409\7k\2\2\u0409\u040a\7o\2\2\u040a\u040b\7r\2\2\u040b"+ - "\u040c\7q\2\2\u040c\u040d\7t\2\2\u040d\u040e\7v\2\2\u040e\u00c5\3\2\2"+ - "\2\u040f\u0410\7t\2\2\u0410\u0411\7g\2\2\u0411\u0412\7v\2\2\u0412\u0413"+ - "\7w\2\2\u0413\u0414\7t\2\2\u0414\u0415\7p\2\2\u0415\u0416\3\2\2\2\u0416"+ - "\u0417\bc\2\2\u0417\u00c7\3\2\2\2\u0418\u0419\7x\2\2\u0419\u041a\7c\2"+ - "\2\u041a\u041b\7t\2\2\u041b\u00c9\3\2\2\2\u041c\u041d\7p\2\2\u041d\u041e"+ - "\7k\2\2\u041e\u041f\7n\2\2\u041f\u0420\3\2\2\2\u0420\u0421\be\2\2\u0421"+ - "\u00cb\3\2\2\2\u0422\u0427\5\u014e\u00a7\2\u0423\u0426\5\u014e\u00a7\2"+ - "\u0424\u0426\5\u0150\u00a8\2\u0425\u0423\3\2\2\2\u0425\u0424\3\2\2\2\u0426"+ - "\u0429\3\2\2\2\u0427\u0425\3\2\2\2\u0427\u0428\3\2\2\2\u0428\u042a\3\2"+ - "\2\2\u0429\u0427\3\2\2\2\u042a\u042b\bf\2\2\u042b\u00cd\3\2\2\2\u042c"+ - "\u042d\7*\2\2\u042d\u00cf\3\2\2\2\u042e\u042f\7+\2\2\u042f\u0430\3\2\2"+ - "\2\u0430\u0431\bh\2\2\u0431\u00d1\3\2\2\2\u0432\u0433\7}\2\2\u0433\u00d3"+ - "\3\2\2\2\u0434\u0435\7\177\2\2\u0435\u0436\3\2\2\2\u0436\u0437\bj\2\2"+ - "\u0437\u00d5\3\2\2\2\u0438\u0439\7]\2\2\u0439\u00d7\3\2\2\2\u043a\u043b"+ - "\7_\2\2\u043b\u043c\3\2\2\2\u043c\u043d\bl\2\2\u043d\u00d9\3\2\2\2\u043e"+ - "\u043f\7?\2\2\u043f\u00db\3\2\2\2\u0440\u0441\7.\2\2\u0441\u00dd\3\2\2"+ - "\2\u0442\u0443\7=\2\2\u0443\u00df\3\2\2\2\u0444\u0445\7<\2\2\u0445\u00e1"+ - "\3\2\2\2\u0446\u0447\7\60\2\2\u0447\u00e3\3\2\2\2\u0448\u0449\7-\2\2\u0449"+ - "\u044a\7-\2\2\u044a\u044b\3\2\2\2\u044b\u044c\br\2\2\u044c\u00e5\3\2\2"+ - "\2\u044d\u044e\7/\2\2\u044e\u044f\7/\2\2\u044f\u0450\3\2\2\2\u0450\u0451"+ - "\bs\2\2\u0451\u00e7\3\2\2\2\u0452\u0453\7<\2\2\u0453\u0454\7?\2\2\u0454"+ - "\u00e9\3\2\2\2\u0455\u0456\7\60\2\2\u0456\u0457\7\60\2\2\u0457\u0458\7"+ - "\60\2\2\u0458\u00eb\3\2\2\2\u0459\u045a\7~\2\2\u045a\u045b\7~\2\2\u045b"+ - "\u00ed\3\2\2\2\u045c\u045d\7(\2\2\u045d\u045e\7(\2\2\u045e\u00ef\3\2\2"+ - "\2\u045f\u0460\7?\2\2\u0460\u0461\7?\2\2\u0461\u00f1\3\2\2\2\u0462\u0463"+ - "\7#\2\2\u0463\u0464\7?\2\2\u0464\u00f3\3\2\2\2\u0465\u0466\7>\2\2\u0466"+ - "\u00f5\3\2\2\2\u0467\u0468\7>\2\2\u0468\u0469\7?\2\2\u0469\u00f7\3\2\2"+ - "\2\u046a\u046b\7@\2\2\u046b\u00f9\3\2\2\2\u046c\u046d\7@\2\2\u046d\u046e"+ - "\7?\2\2\u046e\u00fb\3\2\2\2\u046f\u0470\7~\2\2\u0470\u00fd\3\2\2\2\u0471"+ - "\u0472\7\61\2\2\u0472\u00ff\3\2\2\2\u0473\u0474\7\'\2\2\u0474\u0101\3"+ - "\2\2\2\u0475\u0476\7>\2\2\u0476\u0477\7>\2\2\u0477\u0103\3\2\2\2\u0478"+ - "\u0479\7@\2\2\u0479\u047a\7@\2\2\u047a\u0105\3\2\2\2\u047b\u047c\7(\2"+ - "\2\u047c\u047d\7`\2\2\u047d\u0107\3\2\2\2\u047e\u047f\7#\2\2\u047f\u0109"+ - "\3\2\2\2\u0480\u0481\7-\2\2\u0481\u010b\3\2\2\2\u0482\u0483\7/\2\2\u0483"+ - "\u010d\3\2\2\2\u0484\u0485\7`\2\2\u0485\u010f\3\2\2\2\u0486\u0487\7,\2"+ - "\2\u0487\u0111\3\2\2\2\u0488\u0489\7(\2\2\u0489\u0113\3\2\2\2\u048a\u048b"+ - "\7>\2\2\u048b\u048c\7/\2\2\u048c\u0115\3\2\2\2\u048d\u0499\7\62\2\2\u048e"+ - "\u0495\t\2\2\2\u048f\u0491\7a\2\2\u0490\u048f\3\2\2\2\u0490\u0491\3\2"+ - "\2\2\u0491\u0492\3\2\2\2\u0492\u0494\t\3\2\2\u0493\u0490\3\2\2\2\u0494"+ - "\u0497\3\2\2\2\u0495\u0493\3\2\2\2\u0495\u0496\3\2\2\2\u0496\u0499\3\2"+ - "\2\2\u0497\u0495\3\2\2\2\u0498\u048d\3\2\2\2\u0498\u048e\3\2\2\2\u0499"+ - "\u049a\3\2\2\2\u049a\u049b\b\u008b\2\2\u049b\u0117\3\2\2\2\u049c\u049d"+ - "\7\62\2\2\u049d\u04a2\t\4\2\2\u049e\u04a0\7a\2\2\u049f\u049e\3\2\2\2\u049f"+ - "\u04a0\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a3\5\u014a\u00a5\2\u04a2\u049f"+ - "\3\2\2\2\u04a3\u04a4\3\2\2\2\u04a4\u04a2\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5"+ - "\u04a6\3\2\2\2\u04a6\u04a7\b\u008c\2\2\u04a7\u0119\3\2\2\2\u04a8\u04aa"+ - "\7\62\2\2\u04a9\u04ab\t\5\2\2\u04aa\u04a9\3\2\2\2\u04aa\u04ab\3\2\2\2"+ - "\u04ab\u04b0\3\2\2\2\u04ac\u04ae\7a\2\2\u04ad\u04ac\3\2\2\2\u04ad\u04ae"+ - "\3\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04b1\5\u0146\u00a3\2\u04b0\u04ad\3"+ - "\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b0\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3"+ - "\u04b4\3\2\2\2\u04b4\u04b5\b\u008d\2\2\u04b5\u011b\3\2\2\2\u04b6\u04b7"+ - "\7\62\2\2\u04b7\u04bc\t\6\2\2\u04b8\u04ba\7a\2\2\u04b9\u04b8\3\2\2\2\u04b9"+ - "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0148\u00a4\2\u04bc\u04b9"+ - "\3\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04bc\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf"+ - "\u04c0\3\2\2\2\u04c0\u04c1\b\u008e\2\2\u04c1\u011d\3\2\2\2\u04c2\u04c3"+ - "\7\62\2\2\u04c3\u04c4\t\6\2\2\u04c4\u04c5\5\u0120\u0090\2\u04c5\u04c6"+ - "\5\u0122\u0091\2\u04c6\u011f\3\2\2\2\u04c7\u04c9\7a\2\2\u04c8\u04c7\3"+ - "\2\2\2\u04c8\u04c9\3\2\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04cc\5\u0148\u00a4"+ - "\2\u04cb\u04c8\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04cb\3\2\2\2\u04cd\u04ce"+ - "\3\2\2\2\u04ce\u04d9\3\2\2\2\u04cf\u04d6\7\60\2\2\u04d0\u04d2\7a\2\2\u04d1"+ - "\u04d0\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u04d3\3\2\2\2\u04d3\u04d5\5\u0148"+ - "\u00a4\2\u04d4\u04d1\3\2\2\2\u04d5\u04d8\3\2\2\2\u04d6\u04d4\3\2\2\2\u04d6"+ - "\u04d7\3\2\2\2\u04d7\u04da\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d9\u04cf\3\2"+ - "\2\2\u04d9\u04da\3\2\2\2\u04da\u04e7\3\2\2\2\u04db\u04dc\7\60\2\2\u04dc"+ - "\u04e3\5\u0148\u00a4\2\u04dd\u04df\7a\2\2\u04de\u04dd\3\2\2\2\u04de\u04df"+ - "\3\2\2\2\u04df\u04e0\3\2\2\2\u04e0\u04e2\5\u0148\u00a4\2\u04e1\u04de\3"+ - "\2\2\2\u04e2\u04e5\3\2\2\2\u04e3\u04e1\3\2\2\2\u04e3\u04e4\3\2\2\2\u04e4"+ - "\u04e7\3\2\2\2\u04e5\u04e3\3\2\2\2\u04e6\u04cb\3\2\2\2\u04e6\u04db\3\2"+ - "\2\2\u04e7\u0121\3\2\2\2\u04e8\u04e9\t\7\2\2\u04e9\u04ea\t\b\2\2\u04ea"+ - "\u04eb\5\u0144\u00a2\2\u04eb\u0123\3\2\2\2\u04ec\u04f2\5\u0116\u008b\2"+ - "\u04ed\u04f2\5\u0118\u008c\2\u04ee\u04f2\5\u011a\u008d\2\u04ef\u04f2\5"+ - "\u011c\u008e\2\u04f0\u04f2\5\4\2\2\u04f1\u04ec\3\2\2\2\u04f1\u04ed\3\2"+ - "\2\2\u04f1\u04ee\3\2\2\2\u04f1\u04ef\3\2\2\2\u04f1\u04f0\3\2\2\2\u04f2"+ - "\u04f3\3\2\2\2\u04f3\u04f4\7k\2\2\u04f4\u04f5\3\2\2\2\u04f5\u04f6\b\u0092"+ - "\2\2\u04f6\u0125\3\2\2\2\u04f7\u04fa\7)\2\2\u04f8\u04fb\5\u0140\u00a0"+ - "\2\u04f9\u04fb\5\u012a\u0095\2\u04fa\u04f8\3\2\2\2\u04fa\u04f9\3\2\2\2"+ - "\u04fb\u04fc\3\2\2\2\u04fc\u04fd\7)\2\2\u04fd\u0127\3\2\2\2\u04fe\u04ff"+ - "\5\u0126\u0093\2\u04ff\u0500\3\2\2\2\u0500\u0501\b\u0094\2\2\u0501\u0129"+ - "\3\2\2\2\u0502\u0505\5\u012c\u0096\2\u0503\u0505\5\u012e\u0097\2\u0504"+ - "\u0502\3\2\2\2\u0504\u0503\3\2\2\2\u0505\u012b\3\2\2\2\u0506\u0507\7^"+ - "\2\2\u0507\u0508\5\u0146\u00a3\2\u0508\u0509\5\u0146\u00a3\2\u0509\u050a"+ - "\5\u0146\u00a3\2\u050a\u012d\3\2\2\2\u050b\u050c\7^\2\2\u050c\u050d\7"+ - "z\2\2\u050d\u050e\5\u0148\u00a4\2\u050e\u050f\5\u0148\u00a4\2\u050f\u012f"+ - "\3\2\2\2\u0510\u0511\7^\2\2\u0511\u0512\7w\2\2\u0512\u0513\5\u0148\u00a4"+ - "\2\u0513\u0514\5\u0148\u00a4\2\u0514\u0515\5\u0148\u00a4\2\u0515\u0516"+ - "\5\u0148\u00a4\2\u0516\u0131\3\2\2\2\u0517\u0518\7^\2\2\u0518\u0519\7"+ - "W\2\2\u0519\u051a\5\u0148\u00a4\2\u051a\u051b\5\u0148\u00a4\2\u051b\u051c"+ - "\5\u0148\u00a4\2\u051c\u051d\5\u0148\u00a4\2\u051d\u051e\5\u0148\u00a4"+ - "\2\u051e\u051f\5\u0148\u00a4\2\u051f\u0520\5\u0148\u00a4\2\u0520\u0521"+ - "\5\u0148\u00a4\2\u0521\u0133\3\2\2\2\u0522\u0526\7b\2\2\u0523\u0525\n"+ - "\t\2\2\u0524\u0523\3\2\2\2\u0525\u0528\3\2\2\2\u0526\u0524\3\2\2\2\u0526"+ - "\u0527\3\2\2\2\u0527\u0529\3\2\2\2\u0528\u0526\3\2\2\2\u0529\u052a\7b"+ - "\2\2\u052a\u052b\3\2\2\2\u052b\u052c\b\u009a\2\2\u052c\u0135\3\2\2\2\u052d"+ - "\u0532\7$\2\2\u052e\u0531\n\n\2\2\u052f\u0531\5\u0142\u00a1\2\u0530\u052e"+ - "\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0534\3\2\2\2\u0532\u0530\3\2\2\2\u0532"+ - "\u0533\3\2\2\2\u0533\u0535\3\2\2\2\u0534\u0532\3\2\2\2\u0535\u0536\7$"+ - "\2\2\u0536\u0537\3\2\2\2\u0537\u0538\b\u009b\2\2\u0538\u0137\3\2\2\2\u0539"+ - "\u053b\t\13\2\2\u053a\u0539\3\2\2\2\u053b\u053c\3\2\2\2\u053c\u053a\3"+ - "\2\2\2\u053c\u053d\3\2\2\2\u053d\u053e\3\2\2\2\u053e\u053f\b\u009c\3\2"+ - "\u053f\u0139\3\2\2\2\u0540\u0541\7\61\2\2\u0541\u0542\7,\2\2\u0542\u0546"+ - "\3\2\2\2\u0543\u0545\13\2\2\2\u0544\u0543\3\2\2\2\u0545\u0548\3\2\2\2"+ - "\u0546\u0547\3\2\2\2\u0546\u0544\3\2\2\2\u0547\u0549\3\2\2\2\u0548\u0546"+ - "\3\2\2\2\u0549\u054a\7,\2\2\u054a\u054b\7\61\2\2\u054b\u054c\3\2\2\2\u054c"+ - "\u054d\b\u009d\3\2\u054d\u013b\3\2\2\2\u054e\u0550\t\f\2\2\u054f\u054e"+ - "\3\2\2\2\u0550\u0551\3\2\2\2\u0551\u054f\3\2\2\2\u0551\u0552\3\2\2\2\u0552"+ - "\u0553\3\2\2\2\u0553\u0554\b\u009e\3\2\u0554\u013d\3\2\2\2\u0555\u0556"+ - "\7\61\2\2\u0556\u0557\7\61\2\2\u0557\u055b\3\2\2\2\u0558\u055a\n\f\2\2"+ - "\u0559\u0558\3\2\2\2\u055a\u055d\3\2\2\2\u055b\u0559\3\2\2\2\u055b\u055c"+ - "\3\2\2\2\u055c\u055e\3\2\2\2\u055d\u055b\3\2\2\2\u055e\u055f\b\u009f\3"+ - "\2\u055f\u013f\3\2\2\2\u0560\u0565\n\r\2\2\u0561\u0565\5\u0130\u0098\2"+ - "\u0562\u0565\5\u0132\u0099\2\u0563\u0565\5\u0142\u00a1\2\u0564\u0560\3"+ - "\2\2\2\u0564\u0561\3\2\2\2\u0564\u0562\3\2\2\2\u0564\u0563\3\2\2\2\u0565"+ - "\u0141\3\2\2\2\u0566\u0580\7^\2\2\u0567\u0568\7w\2\2\u0568\u0569\5\u0148"+ - "\u00a4\2\u0569\u056a\5\u0148\u00a4\2\u056a\u056b\5\u0148\u00a4\2\u056b"+ - "\u056c\5\u0148\u00a4\2\u056c\u0581\3\2\2\2\u056d\u056e\7W\2\2\u056e\u056f"+ - "\5\u0148\u00a4\2\u056f\u0570\5\u0148\u00a4\2\u0570\u0571\5\u0148\u00a4"+ - "\2\u0571\u0572\5\u0148\u00a4\2\u0572\u0573\5\u0148\u00a4\2\u0573\u0574"+ - "\5\u0148\u00a4\2\u0574\u0575\5\u0148\u00a4\2\u0575\u0576\5\u0148\u00a4"+ - "\2\u0576\u0581\3\2\2\2\u0577\u0581\t\16\2\2\u0578\u0579\5\u0146\u00a3"+ - "\2\u0579\u057a\5\u0146\u00a3\2\u057a\u057b\5\u0146\u00a3\2\u057b\u0581"+ - "\3\2\2\2\u057c\u057d\7z\2\2\u057d\u057e\5\u0148\u00a4\2\u057e\u057f\5"+ - "\u0148\u00a4\2\u057f\u0581\3\2\2\2\u0580\u0567\3\2\2\2\u0580\u056d\3\2"+ - "\2\2\u0580\u0577\3\2\2\2\u0580\u0578\3\2\2\2\u0580\u057c\3\2\2\2\u0581"+ - "\u0143\3\2\2\2\u0582\u0589\t\3\2\2\u0583\u0585\7a\2\2\u0584\u0583\3\2"+ - "\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0588\t\3\2\2\u0587"+ - "\u0584\3\2\2\2\u0588\u058b\3\2\2\2\u0589\u0587\3\2\2\2\u0589\u058a\3\2"+ - "\2\2\u058a\u0145\3\2\2\2\u058b\u0589\3\2\2\2\u058c\u058d\t\17\2\2\u058d"+ - "\u0147\3\2\2\2\u058e\u058f\t\20\2\2\u058f\u0149\3\2\2\2\u0590\u0591\t"+ - "\21\2\2\u0591\u014b\3\2\2\2\u0592\u0594\t\22\2\2\u0593\u0595\t\b\2\2\u0594"+ - "\u0593\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\3\2\2\2\u0596\u0597\5\u0144"+ - "\u00a2\2\u0597\u014d\3\2\2\2\u0598\u059b\5\u0152\u00a9\2\u0599\u059b\7"+ - "a\2\2\u059a\u0598\3\2\2\2\u059a\u0599\3\2\2\2\u059b\u014f\3\2\2\2\u059c"+ - "\u059d\t\23\2\2\u059d\u0151\3\2\2\2\u059e\u059f\t\24\2\2\u059f\u0153\3"+ - "\2\2\2\u05a0\u05a2\t\13\2\2\u05a1\u05a0\3\2\2\2\u05a2\u05a3\3\2\2\2\u05a3"+ - "\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05a6\b\u00aa"+ - "\3\2\u05a6\u0155\3\2\2\2\u05a7\u05a8\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9"+ - "\u05ad\3\2\2\2\u05aa\u05ac\n\f\2\2\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2"+ - "\2\2\u05ad\u05ae\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af"+ - "\u05ad\3\2\2\2\u05b0\u05b1\7,\2\2\u05b1\u05b2\7\61\2\2\u05b2\u05b3\3\2"+ - "\2\2\u05b3\u05b4\b\u00ab\3\2\u05b4\u0157\3\2\2\2\u05b5\u05b6\7\61\2\2"+ - "\u05b6\u05b7\7\61\2\2\u05b7\u05bb\3\2\2\2\u05b8\u05ba\n\f\2\2\u05b9\u05b8"+ - "\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc"+ - "\u05be\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\b\u00ac\3\2\u05bf\u0159"+ - "\3\2\2\2\u05c0\u05c2\t\f\2\2\u05c1\u05c0\3\2\2\2\u05c2\u05c3\3\2\2\2\u05c3"+ - "\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05d3\3\2\2\2\u05c5\u05d3\7="+ - "\2\2\u05c6\u05c7\7\61\2\2\u05c7\u05c8\7,\2\2\u05c8\u05cc\3\2\2\2\u05c9"+ - "\u05cb\13\2\2\2\u05ca\u05c9\3\2\2\2\u05cb\u05ce\3\2\2\2\u05cc\u05cd\3"+ - "\2\2\2\u05cc\u05ca\3\2\2\2\u05cd\u05cf\3\2\2\2\u05ce\u05cc\3\2\2\2\u05cf"+ - "\u05d0\7,\2\2\u05d0\u05d3\7\61\2\2\u05d1\u05d3\7\2\2\3\u05d2\u05c1\3\2"+ - "\2\2\u05d2\u05c5\3\2\2\2\u05d2\u05c6\3\2\2\2\u05d2\u05d1\3\2\2\2\u05d3"+ - "\u05d4\3\2\2\2\u05d4\u05d5\b\u00ad\4\2\u05d5\u015b\3\2\2\2\u05d6\u05d7"+ - "\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u05d9\b\u00ae\4\2\u05d9\u05da\b\u00ae"+ - "\3\2\u05da\u015d\3\2\2\2\64\2\3\u0160\u0168\u016b\u016e\u0174\u0176\u0425"+ - "\u0427\u0490\u0495\u0498\u049f\u04a4\u04aa\u04ad\u04b2\u04b9\u04be\u04c8"+ - "\u04cd\u04d1\u04d6\u04d9\u04de\u04e3\u04e6\u04f1\u04fa\u0504\u0526\u0530"+ - "\u0532\u053c\u0546\u0551\u055b\u0564\u0580\u0584\u0589\u0594\u059a\u05a3"+ - "\u05ad\u05bb\u05c3\u05cc\u05d2\5\4\3\2\2\3\2\4\2\2"; + "\t\u00ad\4\u00ae\t\u00ae\4\u00af\t\u00af\3\2\3\2\5\2\u0163\n\2\3\2\3\2"+ + "\3\3\3\3\3\3\3\3\5\3\u016b\n\3\3\3\5\3\u016e\n\3\3\3\5\3\u0171\n\3\3\3"+ + "\3\3\3\3\3\3\5\3\u0177\n\3\5\3\u0179\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3"+ + "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7"+ + "\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3"+ + "\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3"+ + "\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r"+ + "\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16"+ + "\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20"+ + "\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22"+ + "\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24"+ + "\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26"+ + "\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31"+ + "\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32"+ + "\3\32\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35"+ + "\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!"+ + "\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\""+ + "\3#\3#\3#\3#\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3&\3&\3\'\3\'\3\'\3(\3(\3("+ + "\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,"+ + "\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/"+ + "\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61"+ + "\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63"+ + "\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65"+ + "\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67"+ + "\3\67\3\67\3\67\38\38\38\38\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3:"+ + "\3:\3:\3:\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<"+ + "\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3A\3A"+ + "\3A\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C"+ + "\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E"+ + "\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G"+ + "\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3J\3J"+ + "\3J\3J\3K\3K\3K\3K\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N"+ + "\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q"+ + "\3Q\3Q\3Q\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3T\3U\3U\3U\3U\3V\3V"+ + "\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z"+ + "\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]"+ + "\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`"+ + "\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c"+ + "\3c\3d\3d\3d\3d\3d\3d\3d\3d\3d\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3g\3g\3g"+ + "\7g\u042e\ng\fg\16g\u0431\13g\3g\3g\3h\3h\3i\3i\3i\3i\3j\3j\3k\3k\3k\3"+ + "k\3l\3l\3m\3m\3m\3m\3n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3s\3s\3s\3s\3s\3t\3"+ + "t\3t\3t\3t\3u\3u\3u\3v\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y\3y\3y\3z\3z\3z\3"+ + "{\3{\3|\3|\3|\3}\3}\3~\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081"+ + "\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084"+ + "\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0089"+ + "\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c"+ + "\5\u008c\u0499\n\u008c\3\u008c\7\u008c\u049c\n\u008c\f\u008c\16\u008c"+ + "\u049f\13\u008c\5\u008c\u04a1\n\u008c\3\u008c\3\u008c\3\u008d\3\u008d"+ + "\3\u008d\5\u008d\u04a8\n\u008d\3\u008d\6\u008d\u04ab\n\u008d\r\u008d\16"+ + "\u008d\u04ac\3\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u04b3\n\u008e\3\u008e"+ + "\5\u008e\u04b6\n\u008e\3\u008e\6\u008e\u04b9\n\u008e\r\u008e\16\u008e"+ + "\u04ba\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\5\u008f\u04c2\n\u008f\3"+ + "\u008f\6\u008f\u04c5\n\u008f\r\u008f\16\u008f\u04c6\3\u008f\3\u008f\3"+ + "\u0090\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\5\u0091\u04d1\n\u0091\3"+ + "\u0091\6\u0091\u04d4\n\u0091\r\u0091\16\u0091\u04d5\3\u0091\3\u0091\5"+ + "\u0091\u04da\n\u0091\3\u0091\7\u0091\u04dd\n\u0091\f\u0091\16\u0091\u04e0"+ + "\13\u0091\5\u0091\u04e2\n\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u04e7"+ + "\n\u0091\3\u0091\7\u0091\u04ea\n\u0091\f\u0091\16\u0091\u04ed\13\u0091"+ + "\5\u0091\u04ef\n\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+ + "\3\u0093\3\u0093\3\u0093\5\u0093\u04fa\n\u0093\3\u0093\3\u0093\3\u0093"+ + "\3\u0093\3\u0094\3\u0094\3\u0094\5\u0094\u0503\n\u0094\3\u0094\3\u0094"+ + "\3\u0095\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\5\u0096\u050d\n\u0096"+ + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098\3\u0098"+ + "\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a"+ + "\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a"+ + "\3\u009a\3\u009b\3\u009b\7\u009b\u052d\n\u009b\f\u009b\16\u009b\u0530"+ + "\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\7\u009c"+ + "\u0539\n\u009c\f\u009c\16\u009c\u053c\13\u009c\3\u009c\3\u009c\3\u009c"+ + "\3\u009c\3\u009d\6\u009d\u0543\n\u009d\r\u009d\16\u009d\u0544\3\u009d"+ + "\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\7\u009e\u054d\n\u009e\f\u009e"+ + "\16\u009e\u0550\13\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f"+ + "\6\u009f\u0558\n\u009f\r\u009f\16\u009f\u0559\3\u009f\3\u009f\3\u00a0"+ + "\3\u00a0\3\u00a0\3\u00a0\7\u00a0\u0562\n\u00a0\f\u00a0\16\u00a0\u0565"+ + "\13\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a1\5\u00a1\u056d"+ + "\n\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2"+ + "\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2"+ + "\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2\3\u00a2"+ + "\5\u00a2\u0589\n\u00a2\3\u00a3\3\u00a3\5\u00a3\u058d\n\u00a3\3\u00a3\7"+ + "\u00a3\u0590\n\u00a3\f\u00a3\16\u00a3\u0593\13\u00a3\3\u00a4\3\u00a4\3"+ + "\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a7\3\u00a7\5\u00a7\u059d\n\u00a7\3"+ + "\u00a7\3\u00a7\3\u00a8\3\u00a8\5\u00a8\u05a3\n\u00a8\3\u00a9\3\u00a9\3"+ + "\u00aa\3\u00aa\3\u00ab\6\u00ab\u05aa\n\u00ab\r\u00ab\16\u00ab\u05ab\3"+ + "\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac\7\u00ac\u05b4\n\u00ac\f"+ + "\u00ac\16\u00ac\u05b7\13\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+ + "\3\u00ad\3\u00ad\3\u00ad\3\u00ad\7\u00ad\u05c2\n\u00ad\f\u00ad\16\u00ad"+ + "\u05c5\13\u00ad\3\u00ad\3\u00ad\3\u00ae\6\u00ae\u05ca\n\u00ae\r\u00ae"+ + "\16\u00ae\u05cb\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\7\u00ae\u05d3"+ + "\n\u00ae\f\u00ae\16\u00ae\u05d6\13\u00ae\3\u00ae\3\u00ae\3\u00ae\5\u00ae"+ + "\u05db\n\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af\3\u00af\3\u00af"+ + "\5\u054e\u05b5\u05d4\2\u00b0\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13"+ + "\26\f\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62"+ + "\32\64\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61"+ + "b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086"+ + "D\u0088E\u008aF\u008cG\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009a"+ + "N\u009cO\u009eP\u00a0Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00acW\u00ae"+ + "X\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0a\u00c2"+ + "b\u00c4c\u00c6d\u00c8e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4k\u00d6"+ + "l\u00d8m\u00dan\u00dco\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8u\u00ea"+ + "v\u00ecw\u00eex\u00f0y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe"+ + "\u0080\u0100\u0081\u0102\u0082\u0104\u0083\u0106\u0084\u0108\u0085\u010a"+ + "\u0086\u010c\u0087\u010e\u0088\u0110\u0089\u0112\u008a\u0114\u008b\u0116"+ + "\u008c\u0118\u008d\u011a\u008e\u011c\u008f\u011e\u0090\u0120\u0091\u0122"+ + "\2\u0124\2\u0126\u0092\u0128\2\u012a\u0093\u012c\u0094\u012e\u0095\u0130"+ + "\u0096\u0132\u0097\u0134\u0098\u0136\u0099\u0138\u009a\u013a\u009b\u013c"+ + "\u009c\u013e\u009d\u0140\u009e\u0142\2\u0144\2\u0146\2\u0148\2\u014a\2"+ + "\u014c\2\u014e\2\u0150\2\u0152\2\u0154\2\u0156\u009f\u0158\u00a0\u015a"+ + "\u00a1\u015c\u00a2\u015e\u00a3\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQ"+ + "qq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5"+ + "\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4"+ + "\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968"+ + "\2\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71"+ + "\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8"+ + "\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b"+ + "\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2"+ + "\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb"+ + "\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902"+ + "\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb"+ + "\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138"+ + "\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db"+ + "\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52"+ + "\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801"+ + "\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7"+ + "\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8"+ + "\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376"+ + "\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a"+ + "\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483"+ + "\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2"+ + "\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5"+ + "\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701"+ + "\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3"+ + "\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c"+ + "\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c"+ + "\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952"+ + "\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992"+ + "\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf"+ + "\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3"+ + "\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c"+ + "\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e"+ + "\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95"+ + "\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf"+ + "\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11"+ + "\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b"+ + "\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85"+ + "\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c"+ + "\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0"+ + "\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a"+ + "\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82"+ + "\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5"+ + "\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3"+ + "\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f"+ + "\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87"+ + "\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8"+ + "\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86"+ + "\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99"+ + "\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac"+ + "\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6"+ + "\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b"+ + "\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057"+ + "\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077"+ + "\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf"+ + "\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a"+ + "\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2"+ + "\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca"+ + "\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391"+ + "\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683"+ + "\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713"+ + "\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782"+ + "\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886"+ + "\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952"+ + "\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18"+ + "\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85"+ + "\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51"+ + "\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7"+ + "\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47"+ + "\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f"+ + "\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0"+ + "\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2"+ + "\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081"+ + "\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117"+ + "\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a"+ + "\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150"+ + "\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6"+ + "\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f"+ + "\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8"+ + "\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca"+ + "\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008"+ + "\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3"+ + "\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc"+ + "\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2"+ + "\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670"+ + "\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d"+ + "\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c"+ + "\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd"+ + "\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e"+ + "\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc"+ + "\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78"+ + "\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb"+ + "\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec"+ + "\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22"+ + "\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4"+ + "\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72"+ + "\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a"+ + "\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45"+ + "\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9"+ + "\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43"+ + "\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9"+ + "\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc"+ + "\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344"+ + "\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1"+ + "\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532"+ + "\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807"+ + "\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841"+ + "\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7"+ + "\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02"+ + "\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e"+ + "\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42"+ + "\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4"+ + "\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105"+ + "\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6"+ + "\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282"+ + "\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa"+ + "\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c"+ + "\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352"+ + "\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6"+ + "\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631"+ + "\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901"+ + "\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52"+ + "\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c"+ + "\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b"+ + "\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002"+ + "\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef"+ + "\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02"+ + "\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee"+ + "\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72"+ + "\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e"+ + "\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0"+ + "\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c"+ + "\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542"+ + "\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2"+ + "\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738"+ + "\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4"+ + "\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07"+ + "\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34"+ + "\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49"+ + "\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54"+ + "\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f"+ + "\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c"+ + "\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82"+ + "\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd"+ + "\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4"+ + "\uebe2\4\uf802\4\ufa1f\4\u060e\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n"+ + "\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2"+ + "\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2"+ + " \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3"+ + "\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2"+ + "\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D"+ + "\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2"+ + "\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2"+ + "\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2"+ + "j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3"+ + "\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082"+ + "\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2"+ + "\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094"+ + "\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2"+ + "\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6"+ + "\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2"+ + "\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8"+ + "\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2"+ + "\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca"+ + "\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2"+ + "\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc"+ + "\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2"+ + "\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee"+ + "\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2"+ + "\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100"+ + "\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2"+ + "\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112"+ + "\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011a\3\2\2"+ + "\2\2\u011c\3\2\2\2\2\u011e\3\2\2\2\2\u0120\3\2\2\2\2\u0126\3\2\2\2\2\u012a"+ + "\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2"+ + "\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\2\u013a\3\2\2\2\2\u013c"+ + "\3\2\2\2\2\u013e\3\2\2\2\2\u0140\3\2\2\2\3\u0156\3\2\2\2\3\u0158\3\2\2"+ + "\2\3\u015a\3\2\2\2\3\u015c\3\2\2\2\3\u015e\3\2\2\2\4\u0162\3\2\2\2\6\u0178"+ + "\3\2\2\2\b\u017a\3\2\2\2\n\u0181\3\2\2\2\f\u0189\3\2\2\2\16\u0190\3\2"+ + "\2\2\20\u0197\3\2\2\2\22\u019e\3\2\2\2\24\u01a5\3\2\2\2\26\u01ae\3\2\2"+ + "\2\30\u01b8\3\2\2\2\32\u01c0\3\2\2\2\34\u01ca\3\2\2\2\36\u01d6\3\2\2\2"+ + " \u01dd\3\2\2\2\"\u01e8\3\2\2\2$\u01eb\3\2\2\2&\u01f1\3\2\2\2(\u01fa\3"+ + "\2\2\2*\u01ff\3\2\2\2,\u0206\3\2\2\2.\u020d\3\2\2\2\60\u0213\3\2\2\2\62"+ + "\u0218\3\2\2\2\64\u021f\3\2\2\2\66\u0229\3\2\2\28\u022d\3\2\2\2:\u0233"+ + "\3\2\2\2<\u0236\3\2\2\2>\u0238\3\2\2\2@\u023f\3\2\2\2B\u0245\3\2\2\2D"+ + "\u0252\3\2\2\2F\u025b\3\2\2\2H\u025f\3\2\2\2J\u0263\3\2\2\2L\u0269\3\2"+ + "\2\2N\u026b\3\2\2\2P\u026e\3\2\2\2R\u0273\3\2\2\2T\u0279\3\2\2\2V\u027f"+ + "\3\2\2\2X\u0286\3\2\2\2Z\u028d\3\2\2\2\\\u0296\3\2\2\2^\u029c\3\2\2\2"+ + "`\u02a2\3\2\2\2b\u02a9\3\2\2\2d\u02af\3\2\2\2f\u02b6\3\2\2\2h\u02bc\3"+ + "\2\2\2j\u02c5\3\2\2\2l\u02cd\3\2\2\2n\u02d3\3\2\2\2p\u02db\3\2\2\2r\u02e2"+ + "\3\2\2\2t\u02e7\3\2\2\2v\u02f0\3\2\2\2x\u02ff\3\2\2\2z\u0305\3\2\2\2|"+ + "\u030b\3\2\2\2~\u030f\3\2\2\2\u0080\u0312\3\2\2\2\u0082\u0319\3\2\2\2"+ + "\u0084\u0323\3\2\2\2\u0086\u032d\3\2\2\2\u0088\u0339\3\2\2\2\u008a\u0342"+ + "\3\2\2\2\u008c\u034c\3\2\2\2\u008e\u0354\3\2\2\2\u0090\u0360\3\2\2\2\u0092"+ + "\u036f\3\2\2\2\u0094\u0375\3\2\2\2\u0096\u0379\3\2\2\2\u0098\u037d\3\2"+ + "\2\2\u009a\u0382\3\2\2\2\u009c\u038a\3\2\2\2\u009e\u0392\3\2\2\2\u00a0"+ + "\u0397\3\2\2\2\u00a2\u03a1\3\2\2\2\u00a4\u03a8\3\2\2\2\u00a6\u03ad\3\2"+ + "\2\2\u00a8\u03b3\3\2\2\2\u00aa\u03b6\3\2\2\2\u00ac\u03ba\3\2\2\2\u00ae"+ + "\u03c1\3\2\2\2\u00b0\u03c6\3\2\2\2\u00b2\u03cb\3\2\2\2\u00b4\u03d0\3\2"+ + "\2\2\u00b6\u03d8\3\2\2\2\u00b8\u03df\3\2\2\2\u00ba\u03e5\3\2\2\2\u00bc"+ + "\u03f3\3\2\2\2\u00be\u03f6\3\2\2\2\u00c0\u03fc\3\2\2\2\u00c2\u0401\3\2"+ + "\2\2\u00c4\u040c\3\2\2\2\u00c6\u0410\3\2\2\2\u00c8\u0417\3\2\2\2\u00ca"+ + "\u0420\3\2\2\2\u00cc\u0424\3\2\2\2\u00ce\u042a\3\2\2\2\u00d0\u0434\3\2"+ + "\2\2\u00d2\u0436\3\2\2\2\u00d4\u043a\3\2\2\2\u00d6\u043c\3\2\2\2\u00d8"+ + "\u0440\3\2\2\2\u00da\u0442\3\2\2\2\u00dc\u0446\3\2\2\2\u00de\u0448\3\2"+ + "\2\2\u00e0\u044a\3\2\2\2\u00e2\u044c\3\2\2\2\u00e4\u044e\3\2\2\2\u00e6"+ + "\u0450\3\2\2\2\u00e8\u0455\3\2\2\2\u00ea\u045a\3\2\2\2\u00ec\u045d\3\2"+ + "\2\2\u00ee\u0461\3\2\2\2\u00f0\u0464\3\2\2\2\u00f2\u0467\3\2\2\2\u00f4"+ + "\u046a\3\2\2\2\u00f6\u046d\3\2\2\2\u00f8\u046f\3\2\2\2\u00fa\u0472\3\2"+ + "\2\2\u00fc\u0474\3\2\2\2\u00fe\u0477\3\2\2\2\u0100\u0479\3\2\2\2\u0102"+ + "\u047b\3\2\2\2\u0104\u047d\3\2\2\2\u0106\u0480\3\2\2\2\u0108\u0483\3\2"+ + "\2\2\u010a\u0486\3\2\2\2\u010c\u0488\3\2\2\2\u010e\u048a\3\2\2\2\u0110"+ + "\u048c\3\2\2\2\u0112\u048e\3\2\2\2\u0114\u0490\3\2\2\2\u0116\u0492\3\2"+ + "\2\2\u0118\u04a0\3\2\2\2\u011a\u04a4\3\2\2\2\u011c\u04b0\3\2\2\2\u011e"+ + "\u04be\3\2\2\2\u0120\u04ca\3\2\2\2\u0122\u04ee\3\2\2\2\u0124\u04f0\3\2"+ + "\2\2\u0126\u04f9\3\2\2\2\u0128\u04ff\3\2\2\2\u012a\u0506\3\2\2\2\u012c"+ + "\u050c\3\2\2\2\u012e\u050e\3\2\2\2\u0130\u0513\3\2\2\2\u0132\u0518\3\2"+ + "\2\2\u0134\u051f\3\2\2\2\u0136\u052a\3\2\2\2\u0138\u0535\3\2\2\2\u013a"+ + "\u0542\3\2\2\2\u013c\u0548\3\2\2\2\u013e\u0557\3\2\2\2\u0140\u055d\3\2"+ + "\2\2\u0142\u056c\3\2\2\2\u0144\u056e\3\2\2\2\u0146\u058a\3\2\2\2\u0148"+ + "\u0594\3\2\2\2\u014a\u0596\3\2\2\2\u014c\u0598\3\2\2\2\u014e\u059a\3\2"+ + "\2\2\u0150\u05a2\3\2\2\2\u0152\u05a4\3\2\2\2\u0154\u05a6\3\2\2\2\u0156"+ + "\u05a9\3\2\2\2\u0158\u05af\3\2\2\2\u015a\u05bd\3\2\2\2\u015c\u05da\3\2"+ + "\2\2\u015e\u05de\3\2\2\2\u0160\u0163\5\6\3\2\u0161\u0163\5\u0120\u0090"+ + "\2\u0162\u0160\3\2\2\2\u0162\u0161\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0165"+ + "\b\2\2\2\u0165\5\3\2\2\2\u0166\u0170\5\u0146\u00a3\2\u0167\u0168\7\60"+ + "\2\2\u0168\u016a\6\3\2\2\u0169\u016b\5\u0146\u00a3\2\u016a\u0169\3\2\2"+ + "\2\u016a\u016b\3\2\2\2\u016b\u016d\3\2\2\2\u016c\u016e\5\u014e\u00a7\2"+ + "\u016d\u016c\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u0171\3\2\2\2\u016f\u0171"+ + "\5\u014e\u00a7\2\u0170\u0167\3\2\2\2\u0170\u016f\3\2\2\2\u0171\u0179\3"+ + "\2\2\2\u0172\u0173\7\60\2\2\u0173\u0174\6\3\3\2\u0174\u0176\5\u0146\u00a3"+ + "\2\u0175\u0177\5\u014e\u00a7\2\u0176\u0175\3\2\2\2\u0176\u0177\3\2\2\2"+ + "\u0177\u0179\3\2\2\2\u0178\u0166\3\2\2\2\u0178\u0172\3\2\2\2\u0179\7\3"+ + "\2\2\2\u017a\u017b\7v\2\2\u017b\u017c\7t\2\2\u017c\u017d\7w\2\2\u017d"+ + "\u017e\7g\2\2\u017e\u017f\3\2\2\2\u017f\u0180\b\4\2\2\u0180\t\3\2\2\2"+ + "\u0181\u0182\7h\2\2\u0182\u0183\7c\2\2\u0183\u0184\7n\2\2\u0184\u0185"+ + "\7u\2\2\u0185\u0186\7g\2\2\u0186\u0187\3\2\2\2\u0187\u0188\b\5\2\2\u0188"+ + "\13\3\2\2\2\u0189\u018a\7c\2\2\u018a\u018b\7u\2\2\u018b\u018c\7u\2\2\u018c"+ + "\u018d\7g\2\2\u018d\u018e\7t\2\2\u018e\u018f\7v\2\2\u018f\r\3\2\2\2\u0190"+ + "\u0191\7c\2\2\u0191\u0192\7u\2\2\u0192\u0193\7u\2\2\u0193\u0194\7w\2\2"+ + "\u0194\u0195\7o\2\2\u0195\u0196\7g\2\2\u0196\17\3\2\2\2\u0197\u0198\7"+ + "k\2\2\u0198\u0199\7p\2\2\u0199\u019a\7j\2\2\u019a\u019b\7c\2\2\u019b\u019c"+ + "\7n\2\2\u019c\u019d\7g\2\2\u019d\21\3\2\2\2\u019e\u019f\7g\2\2\u019f\u01a0"+ + "\7z\2\2\u01a0\u01a1\7j\2\2\u01a1\u01a2\7c\2\2\u01a2\u01a3\7n\2\2\u01a3"+ + "\u01a4\7g\2\2\u01a4\23\3\2\2\2\u01a5\u01a6\7t\2\2\u01a6\u01a7\7g\2\2\u01a7"+ + "\u01a8\7s\2\2\u01a8\u01a9\7w\2\2\u01a9\u01aa\7k\2\2\u01aa\u01ab\7t\2\2"+ + "\u01ab\u01ac\7g\2\2\u01ac\u01ad\7u\2\2\u01ad\25\3\2\2\2\u01ae\u01af\7"+ + "r\2\2\u01af\u01b0\7t\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2\7u\2\2\u01b2\u01b3"+ + "\7g\2\2\u01b3\u01b4\7t\2\2\u01b4\u01b5\7x\2\2\u01b5\u01b6\7g\2\2\u01b6"+ + "\u01b7\7u\2\2\u01b7\27\3\2\2\2\u01b8\u01b9\7g\2\2\u01b9\u01ba\7p\2\2\u01ba"+ + "\u01bb\7u\2\2\u01bb\u01bc\7w\2\2\u01bc\u01bd\7t\2\2\u01bd\u01be\7g\2\2"+ + "\u01be\u01bf\7u\2\2\u01bf\31\3\2\2\2\u01c0\u01c1\7k\2\2\u01c1\u01c2\7"+ + "p\2\2\u01c2\u01c3\7x\2\2\u01c3\u01c4\7c\2\2\u01c4\u01c5\7t\2\2\u01c5\u01c6"+ + "\7k\2\2\u01c6\u01c7\7c\2\2\u01c7\u01c8\7p\2\2\u01c8\u01c9\7v\2\2\u01c9"+ + "\33\3\2\2\2\u01ca\u01cb\7f\2\2\u01cb\u01cc\7g\2\2\u01cc\u01cd\7e\2\2\u01cd"+ + "\u01ce\7t\2\2\u01ce\u01cf\7g\2\2\u01cf\u01d0\7c\2\2\u01d0\u01d1\7u\2\2"+ + "\u01d1\u01d2\7g\2\2\u01d2\u01d3\7u\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d5"+ + "\b\16\2\2\u01d5\35\3\2\2\2\u01d6\u01d7\7r\2\2\u01d7\u01d8\7w\2\2\u01d8"+ + "\u01d9\7t\2\2\u01d9\u01da\7g\2\2\u01da\u01db\3\2\2\2\u01db\u01dc\b\17"+ + "\2\2\u01dc\37\3\2\2\2\u01dd\u01de\7k\2\2\u01de\u01df\7o\2\2\u01df\u01e0"+ + "\7r\2\2\u01e0\u01e1\7n\2\2\u01e1\u01e2\7g\2\2\u01e2\u01e3\7o\2\2\u01e3"+ + "\u01e4\7g\2\2\u01e4\u01e5\7p\2\2\u01e5\u01e6\7v\2\2\u01e6\u01e7\7u\2\2"+ + "\u01e7!\3\2\2\2\u01e8\u01e9\7c\2\2\u01e9\u01ea\7u\2\2\u01ea#\3\2\2\2\u01eb"+ + "\u01ec\7q\2\2\u01ec\u01ed\7n\2\2\u01ed\u01ee\7f\2\2\u01ee\u01ef\3\2\2"+ + "\2\u01ef\u01f0\b\22\2\2\u01f0%\3\2\2\2\u01f1\u01f2\7d\2\2\u01f2\u01f3"+ + "\7g\2\2\u01f3\u01f4\7h\2\2\u01f4\u01f5\7q\2\2\u01f5\u01f6\7t\2\2\u01f6"+ + "\u01f7\7g\2\2\u01f7\u01f8\3\2\2\2\u01f8\u01f9\b\23\2\2\u01f9\'\3\2\2\2"+ + "\u01fa\u01fb\7%\2\2\u01fb\u01fc\7n\2\2\u01fc\u01fd\7j\2\2\u01fd\u01fe"+ + "\7u\2\2\u01fe)\3\2\2\2\u01ff\u0200\7h\2\2\u0200\u0201\7q\2\2\u0201\u0202"+ + "\7t\2\2\u0202\u0203\7c\2\2\u0203\u0204\7n\2\2\u0204\u0205\7n\2\2\u0205"+ + "+\3\2\2\2\u0206\u0207\7g\2\2\u0207\u0208\7z\2\2\u0208\u0209\7k\2\2\u0209"+ + "\u020a\7u\2\2\u020a\u020b\7v\2\2\u020b\u020c\7u\2\2\u020c-\3\2\2\2\u020d"+ + "\u020e\7c\2\2\u020e\u020f\7e\2\2\u020f\u0210\7e\2\2\u0210\u0211\3\2\2"+ + "\2\u0211\u0212\b\27\2\2\u0212/\3\2\2\2\u0213\u0214\7h\2\2\u0214\u0215"+ + "\7q\2\2\u0215\u0216\7n\2\2\u0216\u0217\7f\2\2\u0217\61\3\2\2\2\u0218\u0219"+ + "\7w\2\2\u0219\u021a\7p\2\2\u021a\u021b\7h\2\2\u021b\u021c\7q\2\2\u021c"+ + "\u021d\7n\2\2\u021d\u021e\7f\2\2\u021e\63\3\2\2\2\u021f\u0220\7w\2\2\u0220"+ + "\u0221\7p\2\2\u0221\u0222\7h\2\2\u0222\u0223\7q\2\2\u0223\u0224\7n\2\2"+ + "\u0224\u0225\7f\2\2\u0225\u0226\7k\2\2\u0226\u0227\7p\2\2\u0227\u0228"+ + "\7i\2\2\u0228\65\3\2\2\2\u0229\u022a\7n\2\2\u022a\u022b\7g\2\2\u022b\u022c"+ + "\7v\2\2\u022c\67\3\2\2\2\u022d\u022e\7i\2\2\u022e\u022f\7j\2\2\u022f\u0230"+ + "\7q\2\2\u0230\u0231\7u\2\2\u0231\u0232\7v\2\2\u02329\3\2\2\2\u0233\u0234"+ + "\7k\2\2\u0234\u0235\7p\2\2\u0235;\3\2\2\2\u0236\u0237\7%\2\2\u0237=\3"+ + "\2\2\2\u0238\u0239\7u\2\2\u0239\u023a\7w\2\2\u023a\u023b\7d\2\2\u023b"+ + "\u023c\7u\2\2\u023c\u023d\7g\2\2\u023d\u023e\7v\2\2\u023e?\3\2\2\2\u023f"+ + "\u0240\7w\2\2\u0240\u0241\7p\2\2\u0241\u0242\7k\2\2\u0242\u0243\7q\2\2"+ + "\u0243\u0244\7p\2\2\u0244A\3\2\2\2\u0245\u0246\7k\2\2\u0246\u0247\7p\2"+ + "\2\u0247\u0248\7v\2\2\u0248\u0249\7g\2\2\u0249\u024a\7t\2\2\u024a\u024b"+ + "\7u\2\2\u024b\u024c\7g\2\2\u024c\u024d\7e\2\2\u024d\u024e\7v\2\2\u024e"+ + "\u024f\7k\2\2\u024f\u0250\7q\2\2\u0250\u0251\7p\2\2\u0251C\3\2\2\2\u0252"+ + "\u0253\7u\2\2\u0253\u0254\7g\2\2\u0254\u0255\7v\2\2\u0255\u0256\7o\2\2"+ + "\u0256\u0257\7k\2\2\u0257\u0258\7p\2\2\u0258\u0259\7w\2\2\u0259\u025a"+ + "\7u\2\2\u025aE\3\2\2\2\u025b\u025c\7?\2\2\u025c\u025d\7?\2\2\u025d\u025e"+ + "\7@\2\2\u025eG\3\2\2\2\u025f\u0260\7/\2\2\u0260\u0261\7/\2\2\u0261\u0262"+ + "\7,\2\2\u0262I\3\2\2\2\u0263\u0264\7c\2\2\u0264\u0265\7r\2\2\u0265\u0266"+ + "\7r\2\2\u0266\u0267\7n\2\2\u0267\u0268\7{\2\2\u0268K\3\2\2\2\u0269\u026a"+ + "\7A\2\2\u026aM\3\2\2\2\u026b\u026c\7#\2\2\u026c\u026d\7>\2\2\u026dO\3"+ + "\2\2\2\u026e\u026f\7#\2\2\u026f\u0270\7@\2\2\u0270\u0271\3\2\2\2\u0271"+ + "\u0272\b(\2\2\u0272Q\3\2\2\2\u0273\u0274\7u\2\2\u0274\u0275\7g\2\2\u0275"+ + "\u0276\7s\2\2\u0276\u0277\3\2\2\2\u0277\u0278\b)\2\2\u0278S\3\2\2\2\u0279"+ + "\u027a\7u\2\2\u027a\u027b\7g\2\2\u027b\u027c\7v\2\2\u027c\u027d\3\2\2"+ + "\2\u027d\u027e\b*\2\2\u027eU\3\2\2\2\u027f\u0280\7o\2\2\u0280\u0281\7"+ + "u\2\2\u0281\u0282\7g\2\2\u0282\u0283\7v\2\2\u0283\u0284\3\2\2\2\u0284"+ + "\u0285\b+\2\2\u0285W\3\2\2\2\u0286\u0287\7f\2\2\u0287\u0288\7k\2\2\u0288"+ + "\u0289\7e\2\2\u0289\u028a\7v\2\2\u028a\u028b\3\2\2\2\u028b\u028c\b,\2"+ + "\2\u028cY\3\2\2\2\u028d\u028e\7q\2\2\u028e\u028f\7r\2\2\u028f\u0290\7"+ + "v\2\2\u0290\u0291\7k\2\2\u0291\u0292\7q\2\2\u0292\u0293\7p\2\2\u0293\u0294"+ + "\3\2\2\2\u0294\u0295\b-\2\2\u0295[\3\2\2\2\u0296\u0297\7n\2\2\u0297\u0298"+ + "\7g\2\2\u0298\u0299\7p\2\2\u0299\u029a\3\2\2\2\u029a\u029b\b.\2\2\u029b"+ + "]\3\2\2\2\u029c\u029d\7p\2\2\u029d\u029e\7g\2\2\u029e\u029f\7y\2\2\u029f"+ + "\u02a0\3\2\2\2\u02a0\u02a1\b/\2\2\u02a1_\3\2\2\2\u02a2\u02a3\7o\2\2\u02a3"+ + "\u02a4\7c\2\2\u02a4\u02a5\7m\2\2\u02a5\u02a6\7g\2\2\u02a6\u02a7\3\2\2"+ + "\2\u02a7\u02a8\b\60\2\2\u02a8a\3\2\2\2\u02a9\u02aa\7e\2\2\u02aa\u02ab"+ + "\7c\2\2\u02ab\u02ac\7r\2\2\u02ac\u02ad\3\2\2\2\u02ad\u02ae\b\61\2\2\u02ae"+ + "c\3\2\2\2\u02af\u02b0\7u\2\2\u02b0\u02b1\7q\2\2\u02b1\u02b2\7o\2\2\u02b2"+ + "\u02b3\7g\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b5\b\62\2\2\u02b5e\3\2\2\2"+ + "\u02b6\u02b7\7i\2\2\u02b7\u02b8\7g\2\2\u02b8\u02b9\7v\2\2\u02b9\u02ba"+ + "\3\2\2\2\u02ba\u02bb\b\63\2\2\u02bbg\3\2\2\2\u02bc\u02bd\7f\2\2\u02bd"+ + "\u02be\7q\2\2\u02be\u02bf\7o\2\2\u02bf\u02c0\7c\2\2\u02c0\u02c1\7k\2\2"+ + "\u02c1\u02c2\7p\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c4\b\64\2\2\u02c4i\3"+ + "\2\2\2\u02c5\u02c6\7c\2\2\u02c6\u02c7\7z\2\2\u02c7\u02c8\7k\2\2\u02c8"+ + "\u02c9\7q\2\2\u02c9\u02ca\7o\2\2\u02ca\u02cb\3\2\2\2\u02cb\u02cc\b\65"+ + "\2\2\u02cck\3\2\2\2\u02cd\u02ce\7c\2\2\u02ce\u02cf\7f\2\2\u02cf\u02d0"+ + "\7v\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d2\b\66\2\2\u02d2m\3\2\2\2\u02d3"+ + "\u02d4\7o\2\2\u02d4\u02d5\7c\2\2\u02d5\u02d6\7v\2\2\u02d6\u02d7\7e\2\2"+ + "\u02d7\u02d8\7j\2\2\u02d8\u02d9\3\2\2\2\u02d9\u02da\b\67\2\2\u02dao\3"+ + "\2\2\2\u02db\u02dc\7p\2\2\u02dc\u02dd\7q\2\2\u02dd\u02de\7p\2\2\u02de"+ + "\u02df\7g\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e1\b8\2\2\u02e1q\3\2\2\2\u02e2"+ + "\u02e3\7r\2\2\u02e3\u02e4\7t\2\2\u02e4\u02e5\7g\2\2\u02e5\u02e6\7f\2\2"+ + "\u02e6s\3\2\2\2\u02e7\u02e8\7v\2\2\u02e8\u02e9\7{\2\2\u02e9\u02ea\7r\2"+ + "\2\u02ea\u02eb\7g\2\2\u02eb\u02ec\7Q\2\2\u02ec\u02ed\7h\2\2\u02ed\u02ee"+ + "\3\2\2\2\u02ee\u02ef\b:\2\2\u02efu\3\2\2\2\u02f0\u02f1\7k\2\2\u02f1\u02f2"+ + "\7u\2\2\u02f2\u02f3\7E\2\2\u02f3\u02f4\7q\2\2\u02f4\u02f5\7o\2\2\u02f5"+ + "\u02f6\7r\2\2\u02f6\u02f7\7c\2\2\u02f7\u02f8\7t\2\2\u02f8\u02f9\7c\2\2"+ + "\u02f9\u02fa\7d\2\2\u02fa\u02fb\7n\2\2\u02fb\u02fc\7g\2\2\u02fc\u02fd"+ + "\3\2\2\2\u02fd\u02fe\b;\2\2\u02few\3\2\2\2\u02ff\u0300\7n\2\2\u0300\u0301"+ + "\7q\2\2\u0301\u0302\7y\2\2\u0302\u0303\3\2\2\2\u0303\u0304\b<\2\2\u0304"+ + "y\3\2\2\2\u0305\u0306\7u\2\2\u0306\u0307\7j\2\2\u0307\u0308\7c\2\2\u0308"+ + "\u0309\7t\2\2\u0309\u030a\7g\2\2\u030a{\3\2\2\2\u030b\u030c\7B\2\2\u030c"+ + "\u030d\3\2\2\2\u030d\u030e\b>\2\2\u030e}\3\2\2\2\u030f\u0310\7\60\2\2"+ + "\u0310\u0311\7\60\2\2\u0311\177\3\2\2\2\u0312\u0313\7u\2\2\u0313\u0314"+ + "\7j\2\2\u0314\u0315\7c\2\2\u0315\u0316\7t\2\2\u0316\u0317\7g\2\2\u0317"+ + "\u0318\7f\2\2\u0318\u0081\3\2\2\2\u0319\u031a\7g\2\2\u031a\u031b\7z\2"+ + "\2\u031b\u031c\7e\2\2\u031c\u031d\7n\2\2\u031d\u031e\7w\2\2\u031e\u031f"+ + "\7u\2\2\u031f\u0320\7k\2\2\u0320\u0321\7x\2\2\u0321\u0322\7g\2\2\u0322"+ + "\u0083\3\2\2\2\u0323\u0324\7r\2\2\u0324\u0325\7t\2\2\u0325\u0326\7g\2"+ + "\2\u0326\u0327\7f\2\2\u0327\u0328\7k\2\2\u0328\u0329\7e\2\2\u0329\u032a"+ + "\7c\2\2\u032a\u032b\7v\2\2\u032b\u032c\7g\2\2\u032c\u0085\3\2\2\2\u032d"+ + "\u032e\7y\2\2\u032e\u032f\7t\2\2\u032f\u0330\7k\2\2\u0330\u0331\7v\2\2"+ + "\u0331\u0332\7g\2\2\u0332\u0333\7R\2\2\u0333\u0334\7g\2\2\u0334\u0335"+ + "\7t\2\2\u0335\u0336\7o\2\2\u0336\u0337\3\2\2\2\u0337\u0338\bC\2\2\u0338"+ + "\u0087\3\2\2\2\u0339\u033a\7p\2\2\u033a\u033b\7q\2\2\u033b\u033c\7R\2"+ + "\2\u033c\u033d\7g\2\2\u033d\u033e\7t\2\2\u033e\u033f\7o\2\2\u033f\u0340"+ + "\3\2\2\2\u0340\u0341\bD\2\2\u0341\u0089\3\2\2\2\u0342\u0343\7v\2\2\u0343"+ + "\u0344\7t\2\2\u0344\u0345\7w\2\2\u0345\u0346\7u\2\2\u0346\u0347\7v\2\2"+ + "\u0347\u0348\7g\2\2\u0348\u0349\7f\2\2\u0349\u034a\3\2\2\2\u034a\u034b"+ + "\bE\2\2\u034b\u008b\3\2\2\2\u034c\u034d\7q\2\2\u034d\u034e\7w\2\2\u034e"+ + "\u034f\7v\2\2\u034f\u0350\7n\2\2\u0350\u0351\7k\2\2\u0351\u0352\7p\2\2"+ + "\u0352\u0353\7g\2\2\u0353\u008d\3\2\2\2\u0354\u0355\7k\2\2\u0355\u0356"+ + "\7p\2\2\u0356\u0357\7k\2\2\u0357\u0358\7v\2\2\u0358\u0359\7G\2\2\u0359"+ + "\u035a\7p\2\2\u035a\u035b\7u\2\2\u035b\u035c\7w\2\2\u035c\u035d\7t\2\2"+ + "\u035d\u035e\7g\2\2\u035e\u035f\7u\2\2\u035f\u008f\3\2\2\2\u0360\u0361"+ + "\7k\2\2\u0361\u0362\7o\2\2\u0362\u0363\7r\2\2\u0363\u0364\7q\2\2\u0364"+ + "\u0365\7t\2\2\u0365\u0366\7v\2\2\u0366\u0367\7T\2\2\u0367\u0368\7g\2\2"+ + "\u0368\u0369\7s\2\2\u0369\u036a\7w\2\2\u036a\u036b\7k\2\2\u036b\u036c"+ + "\7t\2\2\u036c\u036d\7g\2\2\u036d\u036e\7u\2\2\u036e\u0091\3\2\2\2\u036f"+ + "\u0370\7r\2\2\u0370\u0371\7t\2\2\u0371\u0372\7q\2\2\u0372\u0373\7q\2\2"+ + "\u0373\u0374\7h\2\2\u0374\u0093\3\2\2\2\u0375\u0376\7?\2\2\u0376\u0377"+ + "\7?\2\2\u0377\u0378\7?\2\2\u0378\u0095\3\2\2\2\u0379\u037a\7#\2\2\u037a"+ + "\u037b\7?\2\2\u037b\u037c\7?\2\2\u037c\u0097\3\2\2\2\u037d\u037e\7y\2"+ + "\2\u037e\u037f\7k\2\2\u037f\u0380\7v\2\2\u0380\u0381\7j\2\2\u0381\u0099"+ + "\3\2\2\2\u0382\u0383\7d\2\2\u0383\u0384\7t\2\2\u0384\u0385\7g\2\2\u0385"+ + "\u0386\7c\2\2\u0386\u0387\7m\2\2\u0387\u0388\3\2\2\2\u0388\u0389\bM\2"+ + "\2\u0389\u009b\3\2\2\2\u038a\u038b\7f\2\2\u038b\u038c\7g\2\2\u038c\u038d"+ + "\7h\2\2\u038d\u038e\7c\2\2\u038e\u038f\7w\2\2\u038f\u0390\7n\2\2\u0390"+ + "\u0391\7v\2\2\u0391\u009d\3\2\2\2\u0392\u0393\7h\2\2\u0393\u0394\7w\2"+ + "\2\u0394\u0395\7p\2\2\u0395\u0396\7e\2\2\u0396\u009f\3\2\2\2\u0397\u0398"+ + "\7k\2\2\u0398\u0399\7p\2\2\u0399\u039a\7v\2\2\u039a\u039b\7g\2\2\u039b"+ + "\u039c\7t\2\2\u039c\u039d\7h\2\2\u039d\u039e\7c\2\2\u039e\u039f\7e\2\2"+ + "\u039f\u03a0\7g\2\2\u03a0\u00a1\3\2\2\2\u03a1\u03a2\7u\2\2\u03a2\u03a3"+ + "\7g\2\2\u03a3\u03a4\7n\2\2\u03a4\u03a5\7g\2\2\u03a5\u03a6\7e\2\2\u03a6"+ + "\u03a7\7v\2\2\u03a7\u00a3\3\2\2\2\u03a8\u03a9\7e\2\2\u03a9\u03aa\7c\2"+ + "\2\u03aa\u03ab\7u\2\2\u03ab\u03ac\7g\2\2\u03ac\u00a5\3\2\2\2\u03ad\u03ae"+ + "\7f\2\2\u03ae\u03af\7g\2\2\u03af\u03b0\7h\2\2\u03b0\u03b1\7g\2\2\u03b1"+ + "\u03b2\7t\2\2\u03b2\u00a7\3\2\2\2\u03b3\u03b4\7i\2\2\u03b4\u03b5\7q\2"+ + "\2\u03b5\u00a9\3\2\2\2\u03b6\u03b7\7o\2\2\u03b7\u03b8\7c\2\2\u03b8\u03b9"+ + "\7r\2\2\u03b9\u00ab\3\2\2\2\u03ba\u03bb\7u\2\2\u03bb\u03bc\7v\2\2\u03bc"+ + "\u03bd\7t\2\2\u03bd\u03be\7w\2\2\u03be\u03bf\7e\2\2\u03bf\u03c0\7v\2\2"+ + "\u03c0\u00ad\3\2\2\2\u03c1\u03c2\7e\2\2\u03c2\u03c3\7j\2\2\u03c3\u03c4"+ + "\7c\2\2\u03c4\u03c5\7p\2\2\u03c5\u00af\3\2\2\2\u03c6\u03c7\7g\2\2\u03c7"+ + "\u03c8\7n\2\2\u03c8\u03c9\7u\2\2\u03c9\u03ca\7g\2\2\u03ca\u00b1\3\2\2"+ + "\2\u03cb\u03cc\7i\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7v\2\2\u03ce\u03cf"+ + "\7q\2\2\u03cf\u00b3\3\2\2\2\u03d0\u03d1\7r\2\2\u03d1\u03d2\7c\2\2\u03d2"+ + "\u03d3\7e\2\2\u03d3\u03d4\7m\2\2\u03d4\u03d5\7c\2\2\u03d5\u03d6\7i\2\2"+ + "\u03d6\u03d7\7g\2\2\u03d7\u00b5\3\2\2\2\u03d8\u03d9\7u\2\2\u03d9\u03da"+ + "\7y\2\2\u03da\u03db\7k\2\2\u03db\u03dc\7v\2\2\u03dc\u03dd\7e\2\2\u03dd"+ + "\u03de\7j\2\2\u03de\u00b7\3\2\2\2\u03df\u03e0\7e\2\2\u03e0\u03e1\7q\2"+ + "\2\u03e1\u03e2\7p\2\2\u03e2\u03e3\7u\2\2\u03e3\u03e4\7v\2\2\u03e4\u00b9"+ + "\3\2\2\2\u03e5\u03e6\7h\2\2\u03e6\u03e7\7c\2\2\u03e7\u03e8\7n\2\2\u03e8"+ + "\u03e9\7n\2\2\u03e9\u03ea\7v\2\2\u03ea\u03eb\7j\2\2\u03eb\u03ec\7t\2\2"+ + "\u03ec\u03ed\7q\2\2\u03ed\u03ee\7w\2\2\u03ee\u03ef\7i\2\2\u03ef\u03f0"+ + "\7j\2\2\u03f0\u03f1\3\2\2\2\u03f1\u03f2\b]\2\2\u03f2\u00bb\3\2\2\2\u03f3"+ + "\u03f4\7k\2\2\u03f4\u03f5\7h\2\2\u03f5\u00bd\3\2\2\2\u03f6\u03f7\7t\2"+ + "\2\u03f7\u03f8\7c\2\2\u03f8\u03f9\7p\2\2\u03f9\u03fa\7i\2\2\u03fa\u03fb"+ + "\7g\2\2\u03fb\u00bf\3\2\2\2\u03fc\u03fd\7v\2\2\u03fd\u03fe\7{\2\2\u03fe"+ + "\u03ff\7r\2\2\u03ff\u0400\7g\2\2\u0400\u00c1\3\2\2\2\u0401\u0402\7e\2"+ + "\2\u0402\u0403\7q\2\2\u0403\u0404\7p\2\2\u0404\u0405\7v\2\2\u0405\u0406"+ + "\7k\2\2\u0406\u0407\7p\2\2\u0407\u0408\7w\2\2\u0408\u0409\7g\2\2\u0409"+ + "\u040a\3\2\2\2\u040a\u040b\ba\2\2\u040b\u00c3\3\2\2\2\u040c\u040d\7h\2"+ + "\2\u040d\u040e\7q\2\2\u040e\u040f\7t\2\2\u040f\u00c5\3\2\2\2\u0410\u0411"+ + "\7k\2\2\u0411\u0412\7o\2\2\u0412\u0413\7r\2\2\u0413\u0414\7q\2\2\u0414"+ + "\u0415\7t\2\2\u0415\u0416\7v\2\2\u0416\u00c7\3\2\2\2\u0417\u0418\7t\2"+ + "\2\u0418\u0419\7g\2\2\u0419\u041a\7v\2\2\u041a\u041b\7w\2\2\u041b\u041c"+ + "\7t\2\2\u041c\u041d\7p\2\2\u041d\u041e\3\2\2\2\u041e\u041f\bd\2\2\u041f"+ + "\u00c9\3\2\2\2\u0420\u0421\7x\2\2\u0421\u0422\7c\2\2\u0422\u0423\7t\2"+ + "\2\u0423\u00cb\3\2\2\2\u0424\u0425\7p\2\2\u0425\u0426\7k\2\2\u0426\u0427"+ + "\7n\2\2\u0427\u0428\3\2\2\2\u0428\u0429\bf\2\2\u0429\u00cd\3\2\2\2\u042a"+ + "\u042f\5\u0150\u00a8\2\u042b\u042e\5\u0150\u00a8\2\u042c\u042e\5\u0152"+ + "\u00a9\2\u042d\u042b\3\2\2\2\u042d\u042c\3\2\2\2\u042e\u0431\3\2\2\2\u042f"+ + "\u042d\3\2\2\2\u042f\u0430\3\2\2\2\u0430\u0432\3\2\2\2\u0431\u042f\3\2"+ + "\2\2\u0432\u0433\bg\2\2\u0433\u00cf\3\2\2\2\u0434\u0435\7*\2\2\u0435\u00d1"+ + "\3\2\2\2\u0436\u0437\7+\2\2\u0437\u0438\3\2\2\2\u0438\u0439\bi\2\2\u0439"+ + "\u00d3\3\2\2\2\u043a\u043b\7}\2\2\u043b\u00d5\3\2\2\2\u043c\u043d\7\177"+ + "\2\2\u043d\u043e\3\2\2\2\u043e\u043f\bk\2\2\u043f\u00d7\3\2\2\2\u0440"+ + "\u0441\7]\2\2\u0441\u00d9\3\2\2\2\u0442\u0443\7_\2\2\u0443\u0444\3\2\2"+ + "\2\u0444\u0445\bm\2\2\u0445\u00db\3\2\2\2\u0446\u0447\7?\2\2\u0447\u00dd"+ + "\3\2\2\2\u0448\u0449\7.\2\2\u0449\u00df\3\2\2\2\u044a\u044b\7=\2\2\u044b"+ + "\u00e1\3\2\2\2\u044c\u044d\7<\2\2\u044d\u00e3\3\2\2\2\u044e\u044f\7\60"+ + "\2\2\u044f\u00e5\3\2\2\2\u0450\u0451\7-\2\2\u0451\u0452\7-\2\2\u0452\u0453"+ + "\3\2\2\2\u0453\u0454\bs\2\2\u0454\u00e7\3\2\2\2\u0455\u0456\7/\2\2\u0456"+ + "\u0457\7/\2\2\u0457\u0458\3\2\2\2\u0458\u0459\bt\2\2\u0459\u00e9\3\2\2"+ + "\2\u045a\u045b\7<\2\2\u045b\u045c\7?\2\2\u045c\u00eb\3\2\2\2\u045d\u045e"+ + "\7\60\2\2\u045e\u045f\7\60\2\2\u045f\u0460\7\60\2\2\u0460\u00ed\3\2\2"+ + "\2\u0461\u0462\7~\2\2\u0462\u0463\7~\2\2\u0463\u00ef\3\2\2\2\u0464\u0465"+ + "\7(\2\2\u0465\u0466\7(\2\2\u0466\u00f1\3\2\2\2\u0467\u0468\7?\2\2\u0468"+ + "\u0469\7?\2\2\u0469\u00f3\3\2\2\2\u046a\u046b\7#\2\2\u046b\u046c\7?\2"+ + "\2\u046c\u00f5\3\2\2\2\u046d\u046e\7>\2\2\u046e\u00f7\3\2\2\2\u046f\u0470"+ + "\7>\2\2\u0470\u0471\7?\2\2\u0471\u00f9\3\2\2\2\u0472\u0473\7@\2\2\u0473"+ + "\u00fb\3\2\2\2\u0474\u0475\7@\2\2\u0475\u0476\7?\2\2\u0476\u00fd\3\2\2"+ + "\2\u0477\u0478\7~\2\2\u0478\u00ff\3\2\2\2\u0479\u047a\7\61\2\2\u047a\u0101"+ + "\3\2\2\2\u047b\u047c\7\'\2\2\u047c\u0103\3\2\2\2\u047d\u047e\7>\2\2\u047e"+ + "\u047f\7>\2\2\u047f\u0105\3\2\2\2\u0480\u0481\7@\2\2\u0481\u0482\7@\2"+ + "\2\u0482\u0107\3\2\2\2\u0483\u0484\7(\2\2\u0484\u0485\7`\2\2\u0485\u0109"+ + "\3\2\2\2\u0486\u0487\7#\2\2\u0487\u010b\3\2\2\2\u0488\u0489\7-\2\2\u0489"+ + "\u010d\3\2\2\2\u048a\u048b\7/\2\2\u048b\u010f\3\2\2\2\u048c\u048d\7`\2"+ + "\2\u048d\u0111\3\2\2\2\u048e\u048f\7,\2\2\u048f\u0113\3\2\2\2\u0490\u0491"+ + "\7(\2\2\u0491\u0115\3\2\2\2\u0492\u0493\7>\2\2\u0493\u0494\7/\2\2\u0494"+ + "\u0117\3\2\2\2\u0495\u04a1\7\62\2\2\u0496\u049d\t\2\2\2\u0497\u0499\7"+ + "a\2\2\u0498\u0497\3\2\2\2\u0498\u0499\3\2\2\2\u0499\u049a\3\2\2\2\u049a"+ + "\u049c\t\3\2\2\u049b\u0498\3\2\2\2\u049c\u049f\3\2\2\2\u049d\u049b\3\2"+ + "\2\2\u049d\u049e\3\2\2\2\u049e\u04a1\3\2\2\2\u049f\u049d\3\2\2\2\u04a0"+ + "\u0495\3\2\2\2\u04a0\u0496\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\b\u008c"+ + "\2\2\u04a3\u0119\3\2\2\2\u04a4\u04a5\7\62\2\2\u04a5\u04aa\t\4\2\2\u04a6"+ + "\u04a8\7a\2\2\u04a7\u04a6\3\2\2\2\u04a7\u04a8\3\2\2\2\u04a8\u04a9\3\2"+ + "\2\2\u04a9\u04ab\5\u014c\u00a6\2\u04aa\u04a7\3\2\2\2\u04ab\u04ac\3\2\2"+ + "\2\u04ac\u04aa\3\2\2\2\u04ac\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af"+ + "\b\u008d\2\2\u04af\u011b\3\2\2\2\u04b0\u04b2\7\62\2\2\u04b1\u04b3\t\5"+ + "\2\2\u04b2\u04b1\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3\u04b8\3\2\2\2\u04b4"+ + "\u04b6\7a\2\2\u04b5\u04b4\3\2\2\2\u04b5\u04b6\3\2\2\2\u04b6\u04b7\3\2"+ + "\2\2\u04b7\u04b9\5\u0148\u00a4\2\u04b8\u04b5\3\2\2\2\u04b9\u04ba\3\2\2"+ + "\2\u04ba\u04b8\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bc\3\2\2\2\u04bc\u04bd"+ + "\b\u008e\2\2\u04bd\u011d\3\2\2\2\u04be\u04bf\7\62\2\2\u04bf\u04c4\t\6"+ + "\2\2\u04c0\u04c2\7a\2\2\u04c1\u04c0\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2"+ + "\u04c3\3\2\2\2\u04c3\u04c5\5\u014a\u00a5\2\u04c4\u04c1\3\2\2\2\u04c5\u04c6"+ + "\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8"+ + "\u04c9\b\u008f\2\2\u04c9\u011f\3\2\2\2\u04ca\u04cb\7\62\2\2\u04cb\u04cc"+ + "\t\6\2\2\u04cc\u04cd\5\u0122\u0091\2\u04cd\u04ce\5\u0124\u0092\2\u04ce"+ + "\u0121\3\2\2\2\u04cf\u04d1\7a\2\2\u04d0\u04cf\3\2\2\2\u04d0\u04d1\3\2"+ + "\2\2\u04d1\u04d2\3\2\2\2\u04d2\u04d4\5\u014a\u00a5\2\u04d3\u04d0\3\2\2"+ + "\2\u04d4\u04d5\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04e1"+ + "\3\2\2\2\u04d7\u04de\7\60\2\2\u04d8\u04da\7a\2\2\u04d9\u04d8\3\2\2\2\u04d9"+ + "\u04da\3\2\2\2\u04da\u04db\3\2\2\2\u04db\u04dd\5\u014a\u00a5\2\u04dc\u04d9"+ + "\3\2\2\2\u04dd\u04e0\3\2\2\2\u04de\u04dc\3\2\2\2\u04de\u04df\3\2\2\2\u04df"+ + "\u04e2\3\2\2\2\u04e0\u04de\3\2\2\2\u04e1\u04d7\3\2\2\2\u04e1\u04e2\3\2"+ + "\2\2\u04e2\u04ef\3\2\2\2\u04e3\u04e4\7\60\2\2\u04e4\u04eb\5\u014a\u00a5"+ + "\2\u04e5\u04e7\7a\2\2\u04e6\u04e5\3\2\2\2\u04e6\u04e7\3\2\2\2\u04e7\u04e8"+ + "\3\2\2\2\u04e8\u04ea\5\u014a\u00a5\2\u04e9\u04e6\3\2\2\2\u04ea\u04ed\3"+ + "\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u04ef\3\2\2\2\u04ed"+ + "\u04eb\3\2\2\2\u04ee\u04d3\3\2\2\2\u04ee\u04e3\3\2\2\2\u04ef\u0123\3\2"+ + "\2\2\u04f0\u04f1\t\7\2\2\u04f1\u04f2\t\b\2\2\u04f2\u04f3\5\u0146\u00a3"+ + "\2\u04f3\u0125\3\2\2\2\u04f4\u04fa\5\u0118\u008c\2\u04f5\u04fa\5\u011a"+ + "\u008d\2\u04f6\u04fa\5\u011c\u008e\2\u04f7\u04fa\5\u011e\u008f\2\u04f8"+ + "\u04fa\5\4\2\2\u04f9\u04f4\3\2\2\2\u04f9\u04f5\3\2\2\2\u04f9\u04f6\3\2"+ + "\2\2\u04f9\u04f7\3\2\2\2\u04f9\u04f8\3\2\2\2\u04fa\u04fb\3\2\2\2\u04fb"+ + "\u04fc\7k\2\2\u04fc\u04fd\3\2\2\2\u04fd\u04fe\b\u0093\2\2\u04fe\u0127"+ + "\3\2\2\2\u04ff\u0502\7)\2\2\u0500\u0503\5\u0142\u00a1\2\u0501\u0503\5"+ + "\u012c\u0096\2\u0502\u0500\3\2\2\2\u0502\u0501\3\2\2\2\u0503\u0504\3\2"+ + "\2\2\u0504\u0505\7)\2\2\u0505\u0129\3\2\2\2\u0506\u0507\5\u0128\u0094"+ + "\2\u0507\u0508\3\2\2\2\u0508\u0509\b\u0095\2\2\u0509\u012b\3\2\2\2\u050a"+ + "\u050d\5\u012e\u0097\2\u050b\u050d\5\u0130\u0098\2\u050c\u050a\3\2\2\2"+ + "\u050c\u050b\3\2\2\2\u050d\u012d\3\2\2\2\u050e\u050f\7^\2\2\u050f\u0510"+ + "\5\u0148\u00a4\2\u0510\u0511\5\u0148\u00a4\2\u0511\u0512\5\u0148\u00a4"+ + "\2\u0512\u012f\3\2\2\2\u0513\u0514\7^\2\2\u0514\u0515\7z\2\2\u0515\u0516"+ + "\5\u014a\u00a5\2\u0516\u0517\5\u014a\u00a5\2\u0517\u0131\3\2\2\2\u0518"+ + "\u0519\7^\2\2\u0519\u051a\7w\2\2\u051a\u051b\5\u014a\u00a5\2\u051b\u051c"+ + "\5\u014a\u00a5\2\u051c\u051d\5\u014a\u00a5\2\u051d\u051e\5\u014a\u00a5"+ + "\2\u051e\u0133\3\2\2\2\u051f\u0520\7^\2\2\u0520\u0521\7W\2\2\u0521\u0522"+ + "\5\u014a\u00a5\2\u0522\u0523\5\u014a\u00a5\2\u0523\u0524\5\u014a\u00a5"+ + "\2\u0524\u0525\5\u014a\u00a5\2\u0525\u0526\5\u014a\u00a5\2\u0526\u0527"+ + "\5\u014a\u00a5\2\u0527\u0528\5\u014a\u00a5\2\u0528\u0529\5\u014a\u00a5"+ + "\2\u0529\u0135\3\2\2\2\u052a\u052e\7b\2\2\u052b\u052d\n\t\2\2\u052c\u052b"+ + "\3\2\2\2\u052d\u0530\3\2\2\2\u052e\u052c\3\2\2\2\u052e\u052f\3\2\2\2\u052f"+ + "\u0531\3\2\2\2\u0530\u052e\3\2\2\2\u0531\u0532\7b\2\2\u0532\u0533\3\2"+ + "\2\2\u0533\u0534\b\u009b\2\2\u0534\u0137\3\2\2\2\u0535\u053a\7$\2\2\u0536"+ + "\u0539\n\n\2\2\u0537\u0539\5\u0144\u00a2\2\u0538\u0536\3\2\2\2\u0538\u0537"+ + "\3\2\2\2\u0539\u053c\3\2\2\2\u053a\u0538\3\2\2\2\u053a\u053b\3\2\2\2\u053b"+ + "\u053d\3\2\2\2\u053c\u053a\3\2\2\2\u053d\u053e\7$\2\2\u053e\u053f\3\2"+ + "\2\2\u053f\u0540\b\u009c\2\2\u0540\u0139\3\2\2\2\u0541\u0543\t\13\2\2"+ + "\u0542\u0541\3\2\2\2\u0543\u0544\3\2\2\2\u0544\u0542\3\2\2\2\u0544\u0545"+ + "\3\2\2\2\u0545\u0546\3\2\2\2\u0546\u0547\b\u009d\3\2\u0547\u013b\3\2\2"+ + "\2\u0548\u0549\7\61\2\2\u0549\u054a\7,\2\2\u054a\u054e\3\2\2\2\u054b\u054d"+ + "\13\2\2\2\u054c\u054b\3\2\2\2\u054d\u0550\3\2\2\2\u054e\u054f\3\2\2\2"+ + "\u054e\u054c\3\2\2\2\u054f\u0551\3\2\2\2\u0550\u054e\3\2\2\2\u0551\u0552"+ + "\7,\2\2\u0552\u0553\7\61\2\2\u0553\u0554\3\2\2\2\u0554\u0555\b\u009e\3"+ + "\2\u0555\u013d\3\2\2\2\u0556\u0558\t\f\2\2\u0557\u0556\3\2\2\2\u0558\u0559"+ + "\3\2\2\2\u0559\u0557\3\2\2\2\u0559\u055a\3\2\2\2\u055a\u055b\3\2\2\2\u055b"+ + "\u055c\b\u009f\3\2\u055c\u013f\3\2\2\2\u055d\u055e\7\61\2\2\u055e\u055f"+ + "\7\61\2\2\u055f\u0563\3\2\2\2\u0560\u0562\n\f\2\2\u0561\u0560\3\2\2\2"+ + "\u0562\u0565\3\2\2\2\u0563\u0561\3\2\2\2\u0563\u0564\3\2\2\2\u0564\u0566"+ + "\3\2\2\2\u0565\u0563\3\2\2\2\u0566\u0567\b\u00a0\3\2\u0567\u0141\3\2\2"+ + "\2\u0568\u056d\n\r\2\2\u0569\u056d\5\u0132\u0099\2\u056a\u056d\5\u0134"+ + "\u009a\2\u056b\u056d\5\u0144\u00a2\2\u056c\u0568\3\2\2\2\u056c\u0569\3"+ + "\2\2\2\u056c\u056a\3\2\2\2\u056c\u056b\3\2\2\2\u056d\u0143\3\2\2\2\u056e"+ + "\u0588\7^\2\2\u056f\u0570\7w\2\2\u0570\u0571\5\u014a\u00a5\2\u0571\u0572"+ + "\5\u014a\u00a5\2\u0572\u0573\5\u014a\u00a5\2\u0573\u0574\5\u014a\u00a5"+ + "\2\u0574\u0589\3\2\2\2\u0575\u0576\7W\2\2\u0576\u0577\5\u014a\u00a5\2"+ + "\u0577\u0578\5\u014a\u00a5\2\u0578\u0579\5\u014a\u00a5\2\u0579\u057a\5"+ + "\u014a\u00a5\2\u057a\u057b\5\u014a\u00a5\2\u057b\u057c\5\u014a\u00a5\2"+ + "\u057c\u057d\5\u014a\u00a5\2\u057d\u057e\5\u014a\u00a5\2\u057e\u0589\3"+ + "\2\2\2\u057f\u0589\t\16\2\2\u0580\u0581\5\u0148\u00a4\2\u0581\u0582\5"+ + "\u0148\u00a4\2\u0582\u0583\5\u0148\u00a4\2\u0583\u0589\3\2\2\2\u0584\u0585"+ + "\7z\2\2\u0585\u0586\5\u014a\u00a5\2\u0586\u0587\5\u014a\u00a5\2\u0587"+ + "\u0589\3\2\2\2\u0588\u056f\3\2\2\2\u0588\u0575\3\2\2\2\u0588\u057f\3\2"+ + "\2\2\u0588\u0580\3\2\2\2\u0588\u0584\3\2\2\2\u0589\u0145\3\2\2\2\u058a"+ + "\u0591\t\3\2\2\u058b\u058d\7a\2\2\u058c\u058b\3\2\2\2\u058c\u058d\3\2"+ + "\2\2\u058d\u058e\3\2\2\2\u058e\u0590\t\3\2\2\u058f\u058c\3\2\2\2\u0590"+ + "\u0593\3\2\2\2\u0591\u058f\3\2\2\2\u0591\u0592\3\2\2\2\u0592\u0147\3\2"+ + "\2\2\u0593\u0591\3\2\2\2\u0594\u0595\t\17\2\2\u0595\u0149\3\2\2\2\u0596"+ + "\u0597\t\20\2\2\u0597\u014b\3\2\2\2\u0598\u0599\t\21\2\2\u0599\u014d\3"+ + "\2\2\2\u059a\u059c\t\22\2\2\u059b\u059d\t\b\2\2\u059c\u059b\3\2\2\2\u059c"+ + "\u059d\3\2\2\2\u059d\u059e\3\2\2\2\u059e\u059f\5\u0146\u00a3\2\u059f\u014f"+ + "\3\2\2\2\u05a0\u05a3\5\u0154\u00aa\2\u05a1\u05a3\7a\2\2\u05a2\u05a0\3"+ + "\2\2\2\u05a2\u05a1\3\2\2\2\u05a3\u0151\3\2\2\2\u05a4\u05a5\t\23\2\2\u05a5"+ + "\u0153\3\2\2\2\u05a6\u05a7\t\24\2\2\u05a7\u0155\3\2\2\2\u05a8\u05aa\t"+ + "\13\2\2\u05a9\u05a8\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab"+ + "\u05ac\3\2\2\2\u05ac\u05ad\3\2\2\2\u05ad\u05ae\b\u00ab\3\2\u05ae\u0157"+ + "\3\2\2\2\u05af\u05b0\7\61\2\2\u05b0\u05b1\7,\2\2\u05b1\u05b5\3\2\2\2\u05b2"+ + "\u05b4\n\f\2\2\u05b3\u05b2\3\2\2\2\u05b4\u05b7\3\2\2\2\u05b5\u05b6\3\2"+ + "\2\2\u05b5\u05b3\3\2\2\2\u05b6\u05b8\3\2\2\2\u05b7\u05b5\3\2\2\2\u05b8"+ + "\u05b9\7,\2\2\u05b9\u05ba\7\61\2\2\u05ba\u05bb\3\2\2\2\u05bb\u05bc\b\u00ac"+ + "\3\2\u05bc\u0159\3\2\2\2\u05bd\u05be\7\61\2\2\u05be\u05bf\7\61\2\2\u05bf"+ + "\u05c3\3\2\2\2\u05c0\u05c2\n\f\2\2\u05c1\u05c0\3\2\2\2\u05c2\u05c5\3\2"+ + "\2\2\u05c3\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05c6\3\2\2\2\u05c5"+ + "\u05c3\3\2\2\2\u05c6\u05c7\b\u00ad\3\2\u05c7\u015b\3\2\2\2\u05c8\u05ca"+ + "\t\f\2\2\u05c9\u05c8\3\2\2\2\u05ca\u05cb\3\2\2\2\u05cb\u05c9\3\2\2\2\u05cb"+ + "\u05cc\3\2\2\2\u05cc\u05db\3\2\2\2\u05cd\u05db\7=\2\2\u05ce\u05cf\7\61"+ + "\2\2\u05cf\u05d0\7,\2\2\u05d0\u05d4\3\2\2\2\u05d1\u05d3\13\2\2\2\u05d2"+ + "\u05d1\3\2\2\2\u05d3\u05d6\3\2\2\2\u05d4\u05d5\3\2\2\2\u05d4\u05d2\3\2"+ + "\2\2\u05d5\u05d7\3\2\2\2\u05d6\u05d4\3\2\2\2\u05d7\u05d8\7,\2\2\u05d8"+ + "\u05db\7\61\2\2\u05d9\u05db\7\2\2\3\u05da\u05c9\3\2\2\2\u05da\u05cd\3"+ + "\2\2\2\u05da\u05ce\3\2\2\2\u05da\u05d9\3\2\2\2\u05db\u05dc\3\2\2\2\u05dc"+ + "\u05dd\b\u00ae\4\2\u05dd\u015d\3\2\2\2\u05de\u05df\3\2\2\2\u05df\u05e0"+ + "\3\2\2\2\u05e0\u05e1\b\u00af\4\2\u05e1\u05e2\b\u00af\3\2\u05e2\u015f\3"+ + "\2\2\2\64\2\3\u0162\u016a\u016d\u0170\u0176\u0178\u042d\u042f\u0498\u049d"+ + "\u04a0\u04a7\u04ac\u04b2\u04b5\u04ba\u04c1\u04c6\u04d0\u04d5\u04d9\u04de"+ + "\u04e1\u04e6\u04eb\u04ee\u04f9\u0502\u050c\u052e\u0538\u053a\u0544\u054e"+ + "\u0559\u0563\u056c\u0588\u058c\u0591\u059c\u05a2\u05ab\u05b5\u05c3\u05cb"+ + "\u05d4\u05da\5\4\3\2\2\3\2\4\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -916,4 +920,4 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 5771a622b..004639a85 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,3 +1,4 @@ +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -10,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -23,25 +24,25 @@ public class GobraParser extends GobraParserBase { UNION=31, INTERSECTION=32, SETMINUS=33, IMPLIES=34, WAND=35, APPLY=36, QMARK=37, L_PRED=38, R_PRED=39, SEQ=40, SET=41, MSET=42, DICT=43, OPT=44, LEN=45, NEW=46, MAKE=47, CAP=48, SOME=49, GET=50, DOM=51, AXIOM=52, ADT=53, - MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, - DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, - TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, - GHOST_NOT_EQUALS=73, WITH=74, BREAK=75, DEFAULT=76, FUNC=77, INTERFACE=78, - SELECT=79, CASE=80, DEFER=81, GO=82, MAP=83, STRUCT=84, CHAN=85, ELSE=86, - GOTO=87, PACKAGE=88, SWITCH=89, CONST=90, FALLTHROUGH=91, IF=92, RANGE=93, - TYPE=94, CONTINUE=95, FOR=96, IMPORT=97, RETURN=98, VAR=99, NIL_LIT=100, - IDENTIFIER=101, L_PAREN=102, R_PAREN=103, L_CURLY=104, R_CURLY=105, L_BRACKET=106, - R_BRACKET=107, ASSIGN=108, COMMA=109, SEMI=110, COLON=111, DOT=112, PLUS_PLUS=113, - MINUS_MINUS=114, DECLARE_ASSIGN=115, ELLIPSIS=116, LOGICAL_OR=117, LOGICAL_AND=118, - EQUALS=119, NOT_EQUALS=120, LESS=121, LESS_OR_EQUALS=122, GREATER=123, - GREATER_OR_EQUALS=124, OR=125, DIV=126, MOD=127, LSHIFT=128, RSHIFT=129, - BIT_CLEAR=130, EXCLAMATION=131, PLUS=132, MINUS=133, CARET=134, STAR=135, - AMPERSAND=136, RECEIVE=137, DECIMAL_LIT=138, BINARY_LIT=139, OCTAL_LIT=140, - HEX_LIT=141, HEX_FLOAT_LIT=142, IMAGINARY_LIT=143, RUNE_LIT=144, BYTE_VALUE=145, - OCTAL_BYTE_VALUE=146, HEX_BYTE_VALUE=147, LITTLE_U_VALUE=148, BIG_U_VALUE=149, - RAW_STRING_LIT=150, INTERPRETED_STRING_LIT=151, WS=152, COMMENT=153, TERMINATOR=154, - LINE_COMMENT=155, WS_NLSEMI=156, COMMENT_NLSEMI=157, LINE_COMMENT_NLSEMI=158, - EOS=159, OTHER=160; + MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, LOW=59, SHARE=60, + ADDR_MOD=61, DOT_DOT=62, SHARED=63, EXCLUSIVE=64, PREDICATE=65, WRITEPERM=66, + NOPERM=67, TRUSTED=68, OUTLINE=69, INIT_POST=70, IMPORT_PRE=71, PROOF=72, + GHOST_EQUALS=73, GHOST_NOT_EQUALS=74, WITH=75, BREAK=76, DEFAULT=77, FUNC=78, + INTERFACE=79, SELECT=80, CASE=81, DEFER=82, GO=83, MAP=84, STRUCT=85, + CHAN=86, ELSE=87, GOTO=88, PACKAGE=89, SWITCH=90, CONST=91, FALLTHROUGH=92, + IF=93, RANGE=94, TYPE=95, CONTINUE=96, FOR=97, IMPORT=98, RETURN=99, VAR=100, + NIL_LIT=101, IDENTIFIER=102, L_PAREN=103, R_PAREN=104, L_CURLY=105, R_CURLY=106, + L_BRACKET=107, R_BRACKET=108, ASSIGN=109, COMMA=110, SEMI=111, COLON=112, + DOT=113, PLUS_PLUS=114, MINUS_MINUS=115, DECLARE_ASSIGN=116, ELLIPSIS=117, + LOGICAL_OR=118, LOGICAL_AND=119, EQUALS=120, NOT_EQUALS=121, LESS=122, + LESS_OR_EQUALS=123, GREATER=124, GREATER_OR_EQUALS=125, OR=126, DIV=127, + MOD=128, LSHIFT=129, RSHIFT=130, BIT_CLEAR=131, EXCLAMATION=132, PLUS=133, + MINUS=134, CARET=135, STAR=136, AMPERSAND=137, RECEIVE=138, DECIMAL_LIT=139, + BINARY_LIT=140, OCTAL_LIT=141, HEX_LIT=142, HEX_FLOAT_LIT=143, IMAGINARY_LIT=144, + RUNE_LIT=145, BYTE_VALUE=146, OCTAL_BYTE_VALUE=147, HEX_BYTE_VALUE=148, + LITTLE_U_VALUE=149, BIG_U_VALUE=150, RAW_STRING_LIT=151, INTERPRETED_STRING_LIT=152, + WS=153, COMMENT=154, TERMINATOR=155, LINE_COMMENT=156, WS_NLSEMI=157, + COMMENT_NLSEMI=158, LINE_COMMENT_NLSEMI=159, EOS=160, OTHER=161; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6, @@ -52,50 +53,50 @@ public class GobraParser extends GobraParserBase { RULE_triggers = 20, RULE_trigger = 21, RULE_predicateAccess = 22, RULE_optionSome = 23, RULE_optionNone = 24, RULE_optionGet = 25, RULE_sConversion = 26, RULE_old = 27, RULE_oldLabelUse = 28, RULE_labelUse = 29, RULE_before = 30, RULE_isComparable = 31, - RULE_typeOf = 32, RULE_access = 33, RULE_range = 34, RULE_matchExpr = 35, - RULE_matchExprClause = 36, RULE_seqUpdExp = 37, RULE_seqUpdClause = 38, - RULE_ghostTypeLit = 39, RULE_domainType = 40, RULE_domainClause = 41, - RULE_adtType = 42, RULE_adtClause = 43, RULE_ghostSliceType = 44, RULE_sqType = 45, - RULE_specification = 46, RULE_specStatement = 47, RULE_terminationMeasure = 48, - RULE_assertion = 49, RULE_matchStmt = 50, RULE_matchStmtClause = 51, RULE_matchCase = 52, - RULE_matchPattern = 53, RULE_matchPatternList = 54, RULE_blockWithBodyParameterInfo = 55, - RULE_closureSpecInstance = 56, RULE_closureSpecParams = 57, RULE_closureSpecParam = 58, - RULE_closureImplProofStmt = 59, RULE_implementationProof = 60, RULE_methodImplementationProof = 61, - RULE_nonLocalReceiver = 62, RULE_selection = 63, RULE_implementationProofPredicateAlias = 64, - RULE_make = 65, RULE_new_ = 66, RULE_specMember = 67, RULE_functionDecl = 68, - RULE_methodDecl = 69, RULE_explicitGhostMember = 70, RULE_fpredicateDecl = 71, - RULE_predicateBody = 72, RULE_mpredicateDecl = 73, RULE_varSpec = 74, - RULE_shortVarDecl = 75, RULE_receiver = 76, RULE_parameterDecl = 77, RULE_actualParameterDecl = 78, - RULE_ghostParameterDecl = 79, RULE_parameterType = 80, RULE_expression = 81, - RULE_statement = 82, RULE_applyStmt = 83, RULE_packageStmt = 84, RULE_specForStmt = 85, - RULE_loopSpec = 86, RULE_deferStmt = 87, RULE_basicLit = 88, RULE_primaryExpr = 89, - RULE_functionLit = 90, RULE_closureDecl = 91, RULE_predConstructArgs = 92, - RULE_interfaceType = 93, RULE_predicateSpec = 94, RULE_methodSpec = 95, - RULE_type_ = 96, RULE_typeLit = 97, RULE_predType = 98, RULE_predTypeParams = 99, - RULE_literalType = 100, RULE_implicitArray = 101, RULE_slice_ = 102, RULE_low = 103, - RULE_high = 104, RULE_cap = 105, RULE_assign_op = 106, RULE_rangeClause = 107, - RULE_packageClause = 108, RULE_importPath = 109, RULE_declaration = 110, - RULE_constDecl = 111, RULE_constSpec = 112, RULE_identifierList = 113, - RULE_expressionList = 114, RULE_typeDecl = 115, RULE_typeSpec = 116, RULE_varDecl = 117, - RULE_block = 118, RULE_statementList = 119, RULE_simpleStmt = 120, RULE_expressionStmt = 121, - RULE_sendStmt = 122, RULE_incDecStmt = 123, RULE_assignment = 124, RULE_emptyStmt = 125, - RULE_labeledStmt = 126, RULE_returnStmt = 127, RULE_breakStmt = 128, RULE_continueStmt = 129, - RULE_gotoStmt = 130, RULE_fallthroughStmt = 131, RULE_ifStmt = 132, RULE_switchStmt = 133, - RULE_exprSwitchStmt = 134, RULE_exprCaseClause = 135, RULE_exprSwitchCase = 136, - RULE_typeSwitchStmt = 137, RULE_typeSwitchGuard = 138, RULE_typeCaseClause = 139, - RULE_typeSwitchCase = 140, RULE_typeList = 141, RULE_selectStmt = 142, - RULE_commClause = 143, RULE_commCase = 144, RULE_recvStmt = 145, RULE_forStmt = 146, - RULE_forClause = 147, RULE_goStmt = 148, RULE_typeName = 149, RULE_arrayType = 150, - RULE_arrayLength = 151, RULE_elementType = 152, RULE_pointerType = 153, - RULE_sliceType = 154, RULE_mapType = 155, RULE_channelType = 156, RULE_functionType = 157, - RULE_signature = 158, RULE_result = 159, RULE_parameters = 160, RULE_conversion = 161, - RULE_nonNamedType = 162, RULE_operand = 163, RULE_literal = 164, RULE_integer = 165, - RULE_operandName = 166, RULE_qualifiedIdent = 167, RULE_compositeLit = 168, - RULE_literalValue = 169, RULE_elementList = 170, RULE_keyedElement = 171, - RULE_key = 172, RULE_element = 173, RULE_structType = 174, RULE_fieldDecl = 175, - RULE_string_ = 176, RULE_embeddedField = 177, RULE_index = 178, RULE_typeAssertion = 179, - RULE_arguments = 180, RULE_methodExpr = 181, RULE_receiverType = 182, - RULE_eos = 183; + RULE_low = 32, RULE_typeOf = 33, RULE_access = 34, RULE_range = 35, RULE_matchExpr = 36, + RULE_matchExprClause = 37, RULE_seqUpdExp = 38, RULE_seqUpdClause = 39, + RULE_ghostTypeLit = 40, RULE_domainType = 41, RULE_domainClause = 42, + RULE_adtType = 43, RULE_adtClause = 44, RULE_ghostSliceType = 45, RULE_sqType = 46, + RULE_specification = 47, RULE_specStatement = 48, RULE_terminationMeasure = 49, + RULE_assertion = 50, RULE_matchStmt = 51, RULE_matchStmtClause = 52, RULE_matchCase = 53, + RULE_matchPattern = 54, RULE_matchPatternList = 55, RULE_blockWithBodyParameterInfo = 56, + RULE_closureSpecInstance = 57, RULE_closureSpecParams = 58, RULE_closureSpecParam = 59, + RULE_closureImplProofStmt = 60, RULE_implementationProof = 61, RULE_methodImplementationProof = 62, + RULE_nonLocalReceiver = 63, RULE_selection = 64, RULE_implementationProofPredicateAlias = 65, + RULE_make = 66, RULE_new_ = 67, RULE_specMember = 68, RULE_functionDecl = 69, + RULE_methodDecl = 70, RULE_explicitGhostMember = 71, RULE_fpredicateDecl = 72, + RULE_predicateBody = 73, RULE_mpredicateDecl = 74, RULE_varSpec = 75, + RULE_shortVarDecl = 76, RULE_receiver = 77, RULE_parameterDecl = 78, RULE_actualParameterDecl = 79, + RULE_ghostParameterDecl = 80, RULE_parameterType = 81, RULE_expression = 82, + RULE_statement = 83, RULE_applyStmt = 84, RULE_packageStmt = 85, RULE_specForStmt = 86, + RULE_loopSpec = 87, RULE_deferStmt = 88, RULE_basicLit = 89, RULE_primaryExpr = 90, + RULE_functionLit = 91, RULE_closureDecl = 92, RULE_predConstructArgs = 93, + RULE_interfaceType = 94, RULE_predicateSpec = 95, RULE_methodSpec = 96, + RULE_type_ = 97, RULE_typeLit = 98, RULE_predType = 99, RULE_predTypeParams = 100, + RULE_literalType = 101, RULE_implicitArray = 102, RULE_slice_ = 103, RULE_lowSliceArgument = 104, + RULE_highSliceArgument = 105, RULE_capSliceArgument = 106, RULE_assign_op = 107, + RULE_rangeClause = 108, RULE_packageClause = 109, RULE_importPath = 110, + RULE_declaration = 111, RULE_constDecl = 112, RULE_constSpec = 113, RULE_identifierList = 114, + RULE_expressionList = 115, RULE_typeDecl = 116, RULE_typeSpec = 117, RULE_varDecl = 118, + RULE_block = 119, RULE_statementList = 120, RULE_simpleStmt = 121, RULE_expressionStmt = 122, + RULE_sendStmt = 123, RULE_incDecStmt = 124, RULE_assignment = 125, RULE_emptyStmt = 126, + RULE_labeledStmt = 127, RULE_returnStmt = 128, RULE_breakStmt = 129, RULE_continueStmt = 130, + RULE_gotoStmt = 131, RULE_fallthroughStmt = 132, RULE_ifStmt = 133, RULE_switchStmt = 134, + RULE_exprSwitchStmt = 135, RULE_exprCaseClause = 136, RULE_exprSwitchCase = 137, + RULE_typeSwitchStmt = 138, RULE_typeSwitchGuard = 139, RULE_typeCaseClause = 140, + RULE_typeSwitchCase = 141, RULE_typeList = 142, RULE_selectStmt = 143, + RULE_commClause = 144, RULE_commCase = 145, RULE_recvStmt = 146, RULE_forStmt = 147, + RULE_forClause = 148, RULE_goStmt = 149, RULE_typeName = 150, RULE_arrayType = 151, + RULE_arrayLength = 152, RULE_elementType = 153, RULE_pointerType = 154, + RULE_sliceType = 155, RULE_mapType = 156, RULE_channelType = 157, RULE_functionType = 158, + RULE_signature = 159, RULE_result = 160, RULE_parameters = 161, RULE_conversion = 162, + RULE_nonNamedType = 163, RULE_operand = 164, RULE_literal = 165, RULE_integer = 166, + RULE_operandName = 167, RULE_qualifiedIdent = 168, RULE_compositeLit = 169, + RULE_literalValue = 170, RULE_elementList = 171, RULE_keyedElement = 172, + RULE_key = 173, RULE_element = 174, RULE_structType = 175, RULE_fieldDecl = 176, + RULE_string_ = 177, RULE_embeddedField = 178, RULE_index = 179, RULE_typeAssertion = 180, + RULE_arguments = 181, RULE_methodExpr = 182, RULE_receiverType = 183, + RULE_eos = 184; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -104,7 +105,7 @@ private static String[] makeRuleNames() { "statementWithSpec", "outlineStatement", "ghostPrimaryExpr", "permission", "typeExpr", "boundVariables", "boundVariableDecl", "triggers", "trigger", "predicateAccess", "optionSome", "optionNone", "optionGet", "sConversion", - "old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf", + "old", "oldLabelUse", "labelUse", "before", "isComparable", "low", "typeOf", "access", "range", "matchExpr", "matchExprClause", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType", "domainClause", "adtType", "adtClause", "ghostSliceType", "sqType", "specification", "specStatement", "terminationMeasure", @@ -119,11 +120,11 @@ private static String[] makeRuleNames() { "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType", - "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause", - "packageClause", "importPath", "declaration", "constDecl", "constSpec", - "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl", - "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt", - "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", + "implicitArray", "slice_", "lowSliceArgument", "highSliceArgument", "capSliceArgument", + "assign_op", "rangeClause", "packageClause", "importPath", "declaration", + "constDecl", "constSpec", "identifierList", "expressionList", "typeDecl", + "typeSpec", "varDecl", "block", "statementList", "simpleStmt", "expressionStmt", + "sendStmt", "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", @@ -149,12 +150,12 @@ private static String[] makeLiteralNames() { "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'", "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", - "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", - "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", - "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", - "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", - "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", - "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", + "'none'", "'pred'", "'typeOf'", "'isComparable'", "'low'", "'share'", + "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", + "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", + "'proof'", "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", + "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'", + "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", @@ -172,7 +173,7 @@ private static String[] makeSymbolicNames() { "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", - "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "TYPE_OF", "IS_COMPARABLE", "LOW", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", @@ -265,9 +266,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(368); + setState(370); expression(0); - setState(369); + setState(371); match(EOF); } } @@ -304,9 +305,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(371); + setState(373); statement(); - setState(372); + setState(374); match(EOF); } } @@ -343,9 +344,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(374); + setState(376); type_(); - setState(375); + setState(377); match(EOF); } } @@ -389,21 +390,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(377); + setState(379); maybeAddressableIdentifier(); - setState(382); + setState(384); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(378); + setState(380); match(COMMA); - setState(379); + setState(381); maybeAddressableIdentifier(); } } - setState(384); + setState(386); _errHandler.sync(this); _la = _input.LA(1); } @@ -441,14 +442,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(385); - match(IDENTIFIER); setState(387); + match(IDENTIFIER); + setState(389); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(386); + setState(388); match(ADDR_MOD); } } @@ -525,79 +526,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(394); + setState(396); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(389); + setState(391); initPost(); - setState(390); + setState(392); eos(); } } - setState(396); + setState(398); _errHandler.sync(this); _la = _input.LA(1); } - setState(397); + setState(399); packageClause(); - setState(398); + setState(400); eos(); - setState(404); + setState(406); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(399); + setState(401); importDecl(); - setState(400); + setState(402); eos(); } } - setState(406); + setState(408); _errHandler.sync(this); _la = _input.LA(1); } - setState(416); + setState(418); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (CONST - 77)) | (1L << (TYPE - 77)) | (1L << (VAR - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 78)) & ~0x3f) == 0 && ((1L << (_la - 78)) & ((1L << (FUNC - 78)) | (1L << (INTERFACE - 78)) | (1L << (MAP - 78)) | (1L << (STRUCT - 78)) | (1L << (CHAN - 78)) | (1L << (CONST - 78)) | (1L << (TYPE - 78)) | (1L << (VAR - 78)) | (1L << (IDENTIFIER - 78)) | (1L << (L_PAREN - 78)) | (1L << (L_BRACKET - 78)) | (1L << (STAR - 78)) | (1L << (RECEIVE - 78)))) != 0)) { { { - setState(410); + setState(412); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(407); + setState(409); specMember(); } break; case 2: { - setState(408); + setState(410); declaration(); } break; case 3: { - setState(409); + setState(411); ghostMember(); } break; } - setState(412); + setState(414); eos(); } } - setState(418); + setState(420); _errHandler.sync(this); _la = _input.LA(1); } - setState(419); + setState(421); match(EOF); } } @@ -634,9 +635,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(421); + setState(423); match(INIT_POST); - setState(422); + setState(424); expression(0); } } @@ -673,9 +674,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(424); + setState(426); match(IMPORT_PRE); - setState(425); + setState(427); expression(0); } } @@ -727,28 +728,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(432); + setState(434); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(427); + setState(429); importPre(); - setState(428); + setState(430); eos(); } } - setState(434); + setState(436); _errHandler.sync(this); _la = _input.LA(1); } - setState(436); + setState(438); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(435); + setState(437); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -762,7 +763,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(438); + setState(440); importPath(); } } @@ -817,56 +818,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(445); + setState(447); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(440); + setState(442); importPre(); - setState(441); + setState(443); eos(); } } - setState(447); + setState(449); _errHandler.sync(this); _la = _input.LA(1); } - setState(461); + setState(463); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(448); + setState(450); match(IMPORT); - setState(449); + setState(451); importSpec(); } break; case 2: { - setState(450); + setState(452); match(IMPORT); - setState(451); + setState(453); match(L_PAREN); - setState(457); + setState(459); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (IMPORT_PRE - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DOT - 70)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (IMPORT_PRE - 71)) | (1L << (IDENTIFIER - 71)) | (1L << (DOT - 71)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(452); + setState(454); importSpec(); - setState(453); + setState(455); eos(); } } - setState(459); + setState(461); _errHandler.sync(this); _la = _input.LA(1); } - setState(460); + setState(462); match(R_PAREN); } break; @@ -912,34 +913,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 20, RULE_ghostMember); try { - setState(467); + setState(469); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(463); + setState(465); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(464); + setState(466); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(465); + setState(467); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(466); + setState(468); explicitGhostMember(); } break; @@ -1026,16 +1027,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 22, RULE_ghostStatement); int _la; try { - setState(476); + setState(478); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(469); + setState(471); match(GHOST); - setState(470); + setState(472); statement(); } break; @@ -1044,7 +1045,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(471); + setState(473); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1055,7 +1056,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(472); + setState(474); predicateAccess(); } break; @@ -1066,7 +1067,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(473); + setState(475); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASSERT) | (1L << ASSUME) | (1L << INHALE) | (1L << EXHALE))) != 0)) ) { @@ -1077,7 +1078,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(474); + setState(476); expression(0); } break; @@ -1085,7 +1086,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new MatchStmt_Context(_localctx); enterOuterAlt(_localctx, 4); { - setState(475); + setState(477); matchStmt(); } break; @@ -1125,7 +1126,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(478); + setState(480); statementWithSpec(); } } @@ -1165,10 +1166,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(480); + setState(482); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(481); + setState(483); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1213,21 +1214,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu try { enterOuterAlt(_localctx, 1); { - setState(483); + setState(485); match(OUTLINE); - setState(484); - match(L_PAREN); setState(486); + match(L_PAREN); + setState(488); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: { - setState(485); + setState(487); statementList(); } break; } - setState(488); + setState(490); match(R_PAREN); } } @@ -1258,6 +1259,9 @@ public TypeExprContext typeExpr() { public IsComparableContext isComparable() { return getRuleContext(IsComparableContext.class,0); } + public LowContext low() { + return getRuleContext(LowContext.class,0); + } public OldContext old() { return getRuleContext(OldContext.class,0); } @@ -1297,97 +1301,104 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 30, RULE_ghostPrimaryExpr); try { - setState(503); + setState(506); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(490); + setState(492); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(491); + setState(493); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(492); + setState(494); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(493); + setState(495); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(494); + setState(496); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(495); - old(); + setState(497); + low(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(496); - before(); + setState(498); + old(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(497); - sConversion(); + setState(499); + before(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(498); - optionNone(); + setState(500); + sConversion(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(499); - optionSome(); + setState(501); + optionNone(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(500); - optionGet(); + setState(502); + optionSome(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(501); - permission(); + setState(503); + optionGet(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(502); + setState(504); + permission(); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(505); matchExpr(); } break; @@ -1425,7 +1436,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(505); + setState(508); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1472,13 +1483,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(507); + setState(510); match(TYPE); - setState(508); + setState(511); match(L_BRACKET); - setState(509); + setState(512); type_(); - setState(510); + setState(513); match(R_BRACKET); } } @@ -1523,32 +1534,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(512); + setState(515); boundVariableDecl(); - setState(517); + setState(520); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(513); + setState(516); match(COMMA); - setState(514); + setState(517); boundVariableDecl(); } } } - setState(519); + setState(522); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } - setState(521); + setState(524); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(520); + setState(523); match(COMMA); } } @@ -1596,25 +1607,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(523); + setState(526); match(IDENTIFIER); - setState(528); + setState(531); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(524); + setState(527); match(COMMA); - setState(525); + setState(528); match(IDENTIFIER); } } - setState(530); + setState(533); _errHandler.sync(this); _la = _input.LA(1); } - setState(531); + setState(534); elementType(); } } @@ -1654,17 +1665,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(536); + setState(539); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(533); + setState(536); trigger(); } } - setState(538); + setState(541); _errHandler.sync(this); _la = _input.LA(1); } @@ -1712,27 +1723,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(539); + setState(542); match(L_CURLY); - setState(540); + setState(543); expression(0); - setState(545); + setState(548); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(541); + setState(544); match(COMMA); - setState(542); + setState(545); expression(0); } } - setState(547); + setState(550); _errHandler.sync(this); _la = _input.LA(1); } - setState(548); + setState(551); match(R_CURLY); } } @@ -1768,7 +1779,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(550); + setState(553); primaryExpr(0); } } @@ -1807,13 +1818,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(552); + setState(555); match(SOME); - setState(553); + setState(556); match(L_PAREN); - setState(554); + setState(557); expression(0); - setState(555); + setState(558); match(R_PAREN); } } @@ -1852,13 +1863,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(557); + setState(560); match(NONE); - setState(558); + setState(561); match(L_BRACKET); - setState(559); + setState(562); type_(); - setState(560); + setState(563); match(R_BRACKET); } } @@ -1897,13 +1908,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(562); + setState(565); match(GET); - setState(563); + setState(566); match(L_PAREN); - setState(564); + setState(567); expression(0); - setState(565); + setState(568); match(R_PAREN); } } @@ -1946,7 +1957,7 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(567); + setState(570); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { @@ -1957,11 +1968,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(568); + setState(571); match(L_PAREN); - setState(569); + setState(572); expression(0); - setState(570); + setState(573); match(R_PAREN); } } @@ -2006,27 +2017,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(575); match(OLD); - setState(577); + setState(580); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(573); + setState(576); match(L_BRACKET); - setState(574); + setState(577); oldLabelUse(); - setState(575); + setState(578); match(R_BRACKET); } } - setState(579); + setState(582); match(L_PAREN); - setState(580); + setState(583); expression(0); - setState(581); + setState(584); match(R_PAREN); } } @@ -2061,20 +2072,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 56, RULE_oldLabelUse); try { - setState(585); + setState(588); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(583); + setState(586); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(584); + setState(587); match(LHS); } break; @@ -2112,7 +2123,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(587); + setState(590); match(IDENTIFIER); } } @@ -2151,13 +2162,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(592); match(BEFORE); - setState(590); + setState(593); match(L_PAREN); - setState(591); + setState(594); expression(0); - setState(592); + setState(595); match(R_PAREN); } } @@ -2196,13 +2207,58 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(594); + setState(597); match(IS_COMPARABLE); - setState(595); + setState(598); match(L_PAREN); - setState(596); + setState(599); expression(0); - setState(597); + setState(600); + match(R_PAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class LowContext extends ParserRuleContext { + public TerminalNode LOW() { return getToken(GobraParser.LOW, 0); } + public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); } + public LowContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_low; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitLow(this); + else return visitor.visitChildren(this); + } + } + + public final LowContext low() throws RecognitionException { + LowContext _localctx = new LowContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_low); + try { + enterOuterAlt(_localctx, 1); + { + setState(602); + match(LOW); + setState(603); + match(L_PAREN); + setState(604); + expression(0); + setState(605); match(R_PAREN); } } @@ -2237,17 +2293,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeOfContext typeOf() throws RecognitionException { TypeOfContext _localctx = new TypeOfContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_typeOf); + enterRule(_localctx, 66, RULE_typeOf); try { enterOuterAlt(_localctx, 1); { - setState(599); + setState(607); match(TYPE_OF); - setState(600); + setState(608); match(L_PAREN); - setState(601); + setState(609); expression(0); - setState(602); + setState(610); match(R_PAREN); } } @@ -2286,30 +2342,30 @@ public T accept(ParseTreeVisitor visitor) { public final AccessContext access() throws RecognitionException { AccessContext _localctx = new AccessContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_access); + enterRule(_localctx, 68, RULE_access); int _la; try { enterOuterAlt(_localctx, 1); { - setState(604); + setState(612); match(ACCESS); - setState(605); + setState(613); match(L_PAREN); - setState(606); + setState(614); expression(0); - setState(609); + setState(617); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(607); + setState(615); match(COMMA); - setState(608); + setState(616); expression(0); } } - setState(611); + setState(619); match(R_PAREN); } } @@ -2351,12 +2407,12 @@ public T accept(ParseTreeVisitor visitor) { public final RangeContext range() throws RecognitionException { RangeContext _localctx = new RangeContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_range); + enterRule(_localctx, 70, RULE_range); int _la; try { enterOuterAlt(_localctx, 1); { - setState(613); + setState(621); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { @@ -2367,15 +2423,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(614); + setState(622); match(L_BRACKET); - setState(615); + setState(623); expression(0); - setState(616); + setState(624); match(DOT_DOT); - setState(617); + setState(625); expression(0); - setState(618); + setState(626); match(R_BRACKET); } } @@ -2422,34 +2478,34 @@ public T accept(ParseTreeVisitor visitor) { public final MatchExprContext matchExpr() throws RecognitionException { MatchExprContext _localctx = new MatchExprContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_matchExpr); + enterRule(_localctx, 72, RULE_matchExpr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(620); + setState(628); match(MATCH); - setState(621); + setState(629); expression(0); - setState(622); + setState(630); match(L_CURLY); - setState(628); + setState(636); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(623); + setState(631); matchExprClause(); - setState(624); + setState(632); eos(); } } - setState(630); + setState(638); _errHandler.sync(this); _la = _input.LA(1); } - setState(631); + setState(639); match(R_CURLY); } } @@ -2485,15 +2541,15 @@ public T accept(ParseTreeVisitor visitor) { public final MatchExprClauseContext matchExprClause() throws RecognitionException { MatchExprClauseContext _localctx = new MatchExprClauseContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_matchExprClause); + enterRule(_localctx, 74, RULE_matchExprClause); try { enterOuterAlt(_localctx, 1); { - setState(633); + setState(641); matchCase(); - setState(634); + setState(642); match(COLON); - setState(635); + setState(643); expression(0); } } @@ -2534,34 +2590,34 @@ public T accept(ParseTreeVisitor visitor) { public final SeqUpdExpContext seqUpdExp() throws RecognitionException { SeqUpdExpContext _localctx = new SeqUpdExpContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_seqUpdExp); + enterRule(_localctx, 76, RULE_seqUpdExp); int _la; try { enterOuterAlt(_localctx, 1); { - setState(637); + setState(645); match(L_BRACKET); { - setState(638); + setState(646); seqUpdClause(); - setState(643); + setState(651); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(639); + setState(647); match(COMMA); - setState(640); + setState(648); seqUpdClause(); } } - setState(645); + setState(653); _errHandler.sync(this); _la = _input.LA(1); } } - setState(646); + setState(654); match(R_BRACKET); } } @@ -2597,15 +2653,15 @@ public T accept(ParseTreeVisitor visitor) { public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { SeqUpdClauseContext _localctx = new SeqUpdClauseContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_seqUpdClause); + enterRule(_localctx, 78, RULE_seqUpdClause); try { enterOuterAlt(_localctx, 1); { - setState(648); + setState(656); expression(0); - setState(649); + setState(657); match(ASSIGN); - setState(650); + setState(658); expression(0); } } @@ -2646,9 +2702,9 @@ public T accept(ParseTreeVisitor visitor) { public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_ghostTypeLit); + enterRule(_localctx, 80, RULE_ghostTypeLit); try { - setState(656); + setState(664); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2658,28 +2714,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(652); + setState(660); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(653); + setState(661); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(654); + setState(662); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(655); + setState(663); adtType(); } break; @@ -2727,32 +2783,32 @@ public T accept(ParseTreeVisitor visitor) { public final DomainTypeContext domainType() throws RecognitionException { DomainTypeContext _localctx = new DomainTypeContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_domainType); + enterRule(_localctx, 82, RULE_domainType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(658); + setState(666); match(DOM); - setState(659); + setState(667); match(L_CURLY); - setState(665); + setState(673); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(660); + setState(668); domainClause(); - setState(661); + setState(669); eos(); } } - setState(667); + setState(675); _errHandler.sync(this); _la = _input.LA(1); } - setState(668); + setState(676); match(R_CURLY); } } @@ -2795,34 +2851,34 @@ public T accept(ParseTreeVisitor visitor) { public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_domainClause); + enterRule(_localctx, 84, RULE_domainClause); try { - setState(679); + setState(687); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(670); + setState(678); match(FUNC); - setState(671); + setState(679); match(IDENTIFIER); - setState(672); + setState(680); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(673); + setState(681); match(AXIOM); - setState(674); + setState(682); match(L_CURLY); - setState(675); + setState(683); expression(0); - setState(676); + setState(684); eos(); - setState(677); + setState(685); match(R_CURLY); } break; @@ -2870,32 +2926,32 @@ public T accept(ParseTreeVisitor visitor) { public final AdtTypeContext adtType() throws RecognitionException { AdtTypeContext _localctx = new AdtTypeContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_adtType); + enterRule(_localctx, 86, RULE_adtType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(681); + setState(689); match(ADT); - setState(682); + setState(690); match(L_CURLY); - setState(688); + setState(696); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(683); + setState(691); adtClause(); - setState(684); + setState(692); eos(); } } - setState(690); + setState(698); _errHandler.sync(this); _la = _input.LA(1); } - setState(691); + setState(699); match(R_CURLY); } } @@ -2939,32 +2995,32 @@ public T accept(ParseTreeVisitor visitor) { public final AdtClauseContext adtClause() throws RecognitionException { AdtClauseContext _localctx = new AdtClauseContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_adtClause); + enterRule(_localctx, 88, RULE_adtClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(693); + setState(701); match(IDENTIFIER); - setState(694); + setState(702); match(L_CURLY); - setState(700); + setState(708); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(695); + setState(703); fieldDecl(); - setState(696); + setState(704); eos(); } } - setState(702); + setState(710); _errHandler.sync(this); _la = _input.LA(1); } - setState(703); + setState(711); match(R_CURLY); } } @@ -2999,17 +3055,17 @@ public T accept(ParseTreeVisitor visitor) { public final GhostSliceTypeContext ghostSliceType() throws RecognitionException { GhostSliceTypeContext _localctx = new GhostSliceTypeContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_ghostSliceType); + enterRule(_localctx, 90, RULE_ghostSliceType); try { enterOuterAlt(_localctx, 1); { - setState(705); + setState(713); match(GHOST); - setState(706); + setState(714); match(L_BRACKET); - setState(707); + setState(715); match(R_BRACKET); - setState(708); + setState(716); elementType(); } } @@ -3052,10 +3108,10 @@ public T accept(ParseTreeVisitor visitor) { public final SqTypeContext sqType() throws RecognitionException { SqTypeContext _localctx = new SqTypeContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_sqType); + enterRule(_localctx, 92, RULE_sqType); int _la; try { - setState(721); + setState(729); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3065,7 +3121,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(710); + setState(718); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << OPT))) != 0)) ) { @@ -3076,11 +3132,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(711); + setState(719); match(L_BRACKET); - setState(712); + setState(720); type_(); - setState(713); + setState(721); match(R_BRACKET); } } @@ -3088,15 +3144,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(715); + setState(723); ((SqTypeContext)_localctx).kind = match(DICT); - setState(716); + setState(724); match(L_BRACKET); - setState(717); + setState(725); type_(); - setState(718); + setState(726); match(R_BRACKET); - setState(719); + setState(727); type_(); } break; @@ -3151,20 +3207,20 @@ public T accept(ParseTreeVisitor visitor) { public final SpecificationContext specification() throws RecognitionException { SpecificationContext _localctx = new SpecificationContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_specification); + enterRule(_localctx, 94, RULE_specification); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(733); + setState(741); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(728); + setState(736); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3172,20 +3228,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(723); + setState(731); specStatement(); } break; case PURE: { - setState(724); + setState(732); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(726); + setState(734); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3193,21 +3249,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(730); + setState(738); eos(); } } } - setState(735); + setState(743); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); } - setState(738); + setState(746); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(736); + setState(744); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3251,44 +3307,44 @@ public T accept(ParseTreeVisitor visitor) { public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_specStatement); + enterRule(_localctx, 96, RULE_specStatement); try { - setState(748); + setState(756); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(740); + setState(748); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(741); + setState(749); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(742); + setState(750); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(743); + setState(751); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(744); + setState(752); ((SpecStatementContext)_localctx).kind = match(POST); - setState(745); + setState(753); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(746); + setState(754); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(747); + setState(755); terminationMeasure(); } break; @@ -3328,28 +3384,28 @@ public T accept(ParseTreeVisitor visitor) { public final TerminationMeasureContext terminationMeasure() throws RecognitionException { TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_terminationMeasure); + enterRule(_localctx, 98, RULE_terminationMeasure); try { enterOuterAlt(_localctx, 1); { - setState(751); + setState(759); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: { - setState(750); + setState(758); expressionList(); } break; } - setState(755); + setState(763); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { case 1: { - setState(753); + setState(761); match(IF); - setState(754); + setState(762); expression(0); } break; @@ -3384,9 +3440,9 @@ public T accept(ParseTreeVisitor visitor) { public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_assertion); + enterRule(_localctx, 100, RULE_assertion); try { - setState(759); + setState(767); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: @@ -3397,7 +3453,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(758); + setState(766); expression(0); } break; @@ -3440,32 +3496,32 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtContext matchStmt() throws RecognitionException { MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_matchStmt); + enterRule(_localctx, 102, RULE_matchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(761); + setState(769); match(MATCH); - setState(762); + setState(770); expression(0); - setState(763); + setState(771); match(L_CURLY); - setState(767); + setState(775); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(764); + setState(772); matchStmtClause(); } } - setState(769); + setState(777); _errHandler.sync(this); _la = _input.LA(1); } - setState(770); + setState(778); match(R_CURLY); } } @@ -3501,20 +3557,20 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtClauseContext matchStmtClause() throws RecognitionException { MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_matchStmtClause); + enterRule(_localctx, 104, RULE_matchStmtClause); try { enterOuterAlt(_localctx, 1); { - setState(772); + setState(780); matchCase(); - setState(773); + setState(781); match(COLON); - setState(775); + setState(783); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(774); + setState(782); statementList(); } break; @@ -3551,24 +3607,24 @@ public T accept(ParseTreeVisitor visitor) { public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_matchCase); + enterRule(_localctx, 106, RULE_matchCase); try { - setState(780); + setState(788); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(777); + setState(785); match(CASE); - setState(778); + setState(786); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(779); + setState(787); match(DEFAULT); } break; @@ -3639,19 +3695,19 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternContext matchPattern() throws RecognitionException { MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_matchPattern); + enterRule(_localctx, 108, RULE_matchPattern); int _la; try { - setState(795); + setState(803); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(782); + setState(790); match(QMARK); - setState(783); + setState(791); match(IDENTIFIER); } break; @@ -3659,23 +3715,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(784); + setState(792); literalType(); - setState(785); + setState(793); match(L_CURLY); - setState(790); + setState(798); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(786); + setState(794); matchPatternList(); - setState(788); + setState(796); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(787); + setState(795); match(COMMA); } } @@ -3683,7 +3739,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(792); + setState(800); match(R_CURLY); } break; @@ -3691,7 +3747,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(794); + setState(802); expression(0); } break; @@ -3732,28 +3788,28 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternListContext matchPatternList() throws RecognitionException { MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_matchPatternList); + enterRule(_localctx, 110, RULE_matchPatternList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(797); + setState(805); matchPattern(); - setState(802); + setState(810); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(798); + setState(806); match(COMMA); - setState(799); + setState(807); matchPattern(); } } } - setState(804); + setState(812); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } @@ -3796,37 +3852,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_blockWithBodyParameterInfo); + enterRule(_localctx, 112, RULE_blockWithBodyParameterInfo); try { enterOuterAlt(_localctx, 1); { - setState(805); + setState(813); match(L_CURLY); - setState(810); + setState(818); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(806); + setState(814); match(SHARE); - setState(807); + setState(815); identifierList(); - setState(808); + setState(816); eos(); } break; } - setState(813); + setState(821); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: { - setState(812); + setState(820); statementList(); } break; } - setState(815); + setState(823); match(R_CURLY); } } @@ -3865,47 +3921,47 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException { ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_closureSpecInstance); + enterRule(_localctx, 114, RULE_closureSpecInstance); int _la; try { enterOuterAlt(_localctx, 1); { - setState(819); + setState(827); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(817); + setState(825); qualifiedIdent(); } break; case 2: { - setState(818); + setState(826); match(IDENTIFIER); } break; } - setState(829); + setState(837); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(821); + setState(829); match(L_CURLY); - setState(826); + setState(834); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(822); + setState(830); closureSpecParams(); - setState(824); + setState(832); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(823); + setState(831); match(COMMA); } } @@ -3913,7 +3969,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(828); + setState(836); match(R_CURLY); } break; @@ -3955,28 +4011,28 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException { ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_closureSpecParams); + enterRule(_localctx, 116, RULE_closureSpecParams); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(831); + setState(839); closureSpecParam(); - setState(836); + setState(844); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(832); + setState(840); match(COMMA); - setState(833); + setState(841); closureSpecParam(); } } } - setState(838); + setState(846); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } @@ -4012,23 +4068,23 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamContext closureSpecParam() throws RecognitionException { ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_closureSpecParam); + enterRule(_localctx, 118, RULE_closureSpecParam); try { enterOuterAlt(_localctx, 1); { - setState(841); + setState(849); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(839); + setState(847); match(IDENTIFIER); - setState(840); + setState(848); match(COLON); } break; } - setState(843); + setState(851); expression(0); } } @@ -4068,19 +4124,19 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException { ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_closureImplProofStmt); + enterRule(_localctx, 120, RULE_closureImplProofStmt); try { enterOuterAlt(_localctx, 1); { - setState(845); + setState(853); match(PROOF); - setState(846); + setState(854); expression(0); - setState(847); + setState(855); match(IMPL); - setState(848); + setState(856); closureSpecInstance(); - setState(849); + setState(857); block(); } } @@ -4136,57 +4192,57 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofContext implementationProof() throws RecognitionException { ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_implementationProof); + enterRule(_localctx, 122, RULE_implementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(851); + setState(859); type_(); - setState(852); + setState(860); match(IMPL); - setState(853); + setState(861); type_(); - setState(872); + setState(880); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(854); + setState(862); match(L_CURLY); - setState(860); + setState(868); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(855); + setState(863); implementationProofPredicateAlias(); - setState(856); + setState(864); eos(); } } - setState(862); + setState(870); _errHandler.sync(this); _la = _input.LA(1); } - setState(868); + setState(876); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(863); + setState(871); methodImplementationProof(); - setState(864); + setState(872); eos(); } } - setState(870); + setState(878); _errHandler.sync(this); _la = _input.LA(1); } - setState(871); + setState(879); match(R_CURLY); } break; @@ -4229,33 +4285,33 @@ public T accept(ParseTreeVisitor visitor) { public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException { MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_methodImplementationProof); + enterRule(_localctx, 124, RULE_methodImplementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(875); + setState(883); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(874); + setState(882); match(PURE); } } - setState(877); + setState(885); nonLocalReceiver(); - setState(878); + setState(886); match(IDENTIFIER); - setState(879); + setState(887); signature(); - setState(881); + setState(889); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(880); + setState(888); block(); } break; @@ -4294,36 +4350,36 @@ public T accept(ParseTreeVisitor visitor) { public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException { NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_nonLocalReceiver); + enterRule(_localctx, 126, RULE_nonLocalReceiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(883); + setState(891); match(L_PAREN); - setState(885); + setState(893); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(884); + setState(892); match(IDENTIFIER); } break; } - setState(888); + setState(896); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(887); + setState(895); match(STAR); } } - setState(890); + setState(898); typeName(); - setState(891); + setState(899); match(R_PAREN); } } @@ -4360,26 +4416,26 @@ public T accept(ParseTreeVisitor visitor) { public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_selection); + enterRule(_localctx, 128, RULE_selection); try { - setState(898); + setState(906); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(893); + setState(901); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(894); + setState(902); type_(); - setState(895); + setState(903); match(DOT); - setState(896); + setState(904); match(IDENTIFIER); } break; @@ -4419,28 +4475,28 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException { ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_implementationProofPredicateAlias); + enterRule(_localctx, 130, RULE_implementationProofPredicateAlias); try { enterOuterAlt(_localctx, 1); { - setState(900); + setState(908); match(PRED); - setState(901); + setState(909); match(IDENTIFIER); - setState(902); + setState(910); match(DECLARE_ASSIGN); - setState(905); + setState(913); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(903); + setState(911); selection(); } break; case 2: { - setState(904); + setState(912); operandName(); } break; @@ -4482,30 +4538,30 @@ public T accept(ParseTreeVisitor visitor) { public final MakeContext make() throws RecognitionException { MakeContext _localctx = new MakeContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_make); + enterRule(_localctx, 132, RULE_make); int _la; try { enterOuterAlt(_localctx, 1); { - setState(907); + setState(915); match(MAKE); - setState(908); + setState(916); match(L_PAREN); - setState(909); + setState(917); type_(); - setState(912); + setState(920); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(910); + setState(918); match(COMMA); - setState(911); + setState(919); expressionList(); } } - setState(914); + setState(922); match(R_PAREN); } } @@ -4540,17 +4596,17 @@ public T accept(ParseTreeVisitor visitor) { public final New_Context new_() throws RecognitionException { New_Context _localctx = new New_Context(_ctx, getState()); - enterRule(_localctx, 132, RULE_new_); + enterRule(_localctx, 134, RULE_new_); try { enterOuterAlt(_localctx, 1); { - setState(916); + setState(924); match(NEW); - setState(917); + setState(925); match(L_PAREN); - setState(918); + setState(926); type_(); - setState(919); + setState(927); match(R_PAREN); } } @@ -4589,24 +4645,24 @@ public T accept(ParseTreeVisitor visitor) { public final SpecMemberContext specMember() throws RecognitionException { SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_specMember); + enterRule(_localctx, 136, RULE_specMember); try { enterOuterAlt(_localctx, 1); { - setState(921); + setState(929); ((SpecMemberContext)_localctx).specification = specification(); - setState(924); + setState(932); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(922); + setState(930); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(923); + setState(931); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -4651,23 +4707,23 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 136, RULE_functionDecl); + enterRule(_localctx, 138, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(926); + setState(934); match(FUNC); - setState(927); + setState(935); match(IDENTIFIER); { - setState(928); + setState(936); signature(); - setState(930); + setState(938); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(929); + setState(937); blockWithBodyParameterInfo(); } break; @@ -4716,25 +4772,25 @@ public T accept(ParseTreeVisitor visitor) { public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws RecognitionException { MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 138, RULE_methodDecl); + enterRule(_localctx, 140, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(932); + setState(940); match(FUNC); - setState(933); + setState(941); receiver(); - setState(934); + setState(942); match(IDENTIFIER); { - setState(935); + setState(943); signature(); - setState(937); + setState(945); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(936); + setState(944); blockWithBodyParameterInfo(); } break; @@ -4774,13 +4830,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException { ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState()); - enterRule(_localctx, 140, RULE_explicitGhostMember); + enterRule(_localctx, 142, RULE_explicitGhostMember); try { enterOuterAlt(_localctx, 1); { - setState(939); + setState(947); match(GHOST); - setState(942); + setState(950); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4791,7 +4847,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(940); + setState(948); specMember(); } break; @@ -4799,7 +4855,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(941); + setState(949); declaration(); } break; @@ -4841,22 +4897,22 @@ public T accept(ParseTreeVisitor visitor) { public final FpredicateDeclContext fpredicateDecl() throws RecognitionException { FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 142, RULE_fpredicateDecl); + enterRule(_localctx, 144, RULE_fpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(944); + setState(952); match(PRED); - setState(945); + setState(953); match(IDENTIFIER); - setState(946); + setState(954); parameters(); - setState(948); + setState(956); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(947); + setState(955); predicateBody(); } break; @@ -4896,17 +4952,17 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateBodyContext predicateBody() throws RecognitionException { PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_predicateBody); + enterRule(_localctx, 146, RULE_predicateBody); try { enterOuterAlt(_localctx, 1); { - setState(950); + setState(958); match(L_CURLY); - setState(951); + setState(959); expression(0); - setState(952); + setState(960); eos(); - setState(953); + setState(961); match(R_CURLY); } } @@ -4946,24 +5002,24 @@ public T accept(ParseTreeVisitor visitor) { public final MpredicateDeclContext mpredicateDecl() throws RecognitionException { MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_mpredicateDecl); + enterRule(_localctx, 148, RULE_mpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(955); + setState(963); match(PRED); - setState(956); + setState(964); receiver(); - setState(957); + setState(965); match(IDENTIFIER); - setState(958); + setState(966); parameters(); - setState(960); + setState(968); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(959); + setState(967); predicateBody(); } break; @@ -5005,13 +5061,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarSpecContext varSpec() throws RecognitionException { VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); - enterRule(_localctx, 148, RULE_varSpec); + enterRule(_localctx, 150, RULE_varSpec); try { enterOuterAlt(_localctx, 1); { - setState(962); - maybeAddressableIdentifierList(); setState(970); + maybeAddressableIdentifierList(); + setState(978); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5034,16 +5090,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(963); + setState(971); type_(); - setState(966); + setState(974); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { - setState(964); + setState(972); match(ASSIGN); - setState(965); + setState(973); expressionList(); } break; @@ -5052,9 +5108,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(968); + setState(976); match(ASSIGN); - setState(969); + setState(977); expressionList(); } break; @@ -5095,15 +5151,15 @@ public T accept(ParseTreeVisitor visitor) { public final ShortVarDeclContext shortVarDecl() throws RecognitionException { ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_shortVarDecl); + enterRule(_localctx, 152, RULE_shortVarDecl); try { enterOuterAlt(_localctx, 1); { - setState(972); + setState(980); maybeAddressableIdentifierList(); - setState(973); + setState(981); match(DECLARE_ASSIGN); - setState(974); + setState(982); expressionList(); } } @@ -5141,36 +5197,36 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverContext receiver() throws RecognitionException { ReceiverContext _localctx = new ReceiverContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_receiver); + enterRule(_localctx, 154, RULE_receiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(976); + setState(984); match(L_PAREN); - setState(978); + setState(986); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(977); + setState(985); maybeAddressableIdentifier(); } break; } - setState(980); + setState(988); type_(); - setState(982); + setState(990); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(981); + setState(989); match(COMMA); } } - setState(984); + setState(992); match(R_PAREN); } } @@ -5205,22 +5261,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_parameterDecl); + enterRule(_localctx, 156, RULE_parameterDecl); try { - setState(988); + setState(996); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(986); + setState(994); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(987); + setState(995); ghostParameterDecl(); } break; @@ -5257,21 +5313,21 @@ public T accept(ParseTreeVisitor visitor) { public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException { ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_actualParameterDecl); + enterRule(_localctx, 158, RULE_actualParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(991); + setState(999); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(990); + setState(998); identifierList(); } break; } - setState(993); + setState(1001); parameterType(); } } @@ -5307,23 +5363,23 @@ public T accept(ParseTreeVisitor visitor) { public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException { GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_ghostParameterDecl); + enterRule(_localctx, 160, RULE_ghostParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(995); + setState(1003); match(GHOST); - setState(997); + setState(1005); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: { - setState(996); + setState(1004); identifierList(); } break; } - setState(999); + setState(1007); parameterType(); } } @@ -5356,22 +5412,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_parameterType); + enterRule(_localctx, 162, RULE_parameterType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1002); + setState(1010); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1001); + setState(1009); match(ELLIPSIS); } } - setState(1004); + setState(1012); type_(); } } @@ -5670,14 +5726,14 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 162; - enterRecursionRule(_localctx, 162, RULE_expression, _p); + int _startState = 164; + enterRecursionRule(_localctx, 164, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1027); + setState(1035); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: @@ -5686,10 +5742,10 @@ private ExpressionContext expression(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1007); + setState(1015); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)))) != 0)) ) { + if ( !(((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)))) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5697,7 +5753,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1008); + setState(1016); expression(15); } break; @@ -5706,7 +5762,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1009); + setState(1017); primaryExpr(0); } break; @@ -5715,13 +5771,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1010); + setState(1018); match(UNFOLDING); - setState(1011); + setState(1019); predicateAccess(); - setState(1012); + setState(1020); match(IN); - setState(1013); + setState(1021); expression(3); } break; @@ -5730,13 +5786,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1015); + setState(1023); match(LET); - setState(1016); + setState(1024); shortVarDecl(); - setState(1017); + setState(1025); match(IN); - setState(1018); + setState(1026); expression(2); } break; @@ -5745,7 +5801,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1020); + setState(1028); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5755,21 +5811,21 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1021); + setState(1029); boundVariables(); - setState(1022); + setState(1030); match(COLON); - setState(1023); + setState(1031); match(COLON); - setState(1024); + setState(1032); triggers(); - setState(1025); + setState(1033); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1064); + setState(1072); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,79,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -5777,19 +5833,19 @@ private ExpressionContext expression(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1062); + setState(1070); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1029); + setState(1037); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1030); + setState(1038); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & ((1L << (DIV - 126)) | (1L << (MOD - 126)) | (1L << (LSHIFT - 126)) | (1L << (RSHIFT - 126)) | (1L << (BIT_CLEAR - 126)) | (1L << (STAR - 126)) | (1L << (AMPERSAND - 126)))) != 0)) ) { + if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & ((1L << (DIV - 127)) | (1L << (MOD - 127)) | (1L << (LSHIFT - 127)) | (1L << (RSHIFT - 127)) | (1L << (BIT_CLEAR - 127)) | (1L << (STAR - 127)) | (1L << (AMPERSAND - 127)))) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -5797,7 +5853,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1031); + setState(1039); expression(14); } break; @@ -5805,12 +5861,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1032); + setState(1040); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1033); + setState(1041); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & ((1L << (PLUS_PLUS - 113)) | (1L << (OR - 113)) | (1L << (PLUS - 113)) | (1L << (MINUS - 113)) | (1L << (CARET - 113)))) != 0)) ) { + if ( !(_la==WAND || ((((_la - 114)) & ~0x3f) == 0 && ((1L << (_la - 114)) & ((1L << (PLUS_PLUS - 114)) | (1L << (OR - 114)) | (1L << (PLUS - 114)) | (1L << (MINUS - 114)) | (1L << (CARET - 114)))) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -5818,7 +5874,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1034); + setState(1042); expression(13); } break; @@ -5826,9 +5882,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1035); + setState(1043); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1036); + setState(1044); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << UNION) | (1L << INTERSECTION) | (1L << SETMINUS))) != 0)) ) { @@ -5839,7 +5895,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1037); + setState(1045); expression(12); } break; @@ -5847,9 +5903,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1038); + setState(1046); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1039); + setState(1047); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << IN) | (1L << MULTI) | (1L << SUBSET))) != 0)) ) { @@ -5860,7 +5916,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1040); + setState(1048); expression(11); } break; @@ -5868,12 +5924,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1041); + setState(1049); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1042); + setState(1050); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (GHOST_EQUALS - 72)) | (1L << (GHOST_NOT_EQUALS - 72)) | (1L << (EQUALS - 72)) | (1L << (NOT_EQUALS - 72)) | (1L << (LESS - 72)) | (1L << (LESS_OR_EQUALS - 72)) | (1L << (GREATER - 72)) | (1L << (GREATER_OR_EQUALS - 72)))) != 0)) ) { + if ( !(((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (GHOST_EQUALS - 73)) | (1L << (GHOST_NOT_EQUALS - 73)) | (1L << (EQUALS - 73)) | (1L << (NOT_EQUALS - 73)) | (1L << (LESS - 73)) | (1L << (LESS_OR_EQUALS - 73)) | (1L << (GREATER - 73)) | (1L << (GREATER_OR_EQUALS - 73)))) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -5881,7 +5937,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1043); + setState(1051); expression(10); } break; @@ -5889,11 +5945,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1044); + setState(1052); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1045); + setState(1053); match(LOGICAL_AND); - setState(1046); + setState(1054); expression(8); } break; @@ -5901,11 +5957,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1047); + setState(1055); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1048); + setState(1056); match(LOGICAL_OR); - setState(1049); + setState(1057); expression(7); } break; @@ -5913,11 +5969,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1050); + setState(1058); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1051); + setState(1059); match(IMPLIES); - setState(1052); + setState(1060); expression(5); } break; @@ -5925,15 +5981,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1053); + setState(1061); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1054); + setState(1062); match(QMARK); - setState(1055); + setState(1063); expression(0); - setState(1056); + setState(1064); match(COLON); - setState(1057); + setState(1065); expression(4); } break; @@ -5941,18 +5997,18 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1059); + setState(1067); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1060); + setState(1068); match(IMPL); - setState(1061); + setState(1069); closureSpecInstance(); } break; } } } - setState(1066); + setState(1074); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,79,_ctx); } @@ -6043,148 +6099,148 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 164, RULE_statement); + enterRule(_localctx, 166, RULE_statement); try { - setState(1087); + setState(1095); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1067); + setState(1075); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1068); + setState(1076); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1069); + setState(1077); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1070); + setState(1078); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1071); + setState(1079); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1072); + setState(1080); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1073); + setState(1081); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1074); + setState(1082); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1075); + setState(1083); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1076); + setState(1084); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1077); + setState(1085); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1078); + setState(1086); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1079); + setState(1087); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1080); + setState(1088); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1081); + setState(1089); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1082); + setState(1090); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1083); + setState(1091); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1084); + setState(1092); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1085); + setState(1093); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1086); + setState(1094); closureImplProofStmt(); } break; @@ -6219,13 +6275,13 @@ public T accept(ParseTreeVisitor visitor) { public final ApplyStmtContext applyStmt() throws RecognitionException { ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_applyStmt); + enterRule(_localctx, 168, RULE_applyStmt); try { enterOuterAlt(_localctx, 1); { - setState(1089); + setState(1097); match(APPLY); - setState(1090); + setState(1098); expression(0); } } @@ -6261,20 +6317,20 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_packageStmt); + enterRule(_localctx, 170, RULE_packageStmt); try { enterOuterAlt(_localctx, 1); { - setState(1092); + setState(1100); match(PACKAGE); - setState(1093); + setState(1101); expression(0); - setState(1095); + setState(1103); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(1094); + setState(1102); block(); } break; @@ -6312,13 +6368,13 @@ public T accept(ParseTreeVisitor visitor) { public final SpecForStmtContext specForStmt() throws RecognitionException { SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_specForStmt); + enterRule(_localctx, 172, RULE_specForStmt); try { enterOuterAlt(_localctx, 1); { - setState(1097); + setState(1105); loopSpec(); - setState(1098); + setState(1106); forStmt(); } } @@ -6367,39 +6423,39 @@ public T accept(ParseTreeVisitor visitor) { public final LoopSpecContext loopSpec() throws RecognitionException { LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_loopSpec); + enterRule(_localctx, 174, RULE_loopSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1106); + setState(1114); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1100); + setState(1108); match(INV); - setState(1101); + setState(1109); expression(0); - setState(1102); + setState(1110); eos(); } } - setState(1108); + setState(1116); _errHandler.sync(this); _la = _input.LA(1); } - setState(1113); + setState(1121); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1109); + setState(1117); match(DEC); - setState(1110); + setState(1118); terminationMeasure(); - setState(1111); + setState(1119); eos(); } } @@ -6441,27 +6497,27 @@ public T accept(ParseTreeVisitor visitor) { public final DeferStmtContext deferStmt() throws RecognitionException { DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_deferStmt); + enterRule(_localctx, 176, RULE_deferStmt); int _la; try { - setState(1120); + setState(1128); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1115); + setState(1123); match(DEFER); - setState(1116); + setState(1124); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1117); + setState(1125); match(DEFER); - setState(1118); + setState(1126); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6472,7 +6528,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1119); + setState(1127); predicateAccess(); } break; @@ -6515,64 +6571,64 @@ public T accept(ParseTreeVisitor visitor) { public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_basicLit); + enterRule(_localctx, 178, RULE_basicLit); try { - setState(1130); + setState(1138); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1122); + setState(1130); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1123); + setState(1131); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1124); + setState(1132); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1125); + setState(1133); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1126); + setState(1134); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1127); + setState(1135); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1128); + setState(1136); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1129); + setState(1137); match(RUNE_LIT); } break; @@ -6809,14 +6865,14 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _parentState = getState(); PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState); PrimaryExprContext _prevctx = _localctx; - int _startState = 178; - enterRecursionRule(_localctx, 178, RULE_primaryExpr, _p); + int _startState = 180; + enterRecursionRule(_localctx, 180, RULE_primaryExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1144); + setState(1152); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: @@ -6825,7 +6881,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1133); + setState(1141); operand(); } break; @@ -6834,7 +6890,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1134); + setState(1142); conversion(); } break; @@ -6843,7 +6899,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1135); + setState(1143); methodExpr(); } break; @@ -6852,7 +6908,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1136); + setState(1144); ghostPrimaryExpr(); } break; @@ -6861,7 +6917,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1137); + setState(1145); new_(); } break; @@ -6870,7 +6926,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1138); + setState(1146); make(); } break; @@ -6879,7 +6935,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1139); + setState(1147); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & ((1L << (LEN - 45)) | (1L << (CAP - 45)) | (1L << (DOM - 45)) | (1L << (RANGE - 45)))) != 0)) ) { @@ -6890,17 +6946,17 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1140); + setState(1148); match(L_PAREN); - setState(1141); + setState(1149); expression(0); - setState(1142); + setState(1150); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1168); + setState(1176); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,88,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6908,18 +6964,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1166); + setState(1174); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1146); + setState(1154); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1147); + setState(1155); match(DOT); - setState(1148); + setState(1156); match(IDENTIFIER); } break; @@ -6927,9 +6983,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1149); + setState(1157); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1150); + setState(1158); index(); } break; @@ -6937,9 +6993,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1151); + setState(1159); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1152); + setState(1160); slice_(); } break; @@ -6947,9 +7003,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1153); + setState(1161); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1154); + setState(1162); seqUpdExp(); } break; @@ -6957,9 +7013,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1155); + setState(1163); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1156); + setState(1164); typeAssertion(); } break; @@ -6967,9 +7023,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1157); + setState(1165); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1158); + setState(1166); arguments(); } break; @@ -6977,13 +7033,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1159); + setState(1167); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1160); + setState(1168); arguments(); - setState(1161); + setState(1169); match(AS); - setState(1162); + setState(1170); closureSpecInstance(); } break; @@ -6991,16 +7047,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1164); + setState(1172); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1165); + setState(1173); predConstructArgs(); } break; } } } - setState(1170); + setState(1178); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,88,_ctx); } @@ -7038,13 +7094,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionLitContext functionLit() throws RecognitionException { FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_functionLit); + enterRule(_localctx, 182, RULE_functionLit); try { enterOuterAlt(_localctx, 1); { - setState(1171); + setState(1179); ((FunctionLitContext)_localctx).specification = specification(); - setState(1172); + setState(1180); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7086,32 +7142,32 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException { ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 182, RULE_closureDecl); + enterRule(_localctx, 184, RULE_closureDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1174); + setState(1182); match(FUNC); - setState(1176); + setState(1184); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1175); + setState(1183); match(IDENTIFIER); } } { - setState(1178); + setState(1186); signature(); - setState(1180); + setState(1188); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { - setState(1179); + setState(1187); blockWithBodyParameterInfo(); } break; @@ -7150,34 +7206,34 @@ public T accept(ParseTreeVisitor visitor) { public final PredConstructArgsContext predConstructArgs() throws RecognitionException { PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_predConstructArgs); + enterRule(_localctx, 186, RULE_predConstructArgs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1182); + setState(1190); match(L_PRED); - setState(1184); + setState(1192); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1183); + setState(1191); expressionList(); } } - setState(1187); + setState(1195); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1186); + setState(1194); match(COMMA); } } - setState(1189); + setState(1197); match(R_PRED); } } @@ -7233,52 +7289,52 @@ public T accept(ParseTreeVisitor visitor) { public final InterfaceTypeContext interfaceType() throws RecognitionException { InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState()); - enterRule(_localctx, 186, RULE_interfaceType); + enterRule(_localctx, 188, RULE_interfaceType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1191); + setState(1199); match(INTERFACE); - setState(1192); + setState(1200); match(L_CURLY); - setState(1202); + setState(1210); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << GHOST) | (1L << PRED))) != 0) || _la==TRUSTED || _la==IDENTIFIER) { { { - setState(1196); + setState(1204); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1193); + setState(1201); methodSpec(); } break; case 2: { - setState(1194); + setState(1202); typeName(); } break; case 3: { - setState(1195); + setState(1203); predicateSpec(); } break; } - setState(1198); + setState(1206); eos(); } } - setState(1204); + setState(1212); _errHandler.sync(this); _la = _input.LA(1); } - setState(1205); + setState(1213); match(R_CURLY); } } @@ -7312,15 +7368,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_predicateSpec); + enterRule(_localctx, 190, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1207); + setState(1215); match(PRED); - setState(1208); + setState(1216); match(IDENTIFIER); - setState(1209); + setState(1217); parameters(); } } @@ -7360,53 +7416,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_methodSpec); + enterRule(_localctx, 192, RULE_methodSpec); int _la; try { - setState(1226); + setState(1234); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1212); + setState(1220); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1211); + setState(1219); match(GHOST); } } - setState(1214); + setState(1222); specification(); - setState(1215); + setState(1223); match(IDENTIFIER); - setState(1216); + setState(1224); parameters(); - setState(1217); + setState(1225); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1220); + setState(1228); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1219); + setState(1227); match(GHOST); } } - setState(1222); + setState(1230); specification(); - setState(1223); + setState(1231); match(IDENTIFIER); - setState(1224); + setState(1232); parameters(); } break; @@ -7451,15 +7507,15 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 192, RULE_type_); + enterRule(_localctx, 194, RULE_type_); try { - setState(1235); + setState(1243); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1228); + setState(1236); typeName(); } break; @@ -7474,7 +7530,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1229); + setState(1237); typeLit(); } break; @@ -7488,18 +7544,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1230); + setState(1238); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1231); + setState(1239); match(L_PAREN); - setState(1232); + setState(1240); type_(); - setState(1233); + setState(1241); match(R_PAREN); } break; @@ -7559,71 +7615,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_typeLit); + enterRule(_localctx, 196, RULE_typeLit); try { - setState(1246); + setState(1254); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1237); + setState(1245); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1238); + setState(1246); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1239); + setState(1247); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1240); + setState(1248); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1241); + setState(1249); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1242); + setState(1250); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1243); + setState(1251); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1244); + setState(1252); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1245); + setState(1253); predType(); } break; @@ -7658,13 +7714,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_predType); + enterRule(_localctx, 198, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1248); + setState(1256); match(PRED); - setState(1249); + setState(1257); predTypeParams(); } } @@ -7705,45 +7761,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_predTypeParams); + enterRule(_localctx, 200, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1251); + setState(1259); match(L_PAREN); - setState(1263); + setState(1271); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 78)) & ~0x3f) == 0 && ((1L << (_la - 78)) & ((1L << (FUNC - 78)) | (1L << (INTERFACE - 78)) | (1L << (MAP - 78)) | (1L << (STRUCT - 78)) | (1L << (CHAN - 78)) | (1L << (IDENTIFIER - 78)) | (1L << (L_PAREN - 78)) | (1L << (L_BRACKET - 78)) | (1L << (STAR - 78)) | (1L << (RECEIVE - 78)))) != 0)) { { - setState(1252); + setState(1260); type_(); - setState(1257); + setState(1265); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1253); + setState(1261); match(COMMA); - setState(1254); + setState(1262); type_(); } } } - setState(1259); + setState(1267); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); } - setState(1261); + setState(1269); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1260); + setState(1268); match(COMMA); } } @@ -7751,7 +7807,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1265); + setState(1273); match(R_PAREN); } } @@ -7801,57 +7857,57 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_literalType); + enterRule(_localctx, 202, RULE_literalType); try { - setState(1274); + setState(1282); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1267); + setState(1275); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1268); + setState(1276); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1269); + setState(1277); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1270); + setState(1278); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1271); + setState(1279); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1272); + setState(1280); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1273); + setState(1281); typeName(); } break; @@ -7888,17 +7944,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_implicitArray); + enterRule(_localctx, 204, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1276); + setState(1284); match(L_BRACKET); - setState(1277); + setState(1285); match(ELLIPSIS); - setState(1278); + setState(1286); match(R_BRACKET); - setState(1279); + setState(1287); elementType(); } } @@ -7920,14 +7976,14 @@ public static class Slice_Context extends ParserRuleContext { public TerminalNode COLON(int i) { return getToken(GobraParser.COLON, i); } - public HighContext high() { - return getRuleContext(HighContext.class,0); + public HighSliceArgumentContext highSliceArgument() { + return getRuleContext(HighSliceArgumentContext.class,0); } - public CapContext cap() { - return getRuleContext(CapContext.class,0); + public CapSliceArgumentContext capSliceArgument() { + return getRuleContext(CapSliceArgumentContext.class,0); } - public LowContext low() { - return getRuleContext(LowContext.class,0); + public LowSliceArgumentContext lowSliceArgument() { + return getRuleContext(LowSliceArgumentContext.class,0); } public Slice_Context(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -7942,37 +7998,37 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 204, RULE_slice_); + enterRule(_localctx, 206, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1281); + setState(1289); match(L_BRACKET); - setState(1297); + setState(1305); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { case 1: { - setState(1283); + setState(1291); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1282); - low(); + setState(1290); + lowSliceArgument(); } } - setState(1285); + setState(1293); match(COLON); - setState(1287); + setState(1295); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1286); - high(); + setState(1294); + highSliceArgument(); } } @@ -7980,28 +8036,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1290); + setState(1298); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1289); - low(); + setState(1297); + lowSliceArgument(); } } - setState(1292); + setState(1300); match(COLON); - setState(1293); - high(); - setState(1294); + setState(1301); + highSliceArgument(); + setState(1302); match(COLON); - setState(1295); - cap(); + setState(1303); + capSliceArgument(); } break; } - setState(1299); + setState(1307); match(R_BRACKET); } } @@ -8016,28 +8072,28 @@ public final Slice_Context slice_() throws RecognitionException { return _localctx; } - public static class LowContext extends ParserRuleContext { + public static class LowSliceArgumentContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); } - public LowContext(ParserRuleContext parent, int invokingState) { + public LowSliceArgumentContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_low; } + @Override public int getRuleIndex() { return RULE_lowSliceArgument; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitLow(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitLowSliceArgument(this); else return visitor.visitChildren(this); } } - public final LowContext low() throws RecognitionException { - LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_low); + public final LowSliceArgumentContext lowSliceArgument() throws RecognitionException { + LowSliceArgumentContext _localctx = new LowSliceArgumentContext(_ctx, getState()); + enterRule(_localctx, 208, RULE_lowSliceArgument); try { enterOuterAlt(_localctx, 1); { - setState(1301); + setState(1309); expression(0); } } @@ -8052,28 +8108,28 @@ public final LowContext low() throws RecognitionException { return _localctx; } - public static class HighContext extends ParserRuleContext { + public static class HighSliceArgumentContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); } - public HighContext(ParserRuleContext parent, int invokingState) { + public HighSliceArgumentContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_high; } + @Override public int getRuleIndex() { return RULE_highSliceArgument; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitHigh(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitHighSliceArgument(this); else return visitor.visitChildren(this); } } - public final HighContext high() throws RecognitionException { - HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_high); + public final HighSliceArgumentContext highSliceArgument() throws RecognitionException { + HighSliceArgumentContext _localctx = new HighSliceArgumentContext(_ctx, getState()); + enterRule(_localctx, 210, RULE_highSliceArgument); try { enterOuterAlt(_localctx, 1); { - setState(1303); + setState(1311); expression(0); } } @@ -8088,28 +8144,28 @@ public final HighContext high() throws RecognitionException { return _localctx; } - public static class CapContext extends ParserRuleContext { + public static class CapSliceArgumentContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); } - public CapContext(ParserRuleContext parent, int invokingState) { + public CapSliceArgumentContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_cap; } + @Override public int getRuleIndex() { return RULE_capSliceArgument; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitCap(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitCapSliceArgument(this); else return visitor.visitChildren(this); } } - public final CapContext cap() throws RecognitionException { - CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_cap); + public final CapSliceArgumentContext capSliceArgument() throws RecognitionException { + CapSliceArgumentContext _localctx = new CapSliceArgumentContext(_ctx, getState()); + enterRule(_localctx, 212, RULE_capSliceArgument); try { enterOuterAlt(_localctx, 1); { - setState(1305); + setState(1313); expression(0); } } @@ -8151,20 +8207,20 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_assign_op); + enterRule(_localctx, 214, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1308); + setState(1316); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (OR - 125)) | (1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (PLUS - 125)) | (1L << (MINUS - 125)) | (1L << (CARET - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) { + if (((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & ((1L << (OR - 126)) | (1L << (DIV - 126)) | (1L << (MOD - 126)) | (1L << (LSHIFT - 126)) | (1L << (RSHIFT - 126)) | (1L << (BIT_CLEAR - 126)) | (1L << (PLUS - 126)) | (1L << (MINUS - 126)) | (1L << (CARET - 126)) | (1L << (STAR - 126)) | (1L << (AMPERSAND - 126)))) != 0)) { { - setState(1307); + setState(1315); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (OR - 125)) | (1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (PLUS - 125)) | (1L << (MINUS - 125)) | (1L << (CARET - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) ) { + if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & ((1L << (OR - 126)) | (1L << (DIV - 126)) | (1L << (MOD - 126)) | (1L << (LSHIFT - 126)) | (1L << (RSHIFT - 126)) | (1L << (BIT_CLEAR - 126)) | (1L << (PLUS - 126)) | (1L << (MINUS - 126)) | (1L << (CARET - 126)) | (1L << (STAR - 126)) | (1L << (AMPERSAND - 126)))) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -8175,7 +8231,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1310); + setState(1318); match(ASSIGN); } } @@ -8218,48 +8274,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_rangeClause); + enterRule(_localctx, 216, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1318); + setState(1326); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { case 1: { - setState(1312); + setState(1320); expressionList(); - setState(1313); + setState(1321); match(ASSIGN); } break; case 2: { - setState(1315); + setState(1323); maybeAddressableIdentifierList(); - setState(1316); + setState(1324); match(DECLARE_ASSIGN); } break; } - setState(1320); + setState(1328); match(RANGE); - setState(1321); + setState(1329); expression(0); - setState(1326); + setState(1334); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1322); + setState(1330); match(WITH); - setState(1324); + setState(1332); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1323); + setState(1331); match(IDENTIFIER); } } @@ -8297,13 +8353,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_packageClause); + enterRule(_localctx, 218, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1336); match(PACKAGE); - setState(1329); + setState(1337); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8335,11 +8391,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_importPath); + enterRule(_localctx, 220, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1331); + setState(1339); string_(); } } @@ -8377,29 +8433,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_declaration); + enterRule(_localctx, 222, RULE_declaration); try { - setState(1336); + setState(1344); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1333); + setState(1341); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1334); + setState(1342); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1335); + setState(1343); varDecl(); } break; @@ -8447,43 +8503,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_constDecl); + enterRule(_localctx, 224, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1346); match(CONST); - setState(1350); + setState(1358); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1339); + setState(1347); constSpec(); } break; case L_PAREN: { - setState(1340); + setState(1348); match(L_PAREN); - setState(1346); + setState(1354); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1341); + setState(1349); constSpec(); - setState(1342); + setState(1350); eos(); } } - setState(1348); + setState(1356); _errHandler.sync(this); _la = _input.LA(1); } - setState(1349); + setState(1357); match(R_PAREN); } break; @@ -8527,31 +8583,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_constSpec); + enterRule(_localctx, 226, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1352); + setState(1360); identifierList(); - setState(1358); + setState(1366); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: { - setState(1354); + setState(1362); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 78)) & ~0x3f) == 0 && ((1L << (_la - 78)) & ((1L << (FUNC - 78)) | (1L << (INTERFACE - 78)) | (1L << (MAP - 78)) | (1L << (STRUCT - 78)) | (1L << (CHAN - 78)) | (1L << (IDENTIFIER - 78)) | (1L << (L_PAREN - 78)) | (1L << (L_BRACKET - 78)) | (1L << (STAR - 78)) | (1L << (RECEIVE - 78)))) != 0)) { { - setState(1353); + setState(1361); type_(); } } - setState(1356); + setState(1364); match(ASSIGN); - setState(1357); + setState(1365); expressionList(); } break; @@ -8591,28 +8647,28 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_identifierList); + enterRule(_localctx, 228, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1360); + setState(1368); match(IDENTIFIER); - setState(1365); + setState(1373); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,117,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1361); + setState(1369); match(COMMA); - setState(1362); + setState(1370); match(IDENTIFIER); } } } - setState(1367); + setState(1375); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,117,_ctx); } @@ -8653,28 +8709,28 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_expressionList); + enterRule(_localctx, 230, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1368); + setState(1376); expression(0); - setState(1373); + setState(1381); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,118,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1369); + setState(1377); match(COMMA); - setState(1370); + setState(1378); expression(0); } } } - setState(1375); + setState(1383); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,118,_ctx); } @@ -8720,43 +8776,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_typeDecl); + enterRule(_localctx, 232, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1376); + setState(1384); match(TYPE); - setState(1388); + setState(1396); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1377); + setState(1385); typeSpec(); } break; case L_PAREN: { - setState(1378); + setState(1386); match(L_PAREN); - setState(1384); + setState(1392); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1379); + setState(1387); typeSpec(); - setState(1380); + setState(1388); eos(); } } - setState(1386); + setState(1394); _errHandler.sync(this); _la = _input.LA(1); } - setState(1387); + setState(1395); match(R_PAREN); } break; @@ -8795,24 +8851,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_typeSpec); + enterRule(_localctx, 234, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1390); + setState(1398); match(IDENTIFIER); - setState(1392); + setState(1400); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1391); + setState(1399); match(ASSIGN); } } - setState(1394); + setState(1402); type_(); } } @@ -8856,43 +8912,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_varDecl); + enterRule(_localctx, 236, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1396); + setState(1404); match(VAR); - setState(1408); + setState(1416); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1397); + setState(1405); varSpec(); } break; case L_PAREN: { - setState(1398); + setState(1406); match(L_PAREN); - setState(1404); + setState(1412); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1399); + setState(1407); varSpec(); - setState(1400); + setState(1408); eos(); } } - setState(1406); + setState(1414); _errHandler.sync(this); _la = _input.LA(1); } - setState(1407); + setState(1415); match(R_PAREN); } break; @@ -8931,23 +8987,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_block); + enterRule(_localctx, 238, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1410); + setState(1418); match(L_CURLY); - setState(1412); + setState(1420); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { case 1: { - setState(1411); + setState(1419); statementList(); } break; } - setState(1414); + setState(1422); match(R_CURLY); } } @@ -8988,12 +9044,12 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_statementList); + enterRule(_localctx, 240, RULE_statementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1422); + setState(1430); _errHandler.sync(this); _alt = 1; do { @@ -9001,19 +9057,19 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1417); + setState(1425); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { case 1: { - setState(1416); + setState(1424); eos(); } break; } - setState(1419); + setState(1427); statement(); - setState(1420); + setState(1428); eos(); } } @@ -9021,7 +9077,7 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1424); + setState(1432); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,126,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -9067,43 +9123,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_simpleStmt); + enterRule(_localctx, 242, RULE_simpleStmt); try { - setState(1431); + setState(1439); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1426); + setState(1434); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1427); + setState(1435); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1428); + setState(1436); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1429); + setState(1437); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1430); + setState(1438); shortVarDecl(); } break; @@ -9137,11 +9193,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_expressionStmt); + enterRule(_localctx, 244, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1433); + setState(1441); expression(0); } } @@ -9178,15 +9234,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_sendStmt); + enterRule(_localctx, 246, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1435); + setState(1443); ((SendStmtContext)_localctx).channel = expression(0); - setState(1436); + setState(1444); match(RECEIVE); - setState(1437); + setState(1445); expression(0); } } @@ -9220,14 +9276,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_incDecStmt); + enterRule(_localctx, 248, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1439); + setState(1447); expression(0); - setState(1440); + setState(1448); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9273,15 +9329,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_assignment); + enterRule(_localctx, 250, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1442); + setState(1450); expressionList(); - setState(1443); + setState(1451); assign_op(); - setState(1444); + setState(1452); expressionList(); } } @@ -9312,12 +9368,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_emptyStmt); + enterRule(_localctx, 252, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1446); + setState(1454); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9359,20 +9415,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_labeledStmt); + enterRule(_localctx, 254, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1448); + setState(1456); match(IDENTIFIER); - setState(1449); + setState(1457); match(COLON); - setState(1451); + setState(1459); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { case 1: { - setState(1450); + setState(1458); statement(); } break; @@ -9408,18 +9464,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_returnStmt); + enterRule(_localctx, 256, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1453); + setState(1461); match(RETURN); - setState(1455); + setState(1463); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1454); + setState(1462); expressionList(); } break; @@ -9453,18 +9509,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_breakStmt); + enterRule(_localctx, 258, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1457); + setState(1465); match(BREAK); - setState(1459); + setState(1467); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1458); + setState(1466); match(IDENTIFIER); } break; @@ -9498,18 +9554,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_continueStmt); + enterRule(_localctx, 260, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1461); + setState(1469); match(CONTINUE); - setState(1463); + setState(1471); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1462); + setState(1470); match(IDENTIFIER); } break; @@ -9543,13 +9599,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_gotoStmt); + enterRule(_localctx, 262, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1473); match(GOTO); - setState(1466); + setState(1474); match(IDENTIFIER); } } @@ -9579,11 +9635,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_fallthroughStmt); + enterRule(_localctx, 264, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1468); + setState(1476); match(FALLTHROUGH); } } @@ -9632,61 +9688,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_ifStmt); + enterRule(_localctx, 266, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1470); + setState(1478); match(IF); - setState(1479); + setState(1487); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { case 1: { - setState(1471); + setState(1479); expression(0); } break; case 2: { - setState(1472); + setState(1480); eos(); - setState(1473); + setState(1481); expression(0); } break; case 3: { - setState(1475); + setState(1483); simpleStmt(); - setState(1476); + setState(1484); eos(); - setState(1477); + setState(1485); expression(0); } break; } - setState(1481); + setState(1489); block(); - setState(1487); + setState(1495); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: { - setState(1482); + setState(1490); match(ELSE); - setState(1485); + setState(1493); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1483); + setState(1491); ifStmt(); } break; case L_CURLY: { - setState(1484); + setState(1492); block(); } break; @@ -9729,22 +9785,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_switchStmt); + enterRule(_localctx, 268, RULE_switchStmt); try { - setState(1491); + setState(1499); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1489); + setState(1497); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1490); + setState(1498); typeSwitchStmt(); } break; @@ -9793,24 +9849,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_exprSwitchStmt); + enterRule(_localctx, 270, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1493); + setState(1501); match(SWITCH); - setState(1504); + setState(1512); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1495); + setState(1503); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1494); + setState(1502); expression(0); } } @@ -9819,24 +9875,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1498); + setState(1506); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1497); + setState(1505); simpleStmt(); } break; } - setState(1500); + setState(1508); eos(); - setState(1502); + setState(1510); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1501); + setState(1509); expression(0); } } @@ -9844,23 +9900,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1506); + setState(1514); match(L_CURLY); - setState(1510); + setState(1518); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1507); + setState(1515); exprCaseClause(); } } - setState(1512); + setState(1520); _errHandler.sync(this); _la = _input.LA(1); } - setState(1513); + setState(1521); match(R_CURLY); } } @@ -9896,20 +9952,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_exprCaseClause); + enterRule(_localctx, 272, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1523); exprSwitchCase(); - setState(1516); + setState(1524); match(COLON); - setState(1518); + setState(1526); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: { - setState(1517); + setState(1525); statementList(); } break; @@ -9946,24 +10002,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_exprSwitchCase); + enterRule(_localctx, 274, RULE_exprSwitchCase); try { - setState(1523); + setState(1531); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1520); + setState(1528); match(CASE); - setState(1521); + setState(1529); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1522); + setState(1530); match(DEFAULT); } break; @@ -10014,58 +10070,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_typeSwitchStmt); + enterRule(_localctx, 276, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1525); + setState(1533); match(SWITCH); - setState(1534); + setState(1542); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1526); + setState(1534); typeSwitchGuard(); } break; case 2: { - setState(1527); + setState(1535); eos(); - setState(1528); + setState(1536); typeSwitchGuard(); } break; case 3: { - setState(1530); + setState(1538); simpleStmt(); - setState(1531); + setState(1539); eos(); - setState(1532); + setState(1540); typeSwitchGuard(); } break; } - setState(1536); + setState(1544); match(L_CURLY); - setState(1540); + setState(1548); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1537); + setState(1545); typeCaseClause(); } } - setState(1542); + setState(1550); _errHandler.sync(this); _la = _input.LA(1); } - setState(1543); + setState(1551); match(R_CURLY); } } @@ -10103,31 +10159,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_typeSwitchGuard); + enterRule(_localctx, 278, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1547); + setState(1555); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1545); + setState(1553); match(IDENTIFIER); - setState(1546); + setState(1554); match(DECLARE_ASSIGN); } break; } - setState(1549); + setState(1557); primaryExpr(0); - setState(1550); + setState(1558); match(DOT); - setState(1551); + setState(1559); match(L_PAREN); - setState(1552); + setState(1560); match(TYPE); - setState(1553); + setState(1561); match(R_PAREN); } } @@ -10163,20 +10219,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_typeCaseClause); + enterRule(_localctx, 280, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1555); + setState(1563); typeSwitchCase(); - setState(1556); + setState(1564); match(COLON); - setState(1558); + setState(1566); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1557); + setState(1565); statementList(); } break; @@ -10213,24 +10269,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_typeSwitchCase); + enterRule(_localctx, 282, RULE_typeSwitchCase); try { - setState(1563); + setState(1571); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1560); + setState(1568); match(CASE); - setState(1561); + setState(1569); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1562); + setState(1570); match(DEFAULT); } break; @@ -10277,12 +10333,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_typeList); + enterRule(_localctx, 284, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1567); + setState(1575); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10305,28 +10361,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1565); + setState(1573); type_(); } break; case NIL_LIT: { - setState(1566); + setState(1574); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1576); + setState(1584); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1569); + setState(1577); match(COMMA); - setState(1572); + setState(1580); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10349,13 +10405,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1570); + setState(1578); type_(); } break; case NIL_LIT: { - setState(1571); + setState(1579); match(NIL_LIT); } break; @@ -10364,7 +10420,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1578); + setState(1586); _errHandler.sync(this); _la = _input.LA(1); } @@ -10404,30 +10460,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_selectStmt); + enterRule(_localctx, 286, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1579); + setState(1587); match(SELECT); - setState(1580); + setState(1588); match(L_CURLY); - setState(1584); + setState(1592); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1581); + setState(1589); commClause(); } } - setState(1586); + setState(1594); _errHandler.sync(this); _la = _input.LA(1); } - setState(1587); + setState(1595); match(R_CURLY); } } @@ -10463,20 +10519,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_commClause); + enterRule(_localctx, 288, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1589); + setState(1597); commCase(); - setState(1590); + setState(1598); match(COLON); - setState(1592); + setState(1600); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: { - setState(1591); + setState(1599); statementList(); } break; @@ -10516,28 +10572,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_commCase); + enterRule(_localctx, 290, RULE_commCase); try { - setState(1600); + setState(1608); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1594); + setState(1602); match(CASE); - setState(1597); + setState(1605); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: { - setState(1595); + setState(1603); sendStmt(); } break; case 2: { - setState(1596); + setState(1604); recvStmt(); } break; @@ -10547,7 +10603,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1599); + setState(1607); match(DEFAULT); } break; @@ -10592,31 +10648,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_recvStmt); + enterRule(_localctx, 292, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1608); + setState(1616); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: { - setState(1602); + setState(1610); expressionList(); - setState(1603); + setState(1611); match(ASSIGN); } break; case 2: { - setState(1605); + setState(1613); identifierList(); - setState(1606); + setState(1614); match(DECLARE_ASSIGN); } break; } - setState(1610); + setState(1618); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -10658,35 +10714,35 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_forStmt); + enterRule(_localctx, 294, RULE_forStmt); try { enterOuterAlt(_localctx, 1); { - setState(1612); + setState(1620); match(FOR); - setState(1616); + setState(1624); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1613); + setState(1621); expression(0); } break; case 2: { - setState(1614); + setState(1622); forClause(); } break; case 3: { - setState(1615); + setState(1623); rangeClause(); } break; } - setState(1618); + setState(1626); block(); } } @@ -10732,41 +10788,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_forClause); + enterRule(_localctx, 296, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1621); + setState(1629); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1620); + setState(1628); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1623); + setState(1631); eos(); - setState(1625); + setState(1633); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1624); + setState(1632); expression(0); } break; } - setState(1627); + setState(1635); eos(); - setState(1629); + setState(1637); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1628); + setState(1636); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10802,13 +10858,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_goStmt); + enterRule(_localctx, 298, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1631); + setState(1639); match(GO); - setState(1632); + setState(1640); expression(0); } } @@ -10841,22 +10897,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_typeName); + enterRule(_localctx, 300, RULE_typeName); try { - setState(1636); + setState(1644); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1634); + setState(1642); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1635); + setState(1643); match(IDENTIFIER); } break; @@ -10895,17 +10951,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_arrayType); + enterRule(_localctx, 302, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1638); + setState(1646); match(L_BRACKET); - setState(1639); + setState(1647); arrayLength(); - setState(1640); + setState(1648); match(R_BRACKET); - setState(1641); + setState(1649); elementType(); } } @@ -10937,11 +10993,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_arrayLength); + enterRule(_localctx, 304, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1643); + setState(1651); expression(0); } } @@ -10973,11 +11029,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_elementType); + enterRule(_localctx, 306, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1645); + setState(1653); type_(); } } @@ -11010,13 +11066,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_pointerType); + enterRule(_localctx, 308, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1647); + setState(1655); match(STAR); - setState(1648); + setState(1656); type_(); } } @@ -11050,15 +11106,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_sliceType); + enterRule(_localctx, 310, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1650); + setState(1658); match(L_BRACKET); - setState(1651); + setState(1659); match(R_BRACKET); - setState(1652); + setState(1660); elementType(); } } @@ -11096,19 +11152,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_mapType); + enterRule(_localctx, 312, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1654); + setState(1662); match(MAP); - setState(1655); + setState(1663); match(L_BRACKET); - setState(1656); + setState(1664); type_(); - setState(1657); + setState(1665); match(R_BRACKET); - setState(1658); + setState(1666); elementType(); } } @@ -11142,37 +11198,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_channelType); + enterRule(_localctx, 314, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1665); + setState(1673); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1660); + setState(1668); match(CHAN); } break; case 2: { - setState(1661); + setState(1669); match(CHAN); - setState(1662); + setState(1670); match(RECEIVE); } break; case 3: { - setState(1663); + setState(1671); match(RECEIVE); - setState(1664); + setState(1672); match(CHAN); } break; } - setState(1667); + setState(1675); elementType(); } } @@ -11205,13 +11261,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_functionType); + enterRule(_localctx, 316, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1669); + setState(1677); match(FUNC); - setState(1670); + setState(1678); signature(); } } @@ -11246,24 +11302,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_signature); + enterRule(_localctx, 318, RULE_signature); try { - setState(1676); + setState(1684); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1672); + setState(1680); parameters(); - setState(1673); + setState(1681); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1675); + setState(1683); parameters(); } break; @@ -11300,22 +11356,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_result); + enterRule(_localctx, 320, RULE_result); try { - setState(1680); + setState(1688); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1678); + setState(1686); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1679); + setState(1687); type_(); } break; @@ -11358,45 +11414,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_parameters); + enterRule(_localctx, 322, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1682); + setState(1690); match(L_PAREN); - setState(1694); + setState(1702); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (ELLIPSIS - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 78)) & ~0x3f) == 0 && ((1L << (_la - 78)) & ((1L << (FUNC - 78)) | (1L << (INTERFACE - 78)) | (1L << (MAP - 78)) | (1L << (STRUCT - 78)) | (1L << (CHAN - 78)) | (1L << (IDENTIFIER - 78)) | (1L << (L_PAREN - 78)) | (1L << (L_BRACKET - 78)) | (1L << (ELLIPSIS - 78)) | (1L << (STAR - 78)) | (1L << (RECEIVE - 78)))) != 0)) { { - setState(1683); + setState(1691); parameterDecl(); - setState(1688); + setState(1696); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,164,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1684); + setState(1692); match(COMMA); - setState(1685); + setState(1693); parameterDecl(); } } } - setState(1690); + setState(1698); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,164,_ctx); } - setState(1692); + setState(1700); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1691); + setState(1699); match(COMMA); } } @@ -11404,7 +11460,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1696); + setState(1704); match(R_PAREN); } } @@ -11442,28 +11498,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_conversion); + enterRule(_localctx, 324, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1698); + setState(1706); nonNamedType(); - setState(1699); + setState(1707); match(L_PAREN); - setState(1700); + setState(1708); expression(0); - setState(1702); + setState(1710); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1701); + setState(1709); match(COMMA); } } - setState(1704); + setState(1712); match(R_PAREN); } } @@ -11500,9 +11556,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_nonNamedType); + enterRule(_localctx, 326, RULE_nonNamedType); try { - setState(1711); + setState(1719); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11516,18 +11572,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1706); + setState(1714); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1707); + setState(1715); match(L_PAREN); - setState(1708); + setState(1716); nonNamedType(); - setState(1709); + setState(1717); match(R_PAREN); } break; @@ -11571,33 +11627,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_operand); + enterRule(_localctx, 328, RULE_operand); try { - setState(1719); + setState(1727); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1713); + setState(1721); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1714); + setState(1722); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1715); + setState(1723); match(L_PAREN); - setState(1716); + setState(1724); expression(0); - setState(1717); + setState(1725); match(R_PAREN); } break; @@ -11637,9 +11693,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_literal); + enterRule(_localctx, 330, RULE_literal); try { - setState(1724); + setState(1732); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11656,7 +11712,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1721); + setState(1729); basicLit(); } break; @@ -11674,7 +11730,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1722); + setState(1730); compositeLit(); } break; @@ -11687,7 +11743,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1723); + setState(1731); functionLit(); } break; @@ -11726,14 +11782,14 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_integer); + enterRule(_localctx, 332, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1726); + setState(1734); _la = _input.LA(1); - if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & ((1L << (DECIMAL_LIT - 138)) | (1L << (BINARY_LIT - 138)) | (1L << (OCTAL_LIT - 138)) | (1L << (HEX_LIT - 138)) | (1L << (IMAGINARY_LIT - 138)) | (1L << (RUNE_LIT - 138)))) != 0)) ) { + if ( !(((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & ((1L << (DECIMAL_LIT - 139)) | (1L << (BINARY_LIT - 139)) | (1L << (OCTAL_LIT - 139)) | (1L << (HEX_LIT - 139)) | (1L << (IMAGINARY_LIT - 139)) | (1L << (RUNE_LIT - 139)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -11769,11 +11825,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_operandName); + enterRule(_localctx, 334, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1728); + setState(1736); match(IDENTIFIER); } } @@ -11807,15 +11863,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_qualifiedIdent); + enterRule(_localctx, 336, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1730); + setState(1738); match(IDENTIFIER); - setState(1731); + setState(1739); match(DOT); - setState(1732); + setState(1740); match(IDENTIFIER); } } @@ -11850,13 +11906,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_compositeLit); + enterRule(_localctx, 338, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1734); + setState(1742); literalType(); - setState(1735); + setState(1743); literalValue(); } } @@ -11891,26 +11947,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_literalValue); + enterRule(_localctx, 340, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1737); + setState(1745); match(L_CURLY); - setState(1742); + setState(1750); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_CURLY - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_CURLY - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1738); + setState(1746); elementList(); - setState(1740); + setState(1748); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1739); + setState(1747); match(COMMA); } } @@ -11918,7 +11974,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1744); + setState(1752); match(R_CURLY); } } @@ -11957,28 +12013,28 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_elementList); + enterRule(_localctx, 342, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1746); + setState(1754); keyedElement(); - setState(1751); + setState(1759); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,173,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1747); + setState(1755); match(COMMA); - setState(1748); + setState(1756); keyedElement(); } } } - setState(1753); + setState(1761); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,173,_ctx); } @@ -12016,23 +12072,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_keyedElement); + enterRule(_localctx, 344, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1757); + setState(1765); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1754); + setState(1762); key(); - setState(1755); + setState(1763); match(COLON); } break; } - setState(1759); + setState(1767); element(); } } @@ -12067,9 +12123,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_key); + enterRule(_localctx, 346, RULE_key); try { - setState(1763); + setState(1771); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12106,6 +12162,7 @@ public final KeyContext key() throws RecognitionException { case PRED: case TYPE_OF: case IS_COMPARABLE: + case LOW: case WRITEPERM: case NOPERM: case TRUSTED: @@ -12137,14 +12194,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1761); + setState(1769); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1762); + setState(1770); literalValue(); } break; @@ -12183,9 +12240,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_element); + enterRule(_localctx, 348, RULE_element); try { - setState(1767); + setState(1775); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12222,6 +12279,7 @@ public final ElementContext element() throws RecognitionException { case PRED: case TYPE_OF: case IS_COMPARABLE: + case LOW: case WRITEPERM: case NOPERM: case TRUSTED: @@ -12253,14 +12311,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1765); + setState(1773); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1766); + setState(1774); literalValue(); } break; @@ -12308,32 +12366,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_structType); + enterRule(_localctx, 350, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1769); + setState(1777); match(STRUCT); - setState(1770); + setState(1778); match(L_CURLY); - setState(1776); + setState(1784); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1771); + setState(1779); fieldDecl(); - setState(1772); + setState(1780); eos(); } } - setState(1778); + setState(1786); _errHandler.sync(this); _la = _input.LA(1); } - setState(1779); + setState(1787); match(R_CURLY); } } @@ -12375,34 +12433,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_fieldDecl); + enterRule(_localctx, 352, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1785); + setState(1793); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: { - setState(1781); + setState(1789); identifierList(); - setState(1782); + setState(1790); type_(); } break; case 2: { - setState(1784); + setState(1792); embeddedField(); } break; } - setState(1788); + setState(1796); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { case 1: { - setState(1787); + setState(1795); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12436,12 +12494,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 352, RULE_string_); + enterRule(_localctx, 354, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1790); + setState(1798); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12482,22 +12540,22 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 354, RULE_embeddedField); + enterRule(_localctx, 356, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1793); + setState(1801); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1792); + setState(1800); match(STAR); } } - setState(1795); + setState(1803); typeName(); } } @@ -12531,15 +12589,15 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 356, RULE_index); + enterRule(_localctx, 358, RULE_index); try { enterOuterAlt(_localctx, 1); { - setState(1797); + setState(1805); match(L_BRACKET); - setState(1798); + setState(1806); expression(0); - setState(1799); + setState(1807); match(R_BRACKET); } } @@ -12574,17 +12632,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_typeAssertion); + enterRule(_localctx, 360, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1801); + setState(1809); match(DOT); - setState(1802); + setState(1810); match(L_PAREN); - setState(1803); + setState(1811); type_(); - setState(1804); + setState(1812); match(R_PAREN); } } @@ -12626,39 +12684,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_arguments); + enterRule(_localctx, 362, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1806); + setState(1814); match(L_PAREN); - setState(1821); + setState(1829); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << LOW))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (WRITEPERM - 66)) | (1L << (NOPERM - 66)) | (1L << (TRUSTED - 66)) | (1L << (FUNC - 66)) | (1L << (INTERFACE - 66)) | (1L << (MAP - 66)) | (1L << (STRUCT - 66)) | (1L << (CHAN - 66)) | (1L << (RANGE - 66)) | (1L << (TYPE - 66)) | (1L << (NIL_LIT - 66)) | (1L << (IDENTIFIER - 66)) | (1L << (L_PAREN - 66)) | (1L << (L_BRACKET - 66)))) != 0) || ((((_la - 132)) & ~0x3f) == 0 && ((1L << (_la - 132)) & ((1L << (EXCLAMATION - 132)) | (1L << (PLUS - 132)) | (1L << (MINUS - 132)) | (1L << (CARET - 132)) | (1L << (STAR - 132)) | (1L << (AMPERSAND - 132)) | (1L << (RECEIVE - 132)) | (1L << (DECIMAL_LIT - 132)) | (1L << (BINARY_LIT - 132)) | (1L << (OCTAL_LIT - 132)) | (1L << (HEX_LIT - 132)) | (1L << (IMAGINARY_LIT - 132)) | (1L << (RUNE_LIT - 132)) | (1L << (RAW_STRING_LIT - 132)) | (1L << (INTERPRETED_STRING_LIT - 132)))) != 0)) { { - setState(1813); + setState(1821); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { case 1: { - setState(1807); + setState(1815); expressionList(); } break; case 2: { - setState(1808); + setState(1816); nonNamedType(); - setState(1811); + setState(1819); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { case 1: { - setState(1809); + setState(1817); match(COMMA); - setState(1810); + setState(1818); expressionList(); } break; @@ -12666,22 +12724,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1816); + setState(1824); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1815); + setState(1823); match(ELLIPSIS); } } - setState(1819); + setState(1827); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1818); + setState(1826); match(COMMA); } } @@ -12689,7 +12747,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1823); + setState(1831); match(R_PAREN); } } @@ -12723,15 +12781,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_methodExpr); + enterRule(_localctx, 364, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1825); + setState(1833); nonNamedType(); - setState(1826); + setState(1834); match(DOT); - setState(1827); + setState(1835); match(IDENTIFIER); } } @@ -12763,11 +12821,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_receiverType); + enterRule(_localctx, 366, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1829); + setState(1837); type_(); } } @@ -12799,36 +12857,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_eos); + enterRule(_localctx, 368, RULE_eos); try { - setState(1835); + setState(1843); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1831); + setState(1839); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1832); + setState(1840); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1833); + setState(1841); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1834); + setState(1842); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -12847,11 +12905,11 @@ public final EosContext eos() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 81: + case 82: return expression_sempred((ExpressionContext)_localctx, predIndex); - case 89: + case 90: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 183: + case 184: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -12911,7 +12969,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a2\u0730\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a3\u0738\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -12937,716 +12995,720 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+ "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+ "\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6\t\u00b6"+ - "\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\3\2\3\2\3\2\3\3\3\3\3"+ - "\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u017f\n\5\f\5\16\5\u0182\13\5\3\6\3\6\5"+ - "\6\u0186\n\6\3\7\3\7\3\7\7\7\u018b\n\7\f\7\16\7\u018e\13\7\3\7\3\7\3\7"+ - "\3\7\3\7\7\7\u0195\n\7\f\7\16\7\u0198\13\7\3\7\3\7\3\7\5\7\u019d\n\7\3"+ - "\7\3\7\7\7\u01a1\n\7\f\7\16\7\u01a4\13\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3"+ - "\t\3\n\3\n\3\n\7\n\u01b1\n\n\f\n\16\n\u01b4\13\n\3\n\5\n\u01b7\n\n\3\n"+ - "\3\n\3\13\3\13\3\13\7\13\u01be\n\13\f\13\16\13\u01c1\13\13\3\13\3\13\3"+ - "\13\3\13\3\13\3\13\3\13\7\13\u01ca\n\13\f\13\16\13\u01cd\13\13\3\13\5"+ - "\13\u01d0\n\13\3\f\3\f\3\f\3\f\5\f\u01d6\n\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+ - "\r\5\r\u01df\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\5\20\u01e9\n"+ - "\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+ - "\21\3\21\5\21\u01fa\n\21\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24"+ - "\3\24\7\24\u0206\n\24\f\24\16\24\u0209\13\24\3\24\5\24\u020c\n\24\3\25"+ - "\3\25\3\25\7\25\u0211\n\25\f\25\16\25\u0214\13\25\3\25\3\25\3\26\7\26"+ - "\u0219\n\26\f\26\16\26\u021c\13\26\3\27\3\27\3\27\3\27\7\27\u0222\n\27"+ - "\f\27\16\27\u0225\13\27\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3"+ - "\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3"+ - "\34\3\35\3\35\3\35\3\35\3\35\5\35\u0244\n\35\3\35\3\35\3\35\3\35\3\36"+ - "\3\36\5\36\u024c\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\""+ - "\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u0264\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%"+ - "\3%\3%\3%\3%\3%\7%\u0275\n%\f%\16%\u0278\13%\3%\3%\3&\3&\3&\3&\3\'\3\'"+ - "\3\'\3\'\7\'\u0284\n\'\f\'\16\'\u0287\13\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3"+ - ")\3)\5)\u0293\n)\3*\3*\3*\3*\3*\7*\u029a\n*\f*\16*\u029d\13*\3*\3*\3+"+ - "\3+\3+\3+\3+\3+\3+\3+\3+\5+\u02aa\n+\3,\3,\3,\3,\3,\7,\u02b1\n,\f,\16"+ - ",\u02b4\13,\3,\3,\3-\3-\3-\3-\3-\7-\u02bd\n-\f-\16-\u02c0\13-\3-\3-\3"+ - ".\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02d4\n/\3\60\3\60\3"+ - "\60\3\60\3\60\5\60\u02db\n\60\3\60\7\60\u02de\n\60\f\60\16\60\u02e1\13"+ - "\60\3\60\3\60\5\60\u02e5\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+ - "\5\61\u02ef\n\61\3\62\5\62\u02f2\n\62\3\62\3\62\5\62\u02f6\n\62\3\63\3"+ - "\63\5\63\u02fa\n\63\3\64\3\64\3\64\3\64\7\64\u0300\n\64\f\64\16\64\u0303"+ - "\13\64\3\64\3\64\3\65\3\65\3\65\5\65\u030a\n\65\3\66\3\66\3\66\5\66\u030f"+ - "\n\66\3\67\3\67\3\67\3\67\3\67\3\67\5\67\u0317\n\67\5\67\u0319\n\67\3"+ - "\67\3\67\3\67\5\67\u031e\n\67\38\38\38\78\u0323\n8\f8\168\u0326\138\3"+ - "9\39\39\39\39\59\u032d\n9\39\59\u0330\n9\39\39\3:\3:\5:\u0336\n:\3:\3"+ - ":\3:\5:\u033b\n:\5:\u033d\n:\3:\5:\u0340\n:\3;\3;\3;\7;\u0345\n;\f;\16"+ - ";\u0348\13;\3<\3<\5<\u034c\n<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3"+ - ">\3>\7>\u035d\n>\f>\16>\u0360\13>\3>\3>\3>\7>\u0365\n>\f>\16>\u0368\13"+ - ">\3>\5>\u036b\n>\3?\5?\u036e\n?\3?\3?\3?\3?\5?\u0374\n?\3@\3@\5@\u0378"+ - "\n@\3@\5@\u037b\n@\3@\3@\3@\3A\3A\3A\3A\3A\5A\u0385\nA\3B\3B\3B\3B\3B"+ - "\5B\u038c\nB\3C\3C\3C\3C\3C\5C\u0393\nC\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E"+ - "\5E\u039f\nE\3F\3F\3F\3F\5F\u03a5\nF\3G\3G\3G\3G\3G\5G\u03ac\nG\3H\3H"+ - "\3H\5H\u03b1\nH\3I\3I\3I\3I\5I\u03b7\nI\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K"+ - "\5K\u03c3\nK\3L\3L\3L\3L\5L\u03c9\nL\3L\3L\5L\u03cd\nL\3M\3M\3M\3M\3N"+ - "\3N\5N\u03d5\nN\3N\3N\5N\u03d9\nN\3N\3N\3O\3O\5O\u03df\nO\3P\5P\u03e2"+ - "\nP\3P\3P\3Q\3Q\5Q\u03e8\nQ\3Q\3Q\3R\5R\u03ed\nR\3R\3R\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\5S\u0406\nS\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\7S\u0429\nS\fS\16S\u042c\13S\3T\3T\3T\3T\3T\3T\3"+ - "T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u0442\nT\3U\3U\3U\3V\3V\3"+ - "V\5V\u044a\nV\3W\3W\3W\3X\3X\3X\3X\7X\u0453\nX\fX\16X\u0456\13X\3X\3X"+ - "\3X\3X\5X\u045c\nX\3Y\3Y\3Y\3Y\3Y\5Y\u0463\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z"+ - "\5Z\u046d\nZ\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\5[\u047b\n[\3[\3[\3["+ - "\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\7[\u0491\n[\f[\16"+ - "[\u0494\13[\3\\\3\\\3\\\3]\3]\5]\u049b\n]\3]\3]\5]\u049f\n]\3^\3^\5^\u04a3"+ - "\n^\3^\5^\u04a6\n^\3^\3^\3_\3_\3_\3_\3_\5_\u04af\n_\3_\3_\7_\u04b3\n_"+ - "\f_\16_\u04b6\13_\3_\3_\3`\3`\3`\3`\3a\5a\u04bf\na\3a\3a\3a\3a\3a\3a\5"+ - "a\u04c7\na\3a\3a\3a\3a\5a\u04cd\na\3b\3b\3b\3b\3b\3b\3b\5b\u04d6\nb\3"+ - "c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u04e1\nc\3d\3d\3d\3e\3e\3e\3e\7e\u04ea\n"+ - "e\fe\16e\u04ed\13e\3e\5e\u04f0\ne\5e\u04f2\ne\3e\3e\3f\3f\3f\3f\3f\3f"+ - "\3f\5f\u04fd\nf\3g\3g\3g\3g\3g\3h\3h\5h\u0506\nh\3h\3h\5h\u050a\nh\3h"+ - "\5h\u050d\nh\3h\3h\3h\3h\3h\5h\u0514\nh\3h\3h\3i\3i\3j\3j\3k\3k\3l\5l"+ - "\u051f\nl\3l\3l\3m\3m\3m\3m\3m\3m\5m\u0529\nm\3m\3m\3m\3m\5m\u052f\nm"+ - "\5m\u0531\nm\3n\3n\3n\3o\3o\3p\3p\3p\5p\u053b\np\3q\3q\3q\3q\3q\3q\7q"+ - "\u0543\nq\fq\16q\u0546\13q\3q\5q\u0549\nq\3r\3r\5r\u054d\nr\3r\3r\5r\u0551"+ - "\nr\3s\3s\3s\7s\u0556\ns\fs\16s\u0559\13s\3t\3t\3t\7t\u055e\nt\ft\16t"+ - "\u0561\13t\3u\3u\3u\3u\3u\3u\7u\u0569\nu\fu\16u\u056c\13u\3u\5u\u056f"+ - "\nu\3v\3v\5v\u0573\nv\3v\3v\3w\3w\3w\3w\3w\3w\7w\u057d\nw\fw\16w\u0580"+ - "\13w\3w\5w\u0583\nw\3x\3x\5x\u0587\nx\3x\3x\3y\5y\u058c\ny\3y\3y\3y\6"+ - "y\u0591\ny\ry\16y\u0592\3z\3z\3z\3z\3z\5z\u059a\nz\3{\3{\3|\3|\3|\3|\3"+ - "}\3}\3}\3~\3~\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u05ae"+ - "\n\u0080\3\u0081\3\u0081\5\u0081\u05b2\n\u0081\3\u0082\3\u0082\5\u0082"+ - "\u05b6\n\u0082\3\u0083\3\u0083\5\u0083\u05ba\n\u0083\3\u0084\3\u0084\3"+ - "\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086"+ - "\3\u0086\3\u0086\3\u0086\5\u0086\u05ca\n\u0086\3\u0086\3\u0086\3\u0086"+ - "\3\u0086\5\u0086\u05d0\n\u0086\5\u0086\u05d2\n\u0086\3\u0087\3\u0087\5"+ - "\u0087\u05d6\n\u0087\3\u0088\3\u0088\5\u0088\u05da\n\u0088\3\u0088\5\u0088"+ - "\u05dd\n\u0088\3\u0088\3\u0088\5\u0088\u05e1\n\u0088\5\u0088\u05e3\n\u0088"+ - "\3\u0088\3\u0088\7\u0088\u05e7\n\u0088\f\u0088\16\u0088\u05ea\13\u0088"+ - "\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u05f1\n\u0089\3\u008a"+ - "\3\u008a\3\u008a\5\u008a\u05f6\n\u008a\3\u008b\3\u008b\3\u008b\3\u008b"+ - "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0601\n\u008b\3\u008b"+ - "\3\u008b\7\u008b\u0605\n\u008b\f\u008b\16\u008b\u0608\13\u008b\3\u008b"+ - "\3\u008b\3\u008c\3\u008c\5\u008c\u060e\n\u008c\3\u008c\3\u008c\3\u008c"+ - "\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u0619\n\u008d"+ - "\3\u008e\3\u008e\3\u008e\5\u008e\u061e\n\u008e\3\u008f\3\u008f\5\u008f"+ - "\u0622\n\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u0627\n\u008f\7\u008f\u0629"+ - "\n\u008f\f\u008f\16\u008f\u062c\13\u008f\3\u0090\3\u0090\3\u0090\7\u0090"+ - "\u0631\n\u0090\f\u0090\16\u0090\u0634\13\u0090\3\u0090\3\u0090\3\u0091"+ - "\3\u0091\3\u0091\5\u0091\u063b\n\u0091\3\u0092\3\u0092\3\u0092\5\u0092"+ - "\u0640\n\u0092\3\u0092\5\u0092\u0643\n\u0092\3\u0093\3\u0093\3\u0093\3"+ - "\u0093\3\u0093\3\u0093\5\u0093\u064b\n\u0093\3\u0093\3\u0093\3\u0094\3"+ - "\u0094\3\u0094\3\u0094\5\u0094\u0653\n\u0094\3\u0094\3\u0094\3\u0095\5"+ - "\u0095\u0658\n\u0095\3\u0095\3\u0095\5\u0095\u065c\n\u0095\3\u0095\3\u0095"+ - "\5\u0095\u0660\n\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\5\u0097"+ - "\u0667\n\u0097\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099"+ - "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\5\u009e\u0684\n\u009e\3\u009e\3\u009e\3\u009f\3\u009f"+ - "\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u068f\n\u00a0\3\u00a1"+ - "\3\u00a1\5\u00a1\u0693\n\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2\7\u00a2"+ - "\u0699\n\u00a2\f\u00a2\16\u00a2\u069c\13\u00a2\3\u00a2\5\u00a2\u069f\n"+ - "\u00a2\5\u00a2\u06a1\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3"+ - "\u00a3\5\u00a3\u06a9\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3"+ - "\u00a4\3\u00a4\5\u00a4\u06b2\n\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3"+ - "\u00a5\3\u00a5\5\u00a5\u06ba\n\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u06bf"+ - "\n\u00a6\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+ - "\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06cf\n\u00ab"+ - "\5\u00ab\u06d1\n\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\7\u00ac"+ - "\u06d8\n\u00ac\f\u00ac\16\u00ac\u06db\13\u00ac\3\u00ad\3\u00ad\3\u00ad"+ - "\5\u00ad\u06e0\n\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\5\u00ae\u06e6\n"+ - "\u00ae\3\u00af\3\u00af\5\u00af\u06ea\n\u00af\3\u00b0\3\u00b0\3\u00b0\3"+ - "\u00b0\3\u00b0\7\u00b0\u06f1\n\u00b0\f\u00b0\16\u00b0\u06f4\13\u00b0\3"+ - "\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1\3\u00b1\5\u00b1\u06fc\n\u00b1\3"+ - "\u00b1\5\u00b1\u06ff\n\u00b1\3\u00b2\3\u00b2\3\u00b3\5\u00b3\u0704\n\u00b3"+ - "\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b5\3\u00b5\3\u00b5"+ - "\3\u00b5\3\u00b5\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u0716"+ - "\n\u00b6\5\u00b6\u0718\n\u00b6\3\u00b6\5\u00b6\u071b\n\u00b6\3\u00b6\5"+ - "\u00b6\u071e\n\u00b6\5\u00b6\u0720\n\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7"+ - "\3\u00b7\3\u00b7\3\u00b8\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\5\u00b9"+ - "\u072e\n\u00b9\3\u00b9\3\u02df\4\u00a4\u00b4\u00ba\2\4\6\b\n\f\16\20\22"+ - "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ - "rtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+ - "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+ - "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4"+ - "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc"+ - "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4"+ - "\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c"+ - "\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124"+ - "\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c"+ - "\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154"+ - "\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c"+ - "\u016e\u0170\2\25\4\2ggrr\3\2\31\32\3\2\7\n\3\2CD\3\2*,\4\2*,..\3\2\u0085"+ - "\u008b\3\2\26\27\4\2\u0080\u0084\u0089\u008a\6\2%%ss\177\177\u0086\u0088"+ - "\3\2!#\3\2\36 \4\2JKy~\6\2//\62\62\65\65__\4\2\177\u0084\u0086\u008a\3"+ - "\2st\4\2pp\u00a1\u00a1\4\2\u008c\u008f\u0091\u0092\3\2\u0098\u0099\2\u0794"+ - "\2\u0172\3\2\2\2\4\u0175\3\2\2\2\6\u0178\3\2\2\2\b\u017b\3\2\2\2\n\u0183"+ - "\3\2\2\2\f\u018c\3\2\2\2\16\u01a7\3\2\2\2\20\u01aa\3\2\2\2\22\u01b2\3"+ - "\2\2\2\24\u01bf\3\2\2\2\26\u01d5\3\2\2\2\30\u01de\3\2\2\2\32\u01e0\3\2"+ - "\2\2\34\u01e2\3\2\2\2\36\u01e5\3\2\2\2 \u01f9\3\2\2\2\"\u01fb\3\2\2\2"+ - "$\u01fd\3\2\2\2&\u0202\3\2\2\2(\u020d\3\2\2\2*\u021a\3\2\2\2,\u021d\3"+ - "\2\2\2.\u0228\3\2\2\2\60\u022a\3\2\2\2\62\u022f\3\2\2\2\64\u0234\3\2\2"+ - "\2\66\u0239\3\2\2\28\u023e\3\2\2\2:\u024b\3\2\2\2<\u024d\3\2\2\2>\u024f"+ - "\3\2\2\2@\u0254\3\2\2\2B\u0259\3\2\2\2D\u025e\3\2\2\2F\u0267\3\2\2\2H"+ - "\u026e\3\2\2\2J\u027b\3\2\2\2L\u027f\3\2\2\2N\u028a\3\2\2\2P\u0292\3\2"+ - "\2\2R\u0294\3\2\2\2T\u02a9\3\2\2\2V\u02ab\3\2\2\2X\u02b7\3\2\2\2Z\u02c3"+ - "\3\2\2\2\\\u02d3\3\2\2\2^\u02df\3\2\2\2`\u02ee\3\2\2\2b\u02f1\3\2\2\2"+ - "d\u02f9\3\2\2\2f\u02fb\3\2\2\2h\u0306\3\2\2\2j\u030e\3\2\2\2l\u031d\3"+ - "\2\2\2n\u031f\3\2\2\2p\u0327\3\2\2\2r\u0335\3\2\2\2t\u0341\3\2\2\2v\u034b"+ - "\3\2\2\2x\u034f\3\2\2\2z\u0355\3\2\2\2|\u036d\3\2\2\2~\u0375\3\2\2\2\u0080"+ - "\u0384\3\2\2\2\u0082\u0386\3\2\2\2\u0084\u038d\3\2\2\2\u0086\u0396\3\2"+ - "\2\2\u0088\u039b\3\2\2\2\u008a\u03a0\3\2\2\2\u008c\u03a6\3\2\2\2\u008e"+ - "\u03ad\3\2\2\2\u0090\u03b2\3\2\2\2\u0092\u03b8\3\2\2\2\u0094\u03bd\3\2"+ - "\2\2\u0096\u03c4\3\2\2\2\u0098\u03ce\3\2\2\2\u009a\u03d2\3\2\2\2\u009c"+ - "\u03de\3\2\2\2\u009e\u03e1\3\2\2\2\u00a0\u03e5\3\2\2\2\u00a2\u03ec\3\2"+ - "\2\2\u00a4\u0405\3\2\2\2\u00a6\u0441\3\2\2\2\u00a8\u0443\3\2\2\2\u00aa"+ - "\u0446\3\2\2\2\u00ac\u044b\3\2\2\2\u00ae\u0454\3\2\2\2\u00b0\u0462\3\2"+ - "\2\2\u00b2\u046c\3\2\2\2\u00b4\u047a\3\2\2\2\u00b6\u0495\3\2\2\2\u00b8"+ - "\u0498\3\2\2\2\u00ba\u04a0\3\2\2\2\u00bc\u04a9\3\2\2\2\u00be\u04b9\3\2"+ - "\2\2\u00c0\u04cc\3\2\2\2\u00c2\u04d5\3\2\2\2\u00c4\u04e0\3\2\2\2\u00c6"+ - "\u04e2\3\2\2\2\u00c8\u04e5\3\2\2\2\u00ca\u04fc\3\2\2\2\u00cc\u04fe\3\2"+ - "\2\2\u00ce\u0503\3\2\2\2\u00d0\u0517\3\2\2\2\u00d2\u0519\3\2\2\2\u00d4"+ - "\u051b\3\2\2\2\u00d6\u051e\3\2\2\2\u00d8\u0528\3\2\2\2\u00da\u0532\3\2"+ - "\2\2\u00dc\u0535\3\2\2\2\u00de\u053a\3\2\2\2\u00e0\u053c\3\2\2\2\u00e2"+ - "\u054a\3\2\2\2\u00e4\u0552\3\2\2\2\u00e6\u055a\3\2\2\2\u00e8\u0562\3\2"+ - "\2\2\u00ea\u0570\3\2\2\2\u00ec\u0576\3\2\2\2\u00ee\u0584\3\2\2\2\u00f0"+ - "\u0590\3\2\2\2\u00f2\u0599\3\2\2\2\u00f4\u059b\3\2\2\2\u00f6\u059d\3\2"+ - "\2\2\u00f8\u05a1\3\2\2\2\u00fa\u05a4\3\2\2\2\u00fc\u05a8\3\2\2\2\u00fe"+ - "\u05aa\3\2\2\2\u0100\u05af\3\2\2\2\u0102\u05b3\3\2\2\2\u0104\u05b7\3\2"+ - "\2\2\u0106\u05bb\3\2\2\2\u0108\u05be\3\2\2\2\u010a\u05c0\3\2\2\2\u010c"+ - "\u05d5\3\2\2\2\u010e\u05d7\3\2\2\2\u0110\u05ed\3\2\2\2\u0112\u05f5\3\2"+ - "\2\2\u0114\u05f7\3\2\2\2\u0116\u060d\3\2\2\2\u0118\u0615\3\2\2\2\u011a"+ - "\u061d\3\2\2\2\u011c\u0621\3\2\2\2\u011e\u062d\3\2\2\2\u0120\u0637\3\2"+ - "\2\2\u0122\u0642\3\2\2\2\u0124\u064a\3\2\2\2\u0126\u064e\3\2\2\2\u0128"+ - "\u0657\3\2\2\2\u012a\u0661\3\2\2\2\u012c\u0666\3\2\2\2\u012e\u0668\3\2"+ - "\2\2\u0130\u066d\3\2\2\2\u0132\u066f\3\2\2\2\u0134\u0671\3\2\2\2\u0136"+ - "\u0674\3\2\2\2\u0138\u0678\3\2\2\2\u013a\u0683\3\2\2\2\u013c\u0687\3\2"+ - "\2\2\u013e\u068e\3\2\2\2\u0140\u0692\3\2\2\2\u0142\u0694\3\2\2\2\u0144"+ - "\u06a4\3\2\2\2\u0146\u06b1\3\2\2\2\u0148\u06b9\3\2\2\2\u014a\u06be\3\2"+ - "\2\2\u014c\u06c0\3\2\2\2\u014e\u06c2\3\2\2\2\u0150\u06c4\3\2\2\2\u0152"+ - "\u06c8\3\2\2\2\u0154\u06cb\3\2\2\2\u0156\u06d4\3\2\2\2\u0158\u06df\3\2"+ - "\2\2\u015a\u06e5\3\2\2\2\u015c\u06e9\3\2\2\2\u015e\u06eb\3\2\2\2\u0160"+ - "\u06fb\3\2\2\2\u0162\u0700\3\2\2\2\u0164\u0703\3\2\2\2\u0166\u0707\3\2"+ - "\2\2\u0168\u070b\3\2\2\2\u016a\u0710\3\2\2\2\u016c\u0723\3\2\2\2\u016e"+ - "\u0727\3\2\2\2\u0170\u072d\3\2\2\2\u0172\u0173\5\u00a4S\2\u0173\u0174"+ - "\7\2\2\3\u0174\3\3\2\2\2\u0175\u0176\5\u00a6T\2\u0176\u0177\7\2\2\3\u0177"+ - "\5\3\2\2\2\u0178\u0179\5\u00c2b\2\u0179\u017a\7\2\2\3\u017a\7\3\2\2\2"+ - "\u017b\u0180\5\n\6\2\u017c\u017d\7o\2\2\u017d\u017f\5\n\6\2\u017e\u017c"+ - "\3\2\2\2\u017f\u0182\3\2\2\2\u0180\u017e\3\2\2\2\u0180\u0181\3\2\2\2\u0181"+ - "\t\3\2\2\2\u0182\u0180\3\2\2\2\u0183\u0185\7g\2\2\u0184\u0186\7>\2\2\u0185"+ - "\u0184\3\2\2\2\u0185\u0186\3\2\2\2\u0186\13\3\2\2\2\u0187\u0188\5\16\b"+ - "\2\u0188\u0189\5\u0170\u00b9\2\u0189\u018b\3\2\2\2\u018a\u0187\3\2\2\2"+ - "\u018b\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018f"+ - "\3\2\2\2\u018e\u018c\3\2\2\2\u018f\u0190\5\u00dan\2\u0190\u0196\5\u0170"+ - "\u00b9\2\u0191\u0192\5\24\13\2\u0192\u0193\5\u0170\u00b9\2\u0193\u0195"+ - "\3\2\2\2\u0194\u0191\3\2\2\2\u0195\u0198\3\2\2\2\u0196\u0194\3\2\2\2\u0196"+ - "\u0197\3\2\2\2\u0197\u01a2\3\2\2\2\u0198\u0196\3\2\2\2\u0199\u019d\5\u0088"+ - "E\2\u019a\u019d\5\u00dep\2\u019b\u019d\5\26\f\2\u019c\u0199\3\2\2\2\u019c"+ - "\u019a\3\2\2\2\u019c\u019b\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u019f\5\u0170"+ - "\u00b9\2\u019f\u01a1\3\2\2\2\u01a0\u019c\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2"+ - "\u01a0\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3\2"+ - "\2\2\u01a5\u01a6\7\2\2\3\u01a6\r\3\2\2\2\u01a7\u01a8\7G\2\2\u01a8\u01a9"+ - "\5\u00a4S\2\u01a9\17\3\2\2\2\u01aa\u01ab\7H\2\2\u01ab\u01ac\5\u00a4S\2"+ - "\u01ac\21\3\2\2\2\u01ad\u01ae\5\20\t\2\u01ae\u01af\5\u0170\u00b9\2\u01af"+ - "\u01b1\3\2\2\2\u01b0\u01ad\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2"+ - "\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5"+ - "\u01b7\t\2\2\2\u01b6\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b8\3\2"+ - "\2\2\u01b8\u01b9\5\u00dco\2\u01b9\23\3\2\2\2\u01ba\u01bb\5\20\t\2\u01bb"+ - "\u01bc\5\u0170\u00b9\2\u01bc\u01be\3\2\2\2\u01bd\u01ba\3\2\2\2\u01be\u01c1"+ - "\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01cf\3\2\2\2\u01c1"+ - "\u01bf\3\2\2\2\u01c2\u01c3\7c\2\2\u01c3\u01d0\5\22\n\2\u01c4\u01c5\7c"+ - "\2\2\u01c5\u01cb\7h\2\2\u01c6\u01c7\5\22\n\2\u01c7\u01c8\5\u0170\u00b9"+ - "\2\u01c8\u01ca\3\2\2\2\u01c9\u01c6\3\2\2\2\u01ca\u01cd\3\2\2\2\u01cb\u01c9"+ - "\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01ce\3\2\2\2\u01cd\u01cb\3\2\2\2\u01ce"+ - "\u01d0\7i\2\2\u01cf\u01c2\3\2\2\2\u01cf\u01c4\3\2\2\2\u01d0\25\3\2\2\2"+ - "\u01d1\u01d6\5z>\2\u01d2\u01d6\5\u0090I\2\u01d3\u01d6\5\u0094K\2\u01d4"+ - "\u01d6\5\u008eH\2\u01d5\u01d1\3\2\2\2\u01d5\u01d2\3\2\2\2\u01d5\u01d3"+ - "\3\2\2\2\u01d5\u01d4\3\2\2\2\u01d6\27\3\2\2\2\u01d7\u01d8\7\35\2\2\u01d8"+ - "\u01df\5\u00a6T\2\u01d9\u01da\t\3\2\2\u01da\u01df\5.\30\2\u01db\u01dc"+ - "\t\4\2\2\u01dc\u01df\5\u00a4S\2\u01dd\u01df\5f\64\2\u01de\u01d7\3\2\2"+ - "\2\u01de\u01d9\3\2\2\2\u01de\u01db\3\2\2\2\u01de\u01dd\3\2\2\2\u01df\31"+ - "\3\2\2\2\u01e0\u01e1\5\34\17\2\u01e1\33\3\2\2\2\u01e2\u01e3\5^\60\2\u01e3"+ - "\u01e4\5\36\20\2\u01e4\35\3\2\2\2\u01e5\u01e6\7F\2\2\u01e6\u01e8\7h\2"+ - "\2\u01e7\u01e9\5\u00f0y\2\u01e8\u01e7\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9"+ - "\u01ea\3\2\2\2\u01ea\u01eb\7i\2\2\u01eb\37\3\2\2\2\u01ec\u01fa\5F$\2\u01ed"+ - "\u01fa\5D#\2\u01ee\u01fa\5B\"\2\u01ef\u01fa\5$\23\2\u01f0\u01fa\5@!\2"+ - "\u01f1\u01fa\58\35\2\u01f2\u01fa\5> \2\u01f3\u01fa\5\66\34\2\u01f4\u01fa"+ - "\5\62\32\2\u01f5\u01fa\5\60\31\2\u01f6\u01fa\5\64\33\2\u01f7\u01fa\5\""+ - "\22\2\u01f8\u01fa\5H%\2\u01f9\u01ec\3\2\2\2\u01f9\u01ed\3\2\2\2\u01f9"+ - "\u01ee\3\2\2\2\u01f9\u01ef\3\2\2\2\u01f9\u01f0\3\2\2\2\u01f9\u01f1\3\2"+ - "\2\2\u01f9\u01f2\3\2\2\2\u01f9\u01f3\3\2\2\2\u01f9\u01f4\3\2\2\2\u01f9"+ - "\u01f5\3\2\2\2\u01f9\u01f6\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01f8\3\2"+ - "\2\2\u01fa!\3\2\2\2\u01fb\u01fc\t\5\2\2\u01fc#\3\2\2\2\u01fd\u01fe\7`"+ - "\2\2\u01fe\u01ff\7l\2\2\u01ff\u0200\5\u00c2b\2\u0200\u0201\7m\2\2\u0201"+ - "%\3\2\2\2\u0202\u0207\5(\25\2\u0203\u0204\7o\2\2\u0204\u0206\5(\25\2\u0205"+ - "\u0203\3\2\2\2\u0206\u0209\3\2\2\2\u0207\u0205\3\2\2\2\u0207\u0208\3\2"+ - "\2\2\u0208\u020b\3\2\2\2\u0209\u0207\3\2\2\2\u020a\u020c\7o\2\2\u020b"+ - "\u020a\3\2\2\2\u020b\u020c\3\2\2\2\u020c\'\3\2\2\2\u020d\u0212\7g\2\2"+ - "\u020e\u020f\7o\2\2\u020f\u0211\7g\2\2\u0210\u020e\3\2\2\2\u0211\u0214"+ - "\3\2\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\3\2\2\2\u0214"+ - "\u0212\3\2\2\2\u0215\u0216\5\u0132\u009a\2\u0216)\3\2\2\2\u0217\u0219"+ - "\5,\27\2\u0218\u0217\3\2\2\2\u0219\u021c\3\2\2\2\u021a\u0218\3\2\2\2\u021a"+ - "\u021b\3\2\2\2\u021b+\3\2\2\2\u021c\u021a\3\2\2\2\u021d\u021e\7j\2\2\u021e"+ - "\u0223\5\u00a4S\2\u021f\u0220\7o\2\2\u0220\u0222\5\u00a4S\2\u0221\u021f"+ - "\3\2\2\2\u0222\u0225\3\2\2\2\u0223\u0221\3\2\2\2\u0223\u0224\3\2\2\2\u0224"+ - "\u0226\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u0227\7k\2\2\u0227-\3\2\2\2\u0228"+ - "\u0229\5\u00b4[\2\u0229/\3\2\2\2\u022a\u022b\7\63\2\2\u022b\u022c\7h\2"+ - "\2\u022c\u022d\5\u00a4S\2\u022d\u022e\7i\2\2\u022e\61\3\2\2\2\u022f\u0230"+ - "\79\2\2\u0230\u0231\7l\2\2\u0231\u0232\5\u00c2b\2\u0232\u0233\7m\2\2\u0233"+ - "\63\3\2\2\2\u0234\u0235\7\64\2\2\u0235\u0236\7h\2\2\u0236\u0237\5\u00a4"+ - "S\2\u0237\u0238\7i\2\2\u0238\65\3\2\2\2\u0239\u023a\t\6\2\2\u023a\u023b"+ - "\7h\2\2\u023b\u023c\5\u00a4S\2\u023c\u023d\7i\2\2\u023d\67\3\2\2\2\u023e"+ - "\u0243\7\23\2\2\u023f\u0240\7l\2\2\u0240\u0241\5:\36\2\u0241\u0242\7m"+ - "\2\2\u0242\u0244\3\2\2\2\u0243\u023f\3\2\2\2\u0243\u0244\3\2\2\2\u0244"+ - "\u0245\3\2\2\2\u0245\u0246\7h\2\2\u0246\u0247\5\u00a4S\2\u0247\u0248\7"+ - "i\2\2\u02489\3\2\2\2\u0249\u024c\5<\37\2\u024a\u024c\7\25\2\2\u024b\u0249"+ - "\3\2\2\2\u024b\u024a\3\2\2\2\u024c;\3\2\2\2\u024d\u024e\7g\2\2\u024e="+ - "\3\2\2\2\u024f\u0250\7\24\2\2\u0250\u0251\7h\2\2\u0251\u0252\5\u00a4S"+ - "\2\u0252\u0253\7i\2\2\u0253?\3\2\2\2\u0254\u0255\7<\2\2\u0255\u0256\7"+ - "h\2\2\u0256\u0257\5\u00a4S\2\u0257\u0258\7i\2\2\u0258A\3\2\2\2\u0259\u025a"+ - "\7;\2\2\u025a\u025b\7h\2\2\u025b\u025c\5\u00a4S\2\u025c\u025d\7i\2\2\u025d"+ - "C\3\2\2\2\u025e\u025f\7\30\2\2\u025f\u0260\7h\2\2\u0260\u0263\5\u00a4"+ - "S\2\u0261\u0262\7o\2\2\u0262\u0264\5\u00a4S\2\u0263\u0261\3\2\2\2\u0263"+ - "\u0264\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\7i\2\2\u0266E\3\2\2\2\u0267"+ - "\u0268\t\6\2\2\u0268\u0269\7l\2\2\u0269\u026a\5\u00a4S\2\u026a\u026b\7"+ - "?\2\2\u026b\u026c\5\u00a4S\2\u026c\u026d\7m\2\2\u026dG\3\2\2\2\u026e\u026f"+ - "\78\2\2\u026f\u0270\5\u00a4S\2\u0270\u0276\7j\2\2\u0271\u0272\5J&\2\u0272"+ - "\u0273\5\u0170\u00b9\2\u0273\u0275\3\2\2\2\u0274\u0271\3\2\2\2\u0275\u0278"+ - "\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0279\3\2\2\2\u0278"+ - "\u0276\3\2\2\2\u0279\u027a\7k\2\2\u027aI\3\2\2\2\u027b\u027c\5j\66\2\u027c"+ - "\u027d\7q\2\2\u027d\u027e\5\u00a4S\2\u027eK\3\2\2\2\u027f\u0280\7l\2\2"+ - "\u0280\u0285\5N(\2\u0281\u0282\7o\2\2\u0282\u0284\5N(\2\u0283\u0281\3"+ - "\2\2\2\u0284\u0287\3\2\2\2\u0285\u0283\3\2\2\2\u0285\u0286\3\2\2\2\u0286"+ - "\u0288\3\2\2\2\u0287\u0285\3\2\2\2\u0288\u0289\7m\2\2\u0289M\3\2\2\2\u028a"+ - "\u028b\5\u00a4S\2\u028b\u028c\7n\2\2\u028c\u028d\5\u00a4S\2\u028dO\3\2"+ - "\2\2\u028e\u0293\5\\/\2\u028f\u0293\5Z.\2\u0290\u0293\5R*\2\u0291\u0293"+ - "\5V,\2\u0292\u028e\3\2\2\2\u0292\u028f\3\2\2\2\u0292\u0290\3\2\2\2\u0292"+ - "\u0291\3\2\2\2\u0293Q\3\2\2\2\u0294\u0295\7\65\2\2\u0295\u029b\7j\2\2"+ - "\u0296\u0297\5T+\2\u0297\u0298\5\u0170\u00b9\2\u0298\u029a\3\2\2\2\u0299"+ - "\u0296\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3\2"+ - "\2\2\u029c\u029e\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u029f\7k\2\2\u029f"+ - "S\3\2\2\2\u02a0\u02a1\7O\2\2\u02a1\u02a2\7g\2\2\u02a2\u02aa\5\u013e\u00a0"+ - "\2\u02a3\u02a4\7\66\2\2\u02a4\u02a5\7j\2\2\u02a5\u02a6\5\u00a4S\2\u02a6"+ - "\u02a7\5\u0170\u00b9\2\u02a7\u02a8\7k\2\2\u02a8\u02aa\3\2\2\2\u02a9\u02a0"+ - "\3\2\2\2\u02a9\u02a3\3\2\2\2\u02aaU\3\2\2\2\u02ab\u02ac\7\67\2\2\u02ac"+ - "\u02b2\7j\2\2\u02ad\u02ae\5X-\2\u02ae\u02af\5\u0170\u00b9\2\u02af\u02b1"+ - "\3\2\2\2\u02b0\u02ad\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ - "\u02b3\3\2\2\2\u02b3\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02b6\7k"+ - "\2\2\u02b6W\3\2\2\2\u02b7\u02b8\7g\2\2\u02b8\u02be\7j\2\2\u02b9\u02ba"+ - "\5\u0160\u00b1\2\u02ba\u02bb\5\u0170\u00b9\2\u02bb\u02bd\3\2\2\2\u02bc"+ - "\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bc\3\2\2\2\u02be\u02bf\3\2"+ - "\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1\u02c2\7k\2\2\u02c2"+ - "Y\3\2\2\2\u02c3\u02c4\7\35\2\2\u02c4\u02c5\7l\2\2\u02c5\u02c6\7m\2\2\u02c6"+ - "\u02c7\5\u0132\u009a\2\u02c7[\3\2\2\2\u02c8\u02c9\t\7\2\2\u02c9\u02ca"+ - "\7l\2\2\u02ca\u02cb\5\u00c2b\2\u02cb\u02cc\7m\2\2\u02cc\u02d4\3\2\2\2"+ - "\u02cd\u02ce\7-\2\2\u02ce\u02cf\7l\2\2\u02cf\u02d0\5\u00c2b\2\u02d0\u02d1"+ - "\7m\2\2\u02d1\u02d2\5\u00c2b\2\u02d2\u02d4\3\2\2\2\u02d3\u02c8\3\2\2\2"+ - "\u02d3\u02cd\3\2\2\2\u02d4]\3\2\2\2\u02d5\u02db\5`\61\2\u02d6\u02d7\7"+ - "\20\2\2\u02d7\u02db\b\60\1\2\u02d8\u02d9\7E\2\2\u02d9\u02db\b\60\1\2\u02da"+ - "\u02d5\3\2\2\2\u02da\u02d6\3\2\2\2\u02da\u02d8\3\2\2\2\u02db\u02dc\3\2"+ - "\2\2\u02dc\u02de\5\u0170\u00b9\2\u02dd\u02da\3\2\2\2\u02de\u02e1\3\2\2"+ - "\2\u02df\u02e0\3\2\2\2\u02df\u02dd\3\2\2\2\u02e0\u02e4\3\2\2\2\u02e1\u02df"+ - "\3\2\2\2\u02e2\u02e3\7\20\2\2\u02e3\u02e5\b\60\1\2\u02e4\u02e2\3\2\2\2"+ - "\u02e4\u02e5\3\2\2\2\u02e5_\3\2\2\2\u02e6\u02e7\7\13\2\2\u02e7\u02ef\5"+ - "d\63\2\u02e8\u02e9\7\f\2\2\u02e9\u02ef\5d\63\2\u02ea\u02eb\7\r\2\2\u02eb"+ - "\u02ef\5d\63\2\u02ec\u02ed\7\17\2\2\u02ed\u02ef\5b\62\2\u02ee\u02e6\3"+ - "\2\2\2\u02ee\u02e8\3\2\2\2\u02ee\u02ea\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ef"+ - "a\3\2\2\2\u02f0\u02f2\5\u00e6t\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ - "\2\u02f2\u02f5\3\2\2\2\u02f3\u02f4\7^\2\2\u02f4\u02f6\5\u00a4S\2\u02f5"+ - "\u02f3\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6c\3\2\2\2\u02f7\u02fa\3\2\2\2"+ - "\u02f8\u02fa\5\u00a4S\2\u02f9\u02f7\3\2\2\2\u02f9\u02f8\3\2\2\2\u02fa"+ - "e\3\2\2\2\u02fb\u02fc\78\2\2\u02fc\u02fd\5\u00a4S\2\u02fd\u0301\7j\2\2"+ - "\u02fe\u0300\5h\65\2\u02ff\u02fe\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff"+ - "\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u0304\3\2\2\2\u0303\u0301\3\2\2\2\u0304"+ - "\u0305\7k\2\2\u0305g\3\2\2\2\u0306\u0307\5j\66\2\u0307\u0309\7q\2\2\u0308"+ - "\u030a\5\u00f0y\2\u0309\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ai\3\2\2"+ - "\2\u030b\u030c\7R\2\2\u030c\u030f\5l\67\2\u030d\u030f\7N\2\2\u030e\u030b"+ - "\3\2\2\2\u030e\u030d\3\2\2\2\u030fk\3\2\2\2\u0310\u0311\7\'\2\2\u0311"+ - "\u031e\7g\2\2\u0312\u0313\5\u00caf\2\u0313\u0318\7j\2\2\u0314\u0316\5"+ - "n8\2\u0315\u0317\7o\2\2\u0316\u0315\3\2\2\2\u0316\u0317\3\2\2\2\u0317"+ - "\u0319\3\2\2\2\u0318\u0314\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031a\3\2"+ - "\2\2\u031a\u031b\7k\2\2\u031b\u031e\3\2\2\2\u031c\u031e\5\u00a4S\2\u031d"+ - "\u0310\3\2\2\2\u031d\u0312\3\2\2\2\u031d\u031c\3\2\2\2\u031em\3\2\2\2"+ - "\u031f\u0324\5l\67\2\u0320\u0321\7o\2\2\u0321\u0323\5l\67\2\u0322\u0320"+ - "\3\2\2\2\u0323\u0326\3\2\2\2\u0324\u0322\3\2\2\2\u0324\u0325\3\2\2\2\u0325"+ - "o\3\2\2\2\u0326\u0324\3\2\2\2\u0327\u032c\7j\2\2\u0328\u0329\7=\2\2\u0329"+ - "\u032a\5\u00e4s\2\u032a\u032b\5\u0170\u00b9\2\u032b\u032d\3\2\2\2\u032c"+ - "\u0328\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032f\3\2\2\2\u032e\u0330\5\u00f0"+ - "y\2\u032f\u032e\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0331\3\2\2\2\u0331"+ - "\u0332\7k\2\2\u0332q\3\2\2\2\u0333\u0336\5\u0150\u00a9\2\u0334\u0336\7"+ - "g\2\2\u0335\u0333\3\2\2\2\u0335\u0334\3\2\2\2\u0336\u033f\3\2\2\2\u0337"+ - "\u033c\7j\2\2\u0338\u033a\5t;\2\u0339\u033b\7o\2\2\u033a\u0339\3\2\2\2"+ - "\u033a\u033b\3\2\2\2\u033b\u033d\3\2\2\2\u033c\u0338\3\2\2\2\u033c\u033d"+ - "\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u0340\7k\2\2\u033f\u0337\3\2\2\2\u033f"+ - "\u0340\3\2\2\2\u0340s\3\2\2\2\u0341\u0346\5v<\2\u0342\u0343\7o\2\2\u0343"+ - "\u0345\5v<\2\u0344\u0342\3\2\2\2\u0345\u0348\3\2\2\2\u0346\u0344\3\2\2"+ - "\2\u0346\u0347\3\2\2\2\u0347u\3\2\2\2\u0348\u0346\3\2\2\2\u0349\u034a"+ - "\7g\2\2\u034a\u034c\7q\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c"+ - "\u034d\3\2\2\2\u034d\u034e\5\u00a4S\2\u034ew\3\2\2\2\u034f\u0350\7I\2"+ - "\2\u0350\u0351\5\u00a4S\2\u0351\u0352\7\21\2\2\u0352\u0353\5r:\2\u0353"+ - "\u0354\5\u00eex\2\u0354y\3\2\2\2\u0355\u0356\5\u00c2b\2\u0356\u0357\7"+ - "\21\2\2\u0357\u036a\5\u00c2b\2\u0358\u035e\7j\2\2\u0359\u035a\5\u0082"+ - "B\2\u035a\u035b\5\u0170\u00b9\2\u035b\u035d\3\2\2\2\u035c\u0359\3\2\2"+ - "\2\u035d\u0360\3\2\2\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0366"+ - "\3\2\2\2\u0360\u035e\3\2\2\2\u0361\u0362\5|?\2\u0362\u0363\5\u0170\u00b9"+ - "\2\u0363\u0365\3\2\2\2\u0364\u0361\3\2\2\2\u0365\u0368\3\2\2\2\u0366\u0364"+ - "\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0369\3\2\2\2\u0368\u0366\3\2\2\2\u0369"+ - "\u036b\7k\2\2\u036a\u0358\3\2\2\2\u036a\u036b\3\2\2\2\u036b{\3\2\2\2\u036c"+ - "\u036e\7\20\2\2\u036d\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036f\3"+ - "\2\2\2\u036f\u0370\5~@\2\u0370\u0371\7g\2\2\u0371\u0373\5\u013e\u00a0"+ - "\2\u0372\u0374\5\u00eex\2\u0373\u0372\3\2\2\2\u0373\u0374\3\2\2\2\u0374"+ - "}\3\2\2\2\u0375\u0377\7h\2\2\u0376\u0378\7g\2\2\u0377\u0376\3\2\2\2\u0377"+ - "\u0378\3\2\2\2\u0378\u037a\3\2\2\2\u0379\u037b\7\u0089\2\2\u037a\u0379"+ - "\3\2\2\2\u037a\u037b\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037d\5\u012c\u0097"+ - "\2\u037d\u037e\7i\2\2\u037e\177\3\2\2\2\u037f\u0385\5\u00b4[\2\u0380\u0381"+ - "\5\u00c2b\2\u0381\u0382\7r\2\2\u0382\u0383\7g\2\2\u0383\u0385\3\2\2\2"+ - "\u0384\u037f\3\2\2\2\u0384\u0380\3\2\2\2\u0385\u0081\3\2\2\2\u0386\u0387"+ - "\7:\2\2\u0387\u0388\7g\2\2\u0388\u038b\7u\2\2\u0389\u038c\5\u0080A\2\u038a"+ - "\u038c\5\u014e\u00a8\2\u038b\u0389\3\2\2\2\u038b\u038a\3\2\2\2\u038c\u0083"+ - "\3\2\2\2\u038d\u038e\7\61\2\2\u038e\u038f\7h\2\2\u038f\u0392\5\u00c2b"+ - "\2\u0390\u0391\7o\2\2\u0391\u0393\5\u00e6t\2\u0392\u0390\3\2\2\2\u0392"+ - "\u0393\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0395\7i\2\2\u0395\u0085\3\2"+ - "\2\2\u0396\u0397\7\60\2\2\u0397\u0398\7h\2\2\u0398\u0399\5\u00c2b\2\u0399"+ - "\u039a\7i\2\2\u039a\u0087\3\2\2\2\u039b\u039e\5^\60\2\u039c\u039f\5\u008a"+ - "F\2\u039d\u039f\5\u008cG\2\u039e\u039c\3\2\2\2\u039e\u039d\3\2\2\2\u039f"+ - "\u0089\3\2\2\2\u03a0\u03a1\7O\2\2\u03a1\u03a2\7g\2\2\u03a2\u03a4\5\u013e"+ - "\u00a0\2\u03a3\u03a5\5p9\2\u03a4\u03a3\3\2\2\2\u03a4\u03a5\3\2\2\2\u03a5"+ - "\u008b\3\2\2\2\u03a6\u03a7\7O\2\2\u03a7\u03a8\5\u009aN\2\u03a8\u03a9\7"+ - "g\2\2\u03a9\u03ab\5\u013e\u00a0\2\u03aa\u03ac\5p9\2\u03ab\u03aa\3\2\2"+ - "\2\u03ab\u03ac\3\2\2\2\u03ac\u008d\3\2\2\2\u03ad\u03b0\7\35\2\2\u03ae"+ - "\u03b1\5\u0088E\2\u03af\u03b1\5\u00dep\2\u03b0\u03ae\3\2\2\2\u03b0\u03af"+ - "\3\2\2\2\u03b1\u008f\3\2\2\2\u03b2\u03b3\7:\2\2\u03b3\u03b4\7g\2\2\u03b4"+ - "\u03b6\5\u0142\u00a2\2\u03b5\u03b7\5\u0092J\2\u03b6\u03b5\3\2\2\2\u03b6"+ - "\u03b7\3\2\2\2\u03b7\u0091\3\2\2\2\u03b8\u03b9\7j\2\2\u03b9\u03ba\5\u00a4"+ - "S\2\u03ba\u03bb\5\u0170\u00b9\2\u03bb\u03bc\7k\2\2\u03bc\u0093\3\2\2\2"+ - "\u03bd\u03be\7:\2\2\u03be\u03bf\5\u009aN\2\u03bf\u03c0\7g\2\2\u03c0\u03c2"+ - "\5\u0142\u00a2\2\u03c1\u03c3\5\u0092J\2\u03c2\u03c1\3\2\2\2\u03c2\u03c3"+ - "\3\2\2\2\u03c3\u0095\3\2\2\2\u03c4\u03cc\5\b\5\2\u03c5\u03c8\5\u00c2b"+ - "\2\u03c6\u03c7\7n\2\2\u03c7\u03c9\5\u00e6t\2\u03c8\u03c6\3\2\2\2\u03c8"+ - "\u03c9\3\2\2\2\u03c9\u03cd\3\2\2\2\u03ca\u03cb\7n\2\2\u03cb\u03cd\5\u00e6"+ - "t\2\u03cc\u03c5\3\2\2\2\u03cc\u03ca\3\2\2\2\u03cd\u0097\3\2\2\2\u03ce"+ - "\u03cf\5\b\5\2\u03cf\u03d0\7u\2\2\u03d0\u03d1\5\u00e6t\2\u03d1\u0099\3"+ - "\2\2\2\u03d2\u03d4\7h\2\2\u03d3\u03d5\5\n\6\2\u03d4\u03d3\3\2\2\2\u03d4"+ - "\u03d5\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d8\5\u00c2b\2\u03d7\u03d9"+ - "\7o\2\2\u03d8\u03d7\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\3\2\2\2\u03da"+ - "\u03db\7i\2\2\u03db\u009b\3\2\2\2\u03dc\u03df\5\u009eP\2\u03dd\u03df\5"+ - "\u00a0Q\2\u03de\u03dc\3\2\2\2\u03de\u03dd\3\2\2\2\u03df\u009d\3\2\2\2"+ - "\u03e0\u03e2\5\u00e4s\2\u03e1\u03e0\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2"+ - "\u03e3\3\2\2\2\u03e3\u03e4\5\u00a2R\2\u03e4\u009f\3\2\2\2\u03e5\u03e7"+ - "\7\35\2\2\u03e6\u03e8\5\u00e4s\2\u03e7\u03e6\3\2\2\2\u03e7\u03e8\3\2\2"+ - "\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\5\u00a2R\2\u03ea\u00a1\3\2\2\2\u03eb"+ - "\u03ed\7v\2\2\u03ec\u03eb\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u03ee\3\2"+ - "\2\2\u03ee\u03ef\5\u00c2b\2\u03ef\u00a3\3\2\2\2\u03f0\u03f1\bS\1\2\u03f1"+ - "\u03f2\t\b\2\2\u03f2\u0406\5\u00a4S\21\u03f3\u0406\5\u00b4[\2\u03f4\u03f5"+ - "\7\33\2\2\u03f5\u03f6\5.\30\2\u03f6\u03f7\7\36\2\2\u03f7\u03f8\5\u00a4"+ - "S\5\u03f8\u0406\3\2\2\2\u03f9\u03fa\7\34\2\2\u03fa\u03fb\5\u0098M\2\u03fb"+ - "\u03fc\7\36\2\2\u03fc\u03fd\5\u00a4S\4\u03fd\u0406\3\2\2\2\u03fe\u03ff"+ - "\t\t\2\2\u03ff\u0400\5&\24\2\u0400\u0401\7q\2\2\u0401\u0402\7q\2\2\u0402"+ - "\u0403\5*\26\2\u0403\u0404\5\u00a4S\3\u0404\u0406\3\2\2\2\u0405\u03f0"+ - "\3\2\2\2\u0405\u03f3\3\2\2\2\u0405\u03f4\3\2\2\2\u0405\u03f9\3\2\2\2\u0405"+ - "\u03fe\3\2\2\2\u0406\u042a\3\2\2\2\u0407\u0408\f\17\2\2\u0408\u0409\t"+ - "\n\2\2\u0409\u0429\5\u00a4S\20\u040a\u040b\f\16\2\2\u040b\u040c\t\13\2"+ - "\2\u040c\u0429\5\u00a4S\17\u040d\u040e\f\r\2\2\u040e\u040f\t\f\2\2\u040f"+ - "\u0429\5\u00a4S\16\u0410\u0411\f\f\2\2\u0411\u0412\t\r\2\2\u0412\u0429"+ - "\5\u00a4S\r\u0413\u0414\f\13\2\2\u0414\u0415\t\16\2\2\u0415\u0429\5\u00a4"+ - "S\f\u0416\u0417\f\t\2\2\u0417\u0418\7x\2\2\u0418\u0429\5\u00a4S\n\u0419"+ - "\u041a\f\b\2\2\u041a\u041b\7w\2\2\u041b\u0429\5\u00a4S\t\u041c\u041d\f"+ - "\7\2\2\u041d\u041e\7$\2\2\u041e\u0429\5\u00a4S\7\u041f\u0420\f\6\2\2\u0420"+ - "\u0421\7\'\2\2\u0421\u0422\5\u00a4S\2\u0422\u0423\7q\2\2\u0423\u0424\5"+ - "\u00a4S\6\u0424\u0429\3\2\2\2\u0425\u0426\f\n\2\2\u0426\u0427\7\21\2\2"+ - "\u0427\u0429\5r:\2\u0428\u0407\3\2\2\2\u0428\u040a\3\2\2\2\u0428\u040d"+ - "\3\2\2\2\u0428\u0410\3\2\2\2\u0428\u0413\3\2\2\2\u0428\u0416\3\2\2\2\u0428"+ - "\u0419\3\2\2\2\u0428\u041c\3\2\2\2\u0428\u041f\3\2\2\2\u0428\u0425\3\2"+ - "\2\2\u0429\u042c\3\2\2\2\u042a\u0428\3\2\2\2\u042a\u042b\3\2\2\2\u042b"+ - "\u00a5\3\2\2\2\u042c\u042a\3\2\2\2\u042d\u0442\5\30\r\2\u042e\u0442\5"+ - "\32\16\2\u042f\u0442\5\u00aaV\2\u0430\u0442\5\u00a8U\2\u0431\u0442\5\u00de"+ - "p\2\u0432\u0442\5\u00fe\u0080\2\u0433\u0442\5\u00f2z\2\u0434\u0442\5\u012a"+ - "\u0096\2\u0435\u0442\5\u0100\u0081\2\u0436\u0442\5\u0102\u0082\2\u0437"+ - "\u0442\5\u0104\u0083\2\u0438\u0442\5\u0106\u0084\2\u0439\u0442\5\u0108"+ - "\u0085\2\u043a\u0442\5\u00eex\2\u043b\u0442\5\u010a\u0086\2\u043c\u0442"+ - "\5\u010c\u0087\2\u043d\u0442\5\u011e\u0090\2\u043e\u0442\5\u00acW\2\u043f"+ - "\u0442\5\u00b0Y\2\u0440\u0442\5x=\2\u0441\u042d\3\2\2\2\u0441\u042e\3"+ - "\2\2\2\u0441\u042f\3\2\2\2\u0441\u0430\3\2\2\2\u0441\u0431\3\2\2\2\u0441"+ - "\u0432\3\2\2\2\u0441\u0433\3\2\2\2\u0441\u0434\3\2\2\2\u0441\u0435\3\2"+ - "\2\2\u0441\u0436\3\2\2\2\u0441\u0437\3\2\2\2\u0441\u0438\3\2\2\2\u0441"+ - "\u0439\3\2\2\2\u0441\u043a\3\2\2\2\u0441\u043b\3\2\2\2\u0441\u043c\3\2"+ - "\2\2\u0441\u043d\3\2\2\2\u0441\u043e\3\2\2\2\u0441\u043f\3\2\2\2\u0441"+ - "\u0440\3\2\2\2\u0442\u00a7\3\2\2\2\u0443\u0444\7&\2\2\u0444\u0445\5\u00a4"+ - "S\2\u0445\u00a9\3\2\2\2\u0446\u0447\7Z\2\2\u0447\u0449\5\u00a4S\2\u0448"+ - "\u044a\5\u00eex\2\u0449\u0448\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u00ab"+ - "\3\2\2\2\u044b\u044c\5\u00aeX\2\u044c\u044d\5\u0126\u0094\2\u044d\u00ad"+ - "\3\2\2\2\u044e\u044f\7\16\2\2\u044f\u0450\5\u00a4S\2\u0450\u0451\5\u0170"+ - "\u00b9\2\u0451\u0453\3\2\2\2\u0452\u044e\3\2\2\2\u0453\u0456\3\2\2\2\u0454"+ - "\u0452\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u045b\3\2\2\2\u0456\u0454\3\2"+ - "\2\2\u0457\u0458\7\17\2\2\u0458\u0459\5b\62\2\u0459\u045a\5\u0170\u00b9"+ - "\2\u045a\u045c\3\2\2\2\u045b\u0457\3\2\2\2\u045b\u045c\3\2\2\2\u045c\u00af"+ - "\3\2\2\2\u045d\u045e\7S\2\2\u045e\u0463\5\u00a4S\2\u045f\u0460\7S\2\2"+ - "\u0460\u0461\t\3\2\2\u0461\u0463\5.\30\2\u0462\u045d\3\2\2\2\u0462\u045f"+ - "\3\2\2\2\u0463\u00b1\3\2\2\2\u0464\u046d\7\5\2\2\u0465\u046d\7\6\2\2\u0466"+ - "\u046d\7f\2\2\u0467\u046d\5\u014c\u00a7\2\u0468\u046d\5\u0162\u00b2\2"+ - "\u0469\u046d\7\3\2\2\u046a\u046d\7\u0091\2\2\u046b\u046d\7\u0092\2\2\u046c"+ - "\u0464\3\2\2\2\u046c\u0465\3\2\2\2\u046c\u0466\3\2\2\2\u046c\u0467\3\2"+ - "\2\2\u046c\u0468\3\2\2\2\u046c\u0469\3\2\2\2\u046c\u046a\3\2\2\2\u046c"+ - "\u046b\3\2\2\2\u046d\u00b3\3\2\2\2\u046e\u046f\b[\1\2\u046f\u047b\5\u0148"+ - "\u00a5\2\u0470\u047b\5\u0144\u00a3\2\u0471\u047b\5\u016c\u00b7\2\u0472"+ - "\u047b\5 \21\2\u0473\u047b\5\u0086D\2\u0474\u047b\5\u0084C\2\u0475\u0476"+ - "\t\17\2\2\u0476\u0477\7h\2\2\u0477\u0478\5\u00a4S\2\u0478\u0479\7i\2\2"+ - "\u0479\u047b\3\2\2\2\u047a\u046e\3\2\2\2\u047a\u0470\3\2\2\2\u047a\u0471"+ - "\3\2\2\2\u047a\u0472\3\2\2\2\u047a\u0473\3\2\2\2\u047a\u0474\3\2\2\2\u047a"+ - "\u0475\3\2\2\2\u047b\u0492\3\2\2\2\u047c\u047d\f\13\2\2\u047d\u047e\7"+ - "r\2\2\u047e\u0491\7g\2\2\u047f\u0480\f\n\2\2\u0480\u0491\5\u0166\u00b4"+ - "\2\u0481\u0482\f\t\2\2\u0482\u0491\5\u00ceh\2\u0483\u0484\f\b\2\2\u0484"+ - "\u0491\5L\'\2\u0485\u0486\f\7\2\2\u0486\u0491\5\u0168\u00b5\2\u0487\u0488"+ - "\f\6\2\2\u0488\u0491\5\u016a\u00b6\2\u0489\u048a\f\5\2\2\u048a\u048b\5"+ - "\u016a\u00b6\2\u048b\u048c\7\22\2\2\u048c\u048d\5r:\2\u048d\u0491\3\2"+ - "\2\2\u048e\u048f\f\4\2\2\u048f\u0491\5\u00ba^\2\u0490\u047c\3\2\2\2\u0490"+ - "\u047f\3\2\2\2\u0490\u0481\3\2\2\2\u0490\u0483\3\2\2\2\u0490\u0485\3\2"+ - "\2\2\u0490\u0487\3\2\2\2\u0490\u0489\3\2\2\2\u0490\u048e\3\2\2\2\u0491"+ - "\u0494\3\2\2\2\u0492\u0490\3\2\2\2\u0492\u0493\3\2\2\2\u0493\u00b5\3\2"+ - "\2\2\u0494\u0492\3\2\2\2\u0495\u0496\5^\60\2\u0496\u0497\5\u00b8]\2\u0497"+ - "\u00b7\3\2\2\2\u0498\u049a\7O\2\2\u0499\u049b\7g\2\2\u049a\u0499\3\2\2"+ - "\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049e\5\u013e\u00a0\2"+ - "\u049d\u049f\5p9\2\u049e\u049d\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u00b9"+ - "\3\2\2\2\u04a0\u04a2\7(\2\2\u04a1\u04a3\5\u00e6t\2\u04a2\u04a1\3\2\2\2"+ - "\u04a2\u04a3\3\2\2\2\u04a3\u04a5\3\2\2\2\u04a4\u04a6\7o\2\2\u04a5\u04a4"+ - "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7\u04a8\7)\2\2\u04a8"+ - "\u00bb\3\2\2\2\u04a9\u04aa\7P\2\2\u04aa\u04b4\7j\2\2\u04ab\u04af\5\u00c0"+ - "a\2\u04ac\u04af\5\u012c\u0097\2\u04ad\u04af\5\u00be`\2\u04ae\u04ab\3\2"+ - "\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+ - "\u04b1\5\u0170\u00b9\2\u04b1\u04b3\3\2\2\2\u04b2\u04ae\3\2\2\2\u04b3\u04b6"+ - "\3\2\2\2\u04b4\u04b2\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b7\3\2\2\2\u04b6"+ - "\u04b4\3\2\2\2\u04b7\u04b8\7k\2\2\u04b8\u00bd\3\2\2\2\u04b9\u04ba\7:\2"+ - "\2\u04ba\u04bb\7g\2\2\u04bb\u04bc\5\u0142\u00a2\2\u04bc\u00bf\3\2\2\2"+ - "\u04bd\u04bf\7\35\2\2\u04be\u04bd\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf\u04c0"+ - "\3\2\2\2\u04c0\u04c1\5^\60\2\u04c1\u04c2\7g\2\2\u04c2\u04c3\5\u0142\u00a2"+ - "\2\u04c3\u04c4\5\u0140\u00a1\2\u04c4\u04cd\3\2\2\2\u04c5\u04c7\7\35\2"+ + "\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\4\u00ba\t\u00ba\3\2\3"+ + "\2\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u0181\n\5\f\5\16\5\u0184"+ + "\13\5\3\6\3\6\5\6\u0188\n\6\3\7\3\7\3\7\7\7\u018d\n\7\f\7\16\7\u0190\13"+ + "\7\3\7\3\7\3\7\3\7\3\7\7\7\u0197\n\7\f\7\16\7\u019a\13\7\3\7\3\7\3\7\5"+ + "\7\u019f\n\7\3\7\3\7\7\7\u01a3\n\7\f\7\16\7\u01a6\13\7\3\7\3\7\3\b\3\b"+ + "\3\b\3\t\3\t\3\t\3\n\3\n\3\n\7\n\u01b3\n\n\f\n\16\n\u01b6\13\n\3\n\5\n"+ + "\u01b9\n\n\3\n\3\n\3\13\3\13\3\13\7\13\u01c0\n\13\f\13\16\13\u01c3\13"+ + "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13\u01cc\n\13\f\13\16\13\u01cf"+ + "\13\13\3\13\5\13\u01d2\n\13\3\f\3\f\3\f\3\f\5\f\u01d8\n\f\3\r\3\r\3\r"+ + "\3\r\3\r\3\r\3\r\5\r\u01e1\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20"+ + "\5\20\u01eb\n\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ + "\3\21\3\21\3\21\3\21\3\21\5\21\u01fd\n\21\3\22\3\22\3\23\3\23\3\23\3\23"+ + "\3\23\3\24\3\24\3\24\7\24\u0209\n\24\f\24\16\24\u020c\13\24\3\24\5\24"+ + "\u020f\n\24\3\25\3\25\3\25\7\25\u0214\n\25\f\25\16\25\u0217\13\25\3\25"+ + "\3\25\3\26\7\26\u021c\n\26\f\26\16\26\u021f\13\26\3\27\3\27\3\27\3\27"+ + "\7\27\u0225\n\27\f\27\16\27\u0228\13\27\3\27\3\27\3\30\3\30\3\31\3\31"+ + "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34"+ + "\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\5\35\u0247\n\35\3\35\3\35"+ + "\3\35\3\35\3\36\3\36\5\36\u024f\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3"+ + "!\3!\3!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\5$\u026c\n$"+ + "\3$\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\7&\u027d\n&\f&\16&\u0280"+ + "\13&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3(\3(\7(\u028c\n(\f(\16(\u028f\13(\3"+ + "(\3(\3)\3)\3)\3)\3*\3*\3*\3*\5*\u029b\n*\3+\3+\3+\3+\3+\7+\u02a2\n+\f"+ + "+\16+\u02a5\13+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\5,\u02b2\n,\3-\3-\3-"+ + "\3-\3-\7-\u02b9\n-\f-\16-\u02bc\13-\3-\3-\3.\3.\3.\3.\3.\7.\u02c5\n.\f"+ + ".\16.\u02c8\13.\3.\3.\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60"+ + "\3\60\3\60\3\60\3\60\5\60\u02dc\n\60\3\61\3\61\3\61\3\61\3\61\5\61\u02e3"+ + "\n\61\3\61\7\61\u02e6\n\61\f\61\16\61\u02e9\13\61\3\61\3\61\5\61\u02ed"+ + "\n\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u02f7\n\62\3\63\5\63"+ + "\u02fa\n\63\3\63\3\63\5\63\u02fe\n\63\3\64\3\64\5\64\u0302\n\64\3\65\3"+ + "\65\3\65\3\65\7\65\u0308\n\65\f\65\16\65\u030b\13\65\3\65\3\65\3\66\3"+ + "\66\3\66\5\66\u0312\n\66\3\67\3\67\3\67\5\67\u0317\n\67\38\38\38\38\3"+ + "8\38\58\u031f\n8\58\u0321\n8\38\38\38\58\u0326\n8\39\39\39\79\u032b\n"+ + "9\f9\169\u032e\139\3:\3:\3:\3:\3:\5:\u0335\n:\3:\5:\u0338\n:\3:\3:\3;"+ + "\3;\5;\u033e\n;\3;\3;\3;\5;\u0343\n;\5;\u0345\n;\3;\5;\u0348\n;\3<\3<"+ + "\3<\7<\u034d\n<\f<\16<\u0350\13<\3=\3=\5=\u0354\n=\3=\3=\3>\3>\3>\3>\3"+ + ">\3>\3?\3?\3?\3?\3?\3?\3?\7?\u0365\n?\f?\16?\u0368\13?\3?\3?\3?\7?\u036d"+ + "\n?\f?\16?\u0370\13?\3?\5?\u0373\n?\3@\5@\u0376\n@\3@\3@\3@\3@\5@\u037c"+ + "\n@\3A\3A\5A\u0380\nA\3A\5A\u0383\nA\3A\3A\3A\3B\3B\3B\3B\3B\5B\u038d"+ + "\nB\3C\3C\3C\3C\3C\5C\u0394\nC\3D\3D\3D\3D\3D\5D\u039b\nD\3D\3D\3E\3E"+ + "\3E\3E\3E\3F\3F\3F\5F\u03a7\nF\3G\3G\3G\3G\5G\u03ad\nG\3H\3H\3H\3H\3H"+ + "\5H\u03b4\nH\3I\3I\3I\5I\u03b9\nI\3J\3J\3J\3J\5J\u03bf\nJ\3K\3K\3K\3K"+ + "\3K\3L\3L\3L\3L\3L\5L\u03cb\nL\3M\3M\3M\3M\5M\u03d1\nM\3M\3M\5M\u03d5"+ + "\nM\3N\3N\3N\3N\3O\3O\5O\u03dd\nO\3O\3O\5O\u03e1\nO\3O\3O\3P\3P\5P\u03e7"+ + "\nP\3Q\5Q\u03ea\nQ\3Q\3Q\3R\3R\5R\u03f0\nR\3R\3R\3S\5S\u03f5\nS\3S\3S"+ + "\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u040e"+ + "\nT\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T"+ + "\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\7T\u0431\nT\fT\16T\u0434\13T\3U\3U\3"+ + "U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\5U\u044a\nU\3V\3"+ + "V\3V\3W\3W\3W\5W\u0452\nW\3X\3X\3X\3Y\3Y\3Y\3Y\7Y\u045b\nY\fY\16Y\u045e"+ + "\13Y\3Y\3Y\3Y\3Y\5Y\u0464\nY\3Z\3Z\3Z\3Z\3Z\5Z\u046b\nZ\3[\3[\3[\3[\3"+ + "[\3[\3[\3[\5[\u0475\n[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\"+ + "\5\\\u0483\n\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\"+ + "\3\\\3\\\3\\\3\\\3\\\3\\\7\\\u0499\n\\\f\\\16\\\u049c\13\\\3]\3]\3]\3"+ + "^\3^\5^\u04a3\n^\3^\3^\5^\u04a7\n^\3_\3_\5_\u04ab\n_\3_\5_\u04ae\n_\3"+ + "_\3_\3`\3`\3`\3`\3`\5`\u04b7\n`\3`\3`\7`\u04bb\n`\f`\16`\u04be\13`\3`"+ + "\3`\3a\3a\3a\3a\3b\5b\u04c7\nb\3b\3b\3b\3b\3b\3b\5b\u04cf\nb\3b\3b\3b"+ + "\3b\5b\u04d5\nb\3c\3c\3c\3c\3c\3c\3c\5c\u04de\nc\3d\3d\3d\3d\3d\3d\3d"+ + "\3d\3d\5d\u04e9\nd\3e\3e\3e\3f\3f\3f\3f\7f\u04f2\nf\ff\16f\u04f5\13f\3"+ + "f\5f\u04f8\nf\5f\u04fa\nf\3f\3f\3g\3g\3g\3g\3g\3g\3g\5g\u0505\ng\3h\3"+ + "h\3h\3h\3h\3i\3i\5i\u050e\ni\3i\3i\5i\u0512\ni\3i\5i\u0515\ni\3i\3i\3"+ + "i\3i\3i\5i\u051c\ni\3i\3i\3j\3j\3k\3k\3l\3l\3m\5m\u0527\nm\3m\3m\3n\3"+ + "n\3n\3n\3n\3n\5n\u0531\nn\3n\3n\3n\3n\5n\u0537\nn\5n\u0539\nn\3o\3o\3"+ + "o\3p\3p\3q\3q\3q\5q\u0543\nq\3r\3r\3r\3r\3r\3r\7r\u054b\nr\fr\16r\u054e"+ + "\13r\3r\5r\u0551\nr\3s\3s\5s\u0555\ns\3s\3s\5s\u0559\ns\3t\3t\3t\7t\u055e"+ + "\nt\ft\16t\u0561\13t\3u\3u\3u\7u\u0566\nu\fu\16u\u0569\13u\3v\3v\3v\3"+ + "v\3v\3v\7v\u0571\nv\fv\16v\u0574\13v\3v\5v\u0577\nv\3w\3w\5w\u057b\nw"+ + "\3w\3w\3x\3x\3x\3x\3x\3x\7x\u0585\nx\fx\16x\u0588\13x\3x\5x\u058b\nx\3"+ + "y\3y\5y\u058f\ny\3y\3y\3z\5z\u0594\nz\3z\3z\3z\6z\u0599\nz\rz\16z\u059a"+ + "\3{\3{\3{\3{\3{\5{\u05a2\n{\3|\3|\3}\3}\3}\3}\3~\3~\3~\3\177\3\177\3\177"+ + "\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u05b6\n\u0081\3"+ + "\u0082\3\u0082\5\u0082\u05ba\n\u0082\3\u0083\3\u0083\5\u0083\u05be\n\u0083"+ + "\3\u0084\3\u0084\5\u0084\u05c2\n\u0084\3\u0085\3\u0085\3\u0085\3\u0086"+ + "\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087"+ + "\3\u0087\5\u0087\u05d2\n\u0087\3\u0087\3\u0087\3\u0087\3\u0087\5\u0087"+ + "\u05d8\n\u0087\5\u0087\u05da\n\u0087\3\u0088\3\u0088\5\u0088\u05de\n\u0088"+ + "\3\u0089\3\u0089\5\u0089\u05e2\n\u0089\3\u0089\5\u0089\u05e5\n\u0089\3"+ + "\u0089\3\u0089\5\u0089\u05e9\n\u0089\5\u0089\u05eb\n\u0089\3\u0089\3\u0089"+ + "\7\u0089\u05ef\n\u0089\f\u0089\16\u0089\u05f2\13\u0089\3\u0089\3\u0089"+ + "\3\u008a\3\u008a\3\u008a\5\u008a\u05f9\n\u008a\3\u008b\3\u008b\3\u008b"+ + "\5\u008b\u05fe\n\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c"+ + "\3\u008c\3\u008c\3\u008c\5\u008c\u0609\n\u008c\3\u008c\3\u008c\7\u008c"+ + "\u060d\n\u008c\f\u008c\16\u008c\u0610\13\u008c\3\u008c\3\u008c\3\u008d"+ + "\3\u008d\5\u008d\u0616\n\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d"+ + "\3\u008d\3\u008e\3\u008e\3\u008e\5\u008e\u0621\n\u008e\3\u008f\3\u008f"+ + "\3\u008f\5\u008f\u0626\n\u008f\3\u0090\3\u0090\5\u0090\u062a\n\u0090\3"+ + "\u0090\3\u0090\3\u0090\5\u0090\u062f\n\u0090\7\u0090\u0631\n\u0090\f\u0090"+ + "\16\u0090\u0634\13\u0090\3\u0091\3\u0091\3\u0091\7\u0091\u0639\n\u0091"+ + "\f\u0091\16\u0091\u063c\13\u0091\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092"+ + "\5\u0092\u0643\n\u0092\3\u0093\3\u0093\3\u0093\5\u0093\u0648\n\u0093\3"+ + "\u0093\5\u0093\u064b\n\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3"+ + "\u0094\5\u0094\u0653\n\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3"+ + "\u0095\5\u0095\u065b\n\u0095\3\u0095\3\u0095\3\u0096\5\u0096\u0660\n\u0096"+ + "\3\u0096\3\u0096\5\u0096\u0664\n\u0096\3\u0096\3\u0096\5\u0096\u0668\n"+ + "\u0096\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\5\u0098\u066f\n\u0098\3"+ + "\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\3\u009b\3\u009b"+ + "\3\u009c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ + "\5\u009f\u068c\n\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a1"+ + "\3\u00a1\3\u00a1\3\u00a1\5\u00a1\u0697\n\u00a1\3\u00a2\3\u00a2\5\u00a2"+ + "\u069b\n\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3\7\u00a3\u06a1\n\u00a3\f"+ + "\u00a3\16\u00a3\u06a4\13\u00a3\3\u00a3\5\u00a3\u06a7\n\u00a3\5\u00a3\u06a9"+ + "\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u06b1"+ + "\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\5\u00a5"+ + "\u06ba\n\u00a5\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\3\u00a6\5\u00a6"+ + "\u06c2\n\u00a6\3\u00a7\3\u00a7\3\u00a7\5\u00a7\u06c7\n\u00a7\3\u00a8\3"+ + "\u00a8\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab"+ + "\3\u00ab\3\u00ac\3\u00ac\3\u00ac\5\u00ac\u06d7\n\u00ac\5\u00ac\u06d9\n"+ + "\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\7\u00ad\u06e0\n\u00ad\f"+ + "\u00ad\16\u00ad\u06e3\13\u00ad\3\u00ae\3\u00ae\3\u00ae\5\u00ae\u06e8\n"+ + "\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\5\u00af\u06ee\n\u00af\3\u00b0\3"+ + "\u00b0\5\u00b0\u06f2\n\u00b0\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\7"+ + "\u00b1\u06f9\n\u00b1\f\u00b1\16\u00b1\u06fc\13\u00b1\3\u00b1\3\u00b1\3"+ + "\u00b2\3\u00b2\3\u00b2\3\u00b2\5\u00b2\u0704\n\u00b2\3\u00b2\5\u00b2\u0707"+ + "\n\u00b2\3\u00b3\3\u00b3\3\u00b4\5\u00b4\u070c\n\u00b4\3\u00b4\3\u00b4"+ + "\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6"+ + "\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b7\5\u00b7\u071e\n\u00b7\5\u00b7"+ + "\u0720\n\u00b7\3\u00b7\5\u00b7\u0723\n\u00b7\3\u00b7\5\u00b7\u0726\n\u00b7"+ + "\5\u00b7\u0728\n\u00b7\3\u00b7\3\u00b7\3\u00b8\3\u00b8\3\u00b8\3\u00b8"+ + "\3\u00b9\3\u00b9\3\u00ba\3\u00ba\3\u00ba\3\u00ba\5\u00ba\u0736\n\u00ba"+ + "\3\u00ba\3\u02e7\4\u00a6\u00b6\u00bb\2\4\6\b\n\f\16\20\22\24\26\30\32"+ + "\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ + "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ + "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ + "\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8"+ + "\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0"+ + "\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8"+ + "\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110"+ + "\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128"+ + "\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140"+ + "\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158"+ + "\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170"+ + "\u0172\2\25\4\2hhss\3\2\31\32\3\2\7\n\3\2DE\3\2*,\4\2*,..\3\2\u0086\u008c"+ + "\3\2\26\27\4\2\u0081\u0085\u008a\u008b\6\2%%tt\u0080\u0080\u0087\u0089"+ + "\3\2!#\3\2\36 \4\2KLz\177\6\2//\62\62\65\65``\4\2\u0080\u0085\u0087\u008b"+ + "\3\2tu\4\2qq\u00a2\u00a2\4\2\u008d\u0090\u0092\u0093\3\2\u0099\u009a\2"+ + "\u079c\2\u0174\3\2\2\2\4\u0177\3\2\2\2\6\u017a\3\2\2\2\b\u017d\3\2\2\2"+ + "\n\u0185\3\2\2\2\f\u018e\3\2\2\2\16\u01a9\3\2\2\2\20\u01ac\3\2\2\2\22"+ + "\u01b4\3\2\2\2\24\u01c1\3\2\2\2\26\u01d7\3\2\2\2\30\u01e0\3\2\2\2\32\u01e2"+ + "\3\2\2\2\34\u01e4\3\2\2\2\36\u01e7\3\2\2\2 \u01fc\3\2\2\2\"\u01fe\3\2"+ + "\2\2$\u0200\3\2\2\2&\u0205\3\2\2\2(\u0210\3\2\2\2*\u021d\3\2\2\2,\u0220"+ + "\3\2\2\2.\u022b\3\2\2\2\60\u022d\3\2\2\2\62\u0232\3\2\2\2\64\u0237\3\2"+ + "\2\2\66\u023c\3\2\2\28\u0241\3\2\2\2:\u024e\3\2\2\2<\u0250\3\2\2\2>\u0252"+ + "\3\2\2\2@\u0257\3\2\2\2B\u025c\3\2\2\2D\u0261\3\2\2\2F\u0266\3\2\2\2H"+ + "\u026f\3\2\2\2J\u0276\3\2\2\2L\u0283\3\2\2\2N\u0287\3\2\2\2P\u0292\3\2"+ + "\2\2R\u029a\3\2\2\2T\u029c\3\2\2\2V\u02b1\3\2\2\2X\u02b3\3\2\2\2Z\u02bf"+ + "\3\2\2\2\\\u02cb\3\2\2\2^\u02db\3\2\2\2`\u02e7\3\2\2\2b\u02f6\3\2\2\2"+ + "d\u02f9\3\2\2\2f\u0301\3\2\2\2h\u0303\3\2\2\2j\u030e\3\2\2\2l\u0316\3"+ + "\2\2\2n\u0325\3\2\2\2p\u0327\3\2\2\2r\u032f\3\2\2\2t\u033d\3\2\2\2v\u0349"+ + "\3\2\2\2x\u0353\3\2\2\2z\u0357\3\2\2\2|\u035d\3\2\2\2~\u0375\3\2\2\2\u0080"+ + "\u037d\3\2\2\2\u0082\u038c\3\2\2\2\u0084\u038e\3\2\2\2\u0086\u0395\3\2"+ + "\2\2\u0088\u039e\3\2\2\2\u008a\u03a3\3\2\2\2\u008c\u03a8\3\2\2\2\u008e"+ + "\u03ae\3\2\2\2\u0090\u03b5\3\2\2\2\u0092\u03ba\3\2\2\2\u0094\u03c0\3\2"+ + "\2\2\u0096\u03c5\3\2\2\2\u0098\u03cc\3\2\2\2\u009a\u03d6\3\2\2\2\u009c"+ + "\u03da\3\2\2\2\u009e\u03e6\3\2\2\2\u00a0\u03e9\3\2\2\2\u00a2\u03ed\3\2"+ + "\2\2\u00a4\u03f4\3\2\2\2\u00a6\u040d\3\2\2\2\u00a8\u0449\3\2\2\2\u00aa"+ + "\u044b\3\2\2\2\u00ac\u044e\3\2\2\2\u00ae\u0453\3\2\2\2\u00b0\u045c\3\2"+ + "\2\2\u00b2\u046a\3\2\2\2\u00b4\u0474\3\2\2\2\u00b6\u0482\3\2\2\2\u00b8"+ + "\u049d\3\2\2\2\u00ba\u04a0\3\2\2\2\u00bc\u04a8\3\2\2\2\u00be\u04b1\3\2"+ + "\2\2\u00c0\u04c1\3\2\2\2\u00c2\u04d4\3\2\2\2\u00c4\u04dd\3\2\2\2\u00c6"+ + "\u04e8\3\2\2\2\u00c8\u04ea\3\2\2\2\u00ca\u04ed\3\2\2\2\u00cc\u0504\3\2"+ + "\2\2\u00ce\u0506\3\2\2\2\u00d0\u050b\3\2\2\2\u00d2\u051f\3\2\2\2\u00d4"+ + "\u0521\3\2\2\2\u00d6\u0523\3\2\2\2\u00d8\u0526\3\2\2\2\u00da\u0530\3\2"+ + "\2\2\u00dc\u053a\3\2\2\2\u00de\u053d\3\2\2\2\u00e0\u0542\3\2\2\2\u00e2"+ + "\u0544\3\2\2\2\u00e4\u0552\3\2\2\2\u00e6\u055a\3\2\2\2\u00e8\u0562\3\2"+ + "\2\2\u00ea\u056a\3\2\2\2\u00ec\u0578\3\2\2\2\u00ee\u057e\3\2\2\2\u00f0"+ + "\u058c\3\2\2\2\u00f2\u0598\3\2\2\2\u00f4\u05a1\3\2\2\2\u00f6\u05a3\3\2"+ + "\2\2\u00f8\u05a5\3\2\2\2\u00fa\u05a9\3\2\2\2\u00fc\u05ac\3\2\2\2\u00fe"+ + "\u05b0\3\2\2\2\u0100\u05b2\3\2\2\2\u0102\u05b7\3\2\2\2\u0104\u05bb\3\2"+ + "\2\2\u0106\u05bf\3\2\2\2\u0108\u05c3\3\2\2\2\u010a\u05c6\3\2\2\2\u010c"+ + "\u05c8\3\2\2\2\u010e\u05dd\3\2\2\2\u0110\u05df\3\2\2\2\u0112\u05f5\3\2"+ + "\2\2\u0114\u05fd\3\2\2\2\u0116\u05ff\3\2\2\2\u0118\u0615\3\2\2\2\u011a"+ + "\u061d\3\2\2\2\u011c\u0625\3\2\2\2\u011e\u0629\3\2\2\2\u0120\u0635\3\2"+ + "\2\2\u0122\u063f\3\2\2\2\u0124\u064a\3\2\2\2\u0126\u0652\3\2\2\2\u0128"+ + "\u0656\3\2\2\2\u012a\u065f\3\2\2\2\u012c\u0669\3\2\2\2\u012e\u066e\3\2"+ + "\2\2\u0130\u0670\3\2\2\2\u0132\u0675\3\2\2\2\u0134\u0677\3\2\2\2\u0136"+ + "\u0679\3\2\2\2\u0138\u067c\3\2\2\2\u013a\u0680\3\2\2\2\u013c\u068b\3\2"+ + "\2\2\u013e\u068f\3\2\2\2\u0140\u0696\3\2\2\2\u0142\u069a\3\2\2\2\u0144"+ + "\u069c\3\2\2\2\u0146\u06ac\3\2\2\2\u0148\u06b9\3\2\2\2\u014a\u06c1\3\2"+ + "\2\2\u014c\u06c6\3\2\2\2\u014e\u06c8\3\2\2\2\u0150\u06ca\3\2\2\2\u0152"+ + "\u06cc\3\2\2\2\u0154\u06d0\3\2\2\2\u0156\u06d3\3\2\2\2\u0158\u06dc\3\2"+ + "\2\2\u015a\u06e7\3\2\2\2\u015c\u06ed\3\2\2\2\u015e\u06f1\3\2\2\2\u0160"+ + "\u06f3\3\2\2\2\u0162\u0703\3\2\2\2\u0164\u0708\3\2\2\2\u0166\u070b\3\2"+ + "\2\2\u0168\u070f\3\2\2\2\u016a\u0713\3\2\2\2\u016c\u0718\3\2\2\2\u016e"+ + "\u072b\3\2\2\2\u0170\u072f\3\2\2\2\u0172\u0735\3\2\2\2\u0174\u0175\5\u00a6"+ + "T\2\u0175\u0176\7\2\2\3\u0176\3\3\2\2\2\u0177\u0178\5\u00a8U\2\u0178\u0179"+ + "\7\2\2\3\u0179\5\3\2\2\2\u017a\u017b\5\u00c4c\2\u017b\u017c\7\2\2\3\u017c"+ + "\7\3\2\2\2\u017d\u0182\5\n\6\2\u017e\u017f\7p\2\2\u017f\u0181\5\n\6\2"+ + "\u0180\u017e\3\2\2\2\u0181\u0184\3\2\2\2\u0182\u0180\3\2\2\2\u0182\u0183"+ + "\3\2\2\2\u0183\t\3\2\2\2\u0184\u0182\3\2\2\2\u0185\u0187\7h\2\2\u0186"+ + "\u0188\7?\2\2\u0187\u0186\3\2\2\2\u0187\u0188\3\2\2\2\u0188\13\3\2\2\2"+ + "\u0189\u018a\5\16\b\2\u018a\u018b\5\u0172\u00ba\2\u018b\u018d\3\2\2\2"+ + "\u018c\u0189\3\2\2\2\u018d\u0190\3\2\2\2\u018e\u018c\3\2\2\2\u018e\u018f"+ + "\3\2\2\2\u018f\u0191\3\2\2\2\u0190\u018e\3\2\2\2\u0191\u0192\5\u00dco"+ + "\2\u0192\u0198\5\u0172\u00ba\2\u0193\u0194\5\24\13\2\u0194\u0195\5\u0172"+ + "\u00ba\2\u0195\u0197\3\2\2\2\u0196\u0193\3\2\2\2\u0197\u019a\3\2\2\2\u0198"+ + "\u0196\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u01a4\3\2\2\2\u019a\u0198\3\2"+ + "\2\2\u019b\u019f\5\u008aF\2\u019c\u019f\5\u00e0q\2\u019d\u019f\5\26\f"+ + "\2\u019e\u019b\3\2\2\2\u019e\u019c\3\2\2\2\u019e\u019d\3\2\2\2\u019f\u01a0"+ + "\3\2\2\2\u01a0\u01a1\5\u0172\u00ba\2\u01a1\u01a3\3\2\2\2\u01a2\u019e\3"+ + "\2\2\2\u01a3\u01a6\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5"+ + "\u01a7\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a7\u01a8\7\2\2\3\u01a8\r\3\2\2\2"+ + "\u01a9\u01aa\7H\2\2\u01aa\u01ab\5\u00a6T\2\u01ab\17\3\2\2\2\u01ac\u01ad"+ + "\7I\2\2\u01ad\u01ae\5\u00a6T\2\u01ae\21\3\2\2\2\u01af\u01b0\5\20\t\2\u01b0"+ + "\u01b1\5\u0172\u00ba\2\u01b1\u01b3\3\2\2\2\u01b2\u01af\3\2\2\2\u01b3\u01b6"+ + "\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b8\3\2\2\2\u01b6"+ + "\u01b4\3\2\2\2\u01b7\u01b9\t\2\2\2\u01b8\u01b7\3\2\2\2\u01b8\u01b9\3\2"+ + "\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bb\5\u00dep\2\u01bb\23\3\2\2\2\u01bc"+ + "\u01bd\5\20\t\2\u01bd\u01be\5\u0172\u00ba\2\u01be\u01c0\3\2\2\2\u01bf"+ + "\u01bc\3\2\2\2\u01c0\u01c3\3\2\2\2\u01c1\u01bf\3\2\2\2\u01c1\u01c2\3\2"+ + "\2\2\u01c2\u01d1\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c4\u01c5\7d\2\2\u01c5"+ + "\u01d2\5\22\n\2\u01c6\u01c7\7d\2\2\u01c7\u01cd\7i\2\2\u01c8\u01c9\5\22"+ + "\n\2\u01c9\u01ca\5\u0172\u00ba\2\u01ca\u01cc\3\2\2\2\u01cb\u01c8\3\2\2"+ + "\2\u01cc\u01cf\3\2\2\2\u01cd\u01cb\3\2\2\2\u01cd\u01ce\3\2\2\2\u01ce\u01d0"+ + "\3\2\2\2\u01cf\u01cd\3\2\2\2\u01d0\u01d2\7j\2\2\u01d1\u01c4\3\2\2\2\u01d1"+ + "\u01c6\3\2\2\2\u01d2\25\3\2\2\2\u01d3\u01d8\5|?\2\u01d4\u01d8\5\u0092"+ + "J\2\u01d5\u01d8\5\u0096L\2\u01d6\u01d8\5\u0090I\2\u01d7\u01d3\3\2\2\2"+ + "\u01d7\u01d4\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d6\3\2\2\2\u01d8\27"+ + "\3\2\2\2\u01d9\u01da\7\35\2\2\u01da\u01e1\5\u00a8U\2\u01db\u01dc\t\3\2"+ + "\2\u01dc\u01e1\5.\30\2\u01dd\u01de\t\4\2\2\u01de\u01e1\5\u00a6T\2\u01df"+ + "\u01e1\5h\65\2\u01e0\u01d9\3\2\2\2\u01e0\u01db\3\2\2\2\u01e0\u01dd\3\2"+ + "\2\2\u01e0\u01df\3\2\2\2\u01e1\31\3\2\2\2\u01e2\u01e3\5\34\17\2\u01e3"+ + "\33\3\2\2\2\u01e4\u01e5\5`\61\2\u01e5\u01e6\5\36\20\2\u01e6\35\3\2\2\2"+ + "\u01e7\u01e8\7G\2\2\u01e8\u01ea\7i\2\2\u01e9\u01eb\5\u00f2z\2\u01ea\u01e9"+ + "\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\3\2\2\2\u01ec\u01ed\7j\2\2\u01ed"+ + "\37\3\2\2\2\u01ee\u01fd\5H%\2\u01ef\u01fd\5F$\2\u01f0\u01fd\5D#\2\u01f1"+ + "\u01fd\5$\23\2\u01f2\u01fd\5@!\2\u01f3\u01fd\5B\"\2\u01f4\u01fd\58\35"+ + "\2\u01f5\u01fd\5> \2\u01f6\u01fd\5\66\34\2\u01f7\u01fd\5\62\32\2\u01f8"+ + "\u01fd\5\60\31\2\u01f9\u01fd\5\64\33\2\u01fa\u01fd\5\"\22\2\u01fb\u01fd"+ + "\5J&\2\u01fc\u01ee\3\2\2\2\u01fc\u01ef\3\2\2\2\u01fc\u01f0\3\2\2\2\u01fc"+ + "\u01f1\3\2\2\2\u01fc\u01f2\3\2\2\2\u01fc\u01f3\3\2\2\2\u01fc\u01f4\3\2"+ + "\2\2\u01fc\u01f5\3\2\2\2\u01fc\u01f6\3\2\2\2\u01fc\u01f7\3\2\2\2\u01fc"+ + "\u01f8\3\2\2\2\u01fc\u01f9\3\2\2\2\u01fc\u01fa\3\2\2\2\u01fc\u01fb\3\2"+ + "\2\2\u01fd!\3\2\2\2\u01fe\u01ff\t\5\2\2\u01ff#\3\2\2\2\u0200\u0201\7a"+ + "\2\2\u0201\u0202\7m\2\2\u0202\u0203\5\u00c4c\2\u0203\u0204\7n\2\2\u0204"+ + "%\3\2\2\2\u0205\u020a\5(\25\2\u0206\u0207\7p\2\2\u0207\u0209\5(\25\2\u0208"+ + "\u0206\3\2\2\2\u0209\u020c\3\2\2\2\u020a\u0208\3\2\2\2\u020a\u020b\3\2"+ + "\2\2\u020b\u020e\3\2\2\2\u020c\u020a\3\2\2\2\u020d\u020f\7p\2\2\u020e"+ + "\u020d\3\2\2\2\u020e\u020f\3\2\2\2\u020f\'\3\2\2\2\u0210\u0215\7h\2\2"+ + "\u0211\u0212\7p\2\2\u0212\u0214\7h\2\2\u0213\u0211\3\2\2\2\u0214\u0217"+ + "\3\2\2\2\u0215\u0213\3\2\2\2\u0215\u0216\3\2\2\2\u0216\u0218\3\2\2\2\u0217"+ + "\u0215\3\2\2\2\u0218\u0219\5\u0134\u009b\2\u0219)\3\2\2\2\u021a\u021c"+ + "\5,\27\2\u021b\u021a\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d"+ + "\u021e\3\2\2\2\u021e+\3\2\2\2\u021f\u021d\3\2\2\2\u0220\u0221\7k\2\2\u0221"+ + "\u0226\5\u00a6T\2\u0222\u0223\7p\2\2\u0223\u0225\5\u00a6T\2\u0224\u0222"+ + "\3\2\2\2\u0225\u0228\3\2\2\2\u0226\u0224\3\2\2\2\u0226\u0227\3\2\2\2\u0227"+ + "\u0229\3\2\2\2\u0228\u0226\3\2\2\2\u0229\u022a\7l\2\2\u022a-\3\2\2\2\u022b"+ + "\u022c\5\u00b6\\\2\u022c/\3\2\2\2\u022d\u022e\7\63\2\2\u022e\u022f\7i"+ + "\2\2\u022f\u0230\5\u00a6T\2\u0230\u0231\7j\2\2\u0231\61\3\2\2\2\u0232"+ + "\u0233\79\2\2\u0233\u0234\7m\2\2\u0234\u0235\5\u00c4c\2\u0235\u0236\7"+ + "n\2\2\u0236\63\3\2\2\2\u0237\u0238\7\64\2\2\u0238\u0239\7i\2\2\u0239\u023a"+ + "\5\u00a6T\2\u023a\u023b\7j\2\2\u023b\65\3\2\2\2\u023c\u023d\t\6\2\2\u023d"+ + "\u023e\7i\2\2\u023e\u023f\5\u00a6T\2\u023f\u0240\7j\2\2\u0240\67\3\2\2"+ + "\2\u0241\u0246\7\23\2\2\u0242\u0243\7m\2\2\u0243\u0244\5:\36\2\u0244\u0245"+ + "\7n\2\2\u0245\u0247\3\2\2\2\u0246\u0242\3\2\2\2\u0246\u0247\3\2\2\2\u0247"+ + "\u0248\3\2\2\2\u0248\u0249\7i\2\2\u0249\u024a\5\u00a6T\2\u024a\u024b\7"+ + "j\2\2\u024b9\3\2\2\2\u024c\u024f\5<\37\2\u024d\u024f\7\25\2\2\u024e\u024c"+ + "\3\2\2\2\u024e\u024d\3\2\2\2\u024f;\3\2\2\2\u0250\u0251\7h\2\2\u0251="+ + "\3\2\2\2\u0252\u0253\7\24\2\2\u0253\u0254\7i\2\2\u0254\u0255\5\u00a6T"+ + "\2\u0255\u0256\7j\2\2\u0256?\3\2\2\2\u0257\u0258\7<\2\2\u0258\u0259\7"+ + "i\2\2\u0259\u025a\5\u00a6T\2\u025a\u025b\7j\2\2\u025bA\3\2\2\2\u025c\u025d"+ + "\7=\2\2\u025d\u025e\7i\2\2\u025e\u025f\5\u00a6T\2\u025f\u0260\7j\2\2\u0260"+ + "C\3\2\2\2\u0261\u0262\7;\2\2\u0262\u0263\7i\2\2\u0263\u0264\5\u00a6T\2"+ + "\u0264\u0265\7j\2\2\u0265E\3\2\2\2\u0266\u0267\7\30\2\2\u0267\u0268\7"+ + "i\2\2\u0268\u026b\5\u00a6T\2\u0269\u026a\7p\2\2\u026a\u026c\5\u00a6T\2"+ + "\u026b\u0269\3\2\2\2\u026b\u026c\3\2\2\2\u026c\u026d\3\2\2\2\u026d\u026e"+ + "\7j\2\2\u026eG\3\2\2\2\u026f\u0270\t\6\2\2\u0270\u0271\7m\2\2\u0271\u0272"+ + "\5\u00a6T\2\u0272\u0273\7@\2\2\u0273\u0274\5\u00a6T\2\u0274\u0275\7n\2"+ + "\2\u0275I\3\2\2\2\u0276\u0277\78\2\2\u0277\u0278\5\u00a6T\2\u0278\u027e"+ + "\7k\2\2\u0279\u027a\5L\'\2\u027a\u027b\5\u0172\u00ba\2\u027b\u027d\3\2"+ + "\2\2\u027c\u0279\3\2\2\2\u027d\u0280\3\2\2\2\u027e\u027c\3\2\2\2\u027e"+ + "\u027f\3\2\2\2\u027f\u0281\3\2\2\2\u0280\u027e\3\2\2\2\u0281\u0282\7l"+ + "\2\2\u0282K\3\2\2\2\u0283\u0284\5l\67\2\u0284\u0285\7r\2\2\u0285\u0286"+ + "\5\u00a6T\2\u0286M\3\2\2\2\u0287\u0288\7m\2\2\u0288\u028d\5P)\2\u0289"+ + "\u028a\7p\2\2\u028a\u028c\5P)\2\u028b\u0289\3\2\2\2\u028c\u028f\3\2\2"+ + "\2\u028d\u028b\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u0290\3\2\2\2\u028f\u028d"+ + "\3\2\2\2\u0290\u0291\7n\2\2\u0291O\3\2\2\2\u0292\u0293\5\u00a6T\2\u0293"+ + "\u0294\7o\2\2\u0294\u0295\5\u00a6T\2\u0295Q\3\2\2\2\u0296\u029b\5^\60"+ + "\2\u0297\u029b\5\\/\2\u0298\u029b\5T+\2\u0299\u029b\5X-\2\u029a\u0296"+ + "\3\2\2\2\u029a\u0297\3\2\2\2\u029a\u0298\3\2\2\2\u029a\u0299\3\2\2\2\u029b"+ + "S\3\2\2\2\u029c\u029d\7\65\2\2\u029d\u02a3\7k\2\2\u029e\u029f\5V,\2\u029f"+ + "\u02a0\5\u0172\u00ba\2\u02a0\u02a2\3\2\2\2\u02a1\u029e\3\2\2\2\u02a2\u02a5"+ + "\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a3\u02a4\3\2\2\2\u02a4\u02a6\3\2\2\2\u02a5"+ + "\u02a3\3\2\2\2\u02a6\u02a7\7l\2\2\u02a7U\3\2\2\2\u02a8\u02a9\7P\2\2\u02a9"+ + "\u02aa\7h\2\2\u02aa\u02b2\5\u0140\u00a1\2\u02ab\u02ac\7\66\2\2\u02ac\u02ad"+ + "\7k\2\2\u02ad\u02ae\5\u00a6T\2\u02ae\u02af\5\u0172\u00ba\2\u02af\u02b0"+ + "\7l\2\2\u02b0\u02b2\3\2\2\2\u02b1\u02a8\3\2\2\2\u02b1\u02ab\3\2\2\2\u02b2"+ + "W\3\2\2\2\u02b3\u02b4\7\67\2\2\u02b4\u02ba\7k\2\2\u02b5\u02b6\5Z.\2\u02b6"+ + "\u02b7\5\u0172\u00ba\2\u02b7\u02b9\3\2\2\2\u02b8\u02b5\3\2\2\2\u02b9\u02bc"+ + "\3\2\2\2\u02ba\u02b8\3\2\2\2\u02ba\u02bb\3\2\2\2\u02bb\u02bd\3\2\2\2\u02bc"+ + "\u02ba\3\2\2\2\u02bd\u02be\7l\2\2\u02beY\3\2\2\2\u02bf\u02c0\7h\2\2\u02c0"+ + "\u02c6\7k\2\2\u02c1\u02c2\5\u0162\u00b2\2\u02c2\u02c3\5\u0172\u00ba\2"+ + "\u02c3\u02c5\3\2\2\2\u02c4\u02c1\3\2\2\2\u02c5\u02c8\3\2\2\2\u02c6\u02c4"+ + "\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c9\3\2\2\2\u02c8\u02c6\3\2\2\2\u02c9"+ + "\u02ca\7l\2\2\u02ca[\3\2\2\2\u02cb\u02cc\7\35\2\2\u02cc\u02cd\7m\2\2\u02cd"+ + "\u02ce\7n\2\2\u02ce\u02cf\5\u0134\u009b\2\u02cf]\3\2\2\2\u02d0\u02d1\t"+ + "\7\2\2\u02d1\u02d2\7m\2\2\u02d2\u02d3\5\u00c4c\2\u02d3\u02d4\7n\2\2\u02d4"+ + "\u02dc\3\2\2\2\u02d5\u02d6\7-\2\2\u02d6\u02d7\7m\2\2\u02d7\u02d8\5\u00c4"+ + "c\2\u02d8\u02d9\7n\2\2\u02d9\u02da\5\u00c4c\2\u02da\u02dc\3\2\2\2\u02db"+ + "\u02d0\3\2\2\2\u02db\u02d5\3\2\2\2\u02dc_\3\2\2\2\u02dd\u02e3\5b\62\2"+ + "\u02de\u02df\7\20\2\2\u02df\u02e3\b\61\1\2\u02e0\u02e1\7F\2\2\u02e1\u02e3"+ + "\b\61\1\2\u02e2\u02dd\3\2\2\2\u02e2\u02de\3\2\2\2\u02e2\u02e0\3\2\2\2"+ + "\u02e3\u02e4\3\2\2\2\u02e4\u02e6\5\u0172\u00ba\2\u02e5\u02e2\3\2\2\2\u02e6"+ + "\u02e9\3\2\2\2\u02e7\u02e8\3\2\2\2\u02e7\u02e5\3\2\2\2\u02e8\u02ec\3\2"+ + "\2\2\u02e9\u02e7\3\2\2\2\u02ea\u02eb\7\20\2\2\u02eb\u02ed\b\61\1\2\u02ec"+ + "\u02ea\3\2\2\2\u02ec\u02ed\3\2\2\2\u02eda\3\2\2\2\u02ee\u02ef\7\13\2\2"+ + "\u02ef\u02f7\5f\64\2\u02f0\u02f1\7\f\2\2\u02f1\u02f7\5f\64\2\u02f2\u02f3"+ + "\7\r\2\2\u02f3\u02f7\5f\64\2\u02f4\u02f5\7\17\2\2\u02f5\u02f7\5d\63\2"+ + "\u02f6\u02ee\3\2\2\2\u02f6\u02f0\3\2\2\2\u02f6\u02f2\3\2\2\2\u02f6\u02f4"+ + "\3\2\2\2\u02f7c\3\2\2\2\u02f8\u02fa\5\u00e8u\2\u02f9\u02f8\3\2\2\2\u02f9"+ + "\u02fa\3\2\2\2\u02fa\u02fd\3\2\2\2\u02fb\u02fc\7_\2\2\u02fc\u02fe\5\u00a6"+ + "T\2\u02fd\u02fb\3\2\2\2\u02fd\u02fe\3\2\2\2\u02fee\3\2\2\2\u02ff\u0302"+ + "\3\2\2\2\u0300\u0302\5\u00a6T\2\u0301\u02ff\3\2\2\2\u0301\u0300\3\2\2"+ + "\2\u0302g\3\2\2\2\u0303\u0304\78\2\2\u0304\u0305\5\u00a6T\2\u0305\u0309"+ + "\7k\2\2\u0306\u0308\5j\66\2\u0307\u0306\3\2\2\2\u0308\u030b\3\2\2\2\u0309"+ + "\u0307\3\2\2\2\u0309\u030a\3\2\2\2\u030a\u030c\3\2\2\2\u030b\u0309\3\2"+ + "\2\2\u030c\u030d\7l\2\2\u030di\3\2\2\2\u030e\u030f\5l\67\2\u030f\u0311"+ + "\7r\2\2\u0310\u0312\5\u00f2z\2\u0311\u0310\3\2\2\2\u0311\u0312\3\2\2\2"+ + "\u0312k\3\2\2\2\u0313\u0314\7S\2\2\u0314\u0317\5n8\2\u0315\u0317\7O\2"+ + "\2\u0316\u0313\3\2\2\2\u0316\u0315\3\2\2\2\u0317m\3\2\2\2\u0318\u0319"+ + "\7\'\2\2\u0319\u0326\7h\2\2\u031a\u031b\5\u00ccg\2\u031b\u0320\7k\2\2"+ + "\u031c\u031e\5p9\2\u031d\u031f\7p\2\2\u031e\u031d\3\2\2\2\u031e\u031f"+ + "\3\2\2\2\u031f\u0321\3\2\2\2\u0320\u031c\3\2\2\2\u0320\u0321\3\2\2\2\u0321"+ + "\u0322\3\2\2\2\u0322\u0323\7l\2\2\u0323\u0326\3\2\2\2\u0324\u0326\5\u00a6"+ + "T\2\u0325\u0318\3\2\2\2\u0325\u031a\3\2\2\2\u0325\u0324\3\2\2\2\u0326"+ + "o\3\2\2\2\u0327\u032c\5n8\2\u0328\u0329\7p\2\2\u0329\u032b\5n8\2\u032a"+ + "\u0328\3\2\2\2\u032b\u032e\3\2\2\2\u032c\u032a\3\2\2\2\u032c\u032d\3\2"+ + "\2\2\u032dq\3\2\2\2\u032e\u032c\3\2\2\2\u032f\u0334\7k\2\2\u0330\u0331"+ + "\7>\2\2\u0331\u0332\5\u00e6t\2\u0332\u0333\5\u0172\u00ba\2\u0333\u0335"+ + "\3\2\2\2\u0334\u0330\3\2\2\2\u0334\u0335\3\2\2\2\u0335\u0337\3\2\2\2\u0336"+ + "\u0338\5\u00f2z\2\u0337\u0336\3\2\2\2\u0337\u0338\3\2\2\2\u0338\u0339"+ + "\3\2\2\2\u0339\u033a\7l\2\2\u033as\3\2\2\2\u033b\u033e\5\u0152\u00aa\2"+ + "\u033c\u033e\7h\2\2\u033d\u033b\3\2\2\2\u033d\u033c\3\2\2\2\u033e\u0347"+ + "\3\2\2\2\u033f\u0344\7k\2\2\u0340\u0342\5v<\2\u0341\u0343\7p\2\2\u0342"+ + "\u0341\3\2\2\2\u0342\u0343\3\2\2\2\u0343\u0345\3\2\2\2\u0344\u0340\3\2"+ + "\2\2\u0344\u0345\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0348\7l\2\2\u0347"+ + "\u033f\3\2\2\2\u0347\u0348\3\2\2\2\u0348u\3\2\2\2\u0349\u034e\5x=\2\u034a"+ + "\u034b\7p\2\2\u034b\u034d\5x=\2\u034c\u034a\3\2\2\2\u034d\u0350\3\2\2"+ + "\2\u034e\u034c\3\2\2\2\u034e\u034f\3\2\2\2\u034fw\3\2\2\2\u0350\u034e"+ + "\3\2\2\2\u0351\u0352\7h\2\2\u0352\u0354\7r\2\2\u0353\u0351\3\2\2\2\u0353"+ + "\u0354\3\2\2\2\u0354\u0355\3\2\2\2\u0355\u0356\5\u00a6T\2\u0356y\3\2\2"+ + "\2\u0357\u0358\7J\2\2\u0358\u0359\5\u00a6T\2\u0359\u035a\7\21\2\2\u035a"+ + "\u035b\5t;\2\u035b\u035c\5\u00f0y\2\u035c{\3\2\2\2\u035d\u035e\5\u00c4"+ + "c\2\u035e\u035f\7\21\2\2\u035f\u0372\5\u00c4c\2\u0360\u0366\7k\2\2\u0361"+ + "\u0362\5\u0084C\2\u0362\u0363\5\u0172\u00ba\2\u0363\u0365\3\2\2\2\u0364"+ + "\u0361\3\2\2\2\u0365\u0368\3\2\2\2\u0366\u0364\3\2\2\2\u0366\u0367\3\2"+ + "\2\2\u0367\u036e\3\2\2\2\u0368\u0366\3\2\2\2\u0369\u036a\5~@\2\u036a\u036b"+ + "\5\u0172\u00ba\2\u036b\u036d\3\2\2\2\u036c\u0369\3\2\2\2\u036d\u0370\3"+ + "\2\2\2\u036e\u036c\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0371\3\2\2\2\u0370"+ + "\u036e\3\2\2\2\u0371\u0373\7l\2\2\u0372\u0360\3\2\2\2\u0372\u0373\3\2"+ + "\2\2\u0373}\3\2\2\2\u0374\u0376\7\20\2\2\u0375\u0374\3\2\2\2\u0375\u0376"+ + "\3\2\2\2\u0376\u0377\3\2\2\2\u0377\u0378\5\u0080A\2\u0378\u0379\7h\2\2"+ + "\u0379\u037b\5\u0140\u00a1\2\u037a\u037c\5\u00f0y\2\u037b\u037a\3\2\2"+ + "\2\u037b\u037c\3\2\2\2\u037c\177\3\2\2\2\u037d\u037f\7i\2\2\u037e\u0380"+ + "\7h\2\2\u037f\u037e\3\2\2\2\u037f\u0380\3\2\2\2\u0380\u0382\3\2\2\2\u0381"+ + "\u0383\7\u008a\2\2\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384"+ + "\3\2\2\2\u0384\u0385\5\u012e\u0098\2\u0385\u0386\7j\2\2\u0386\u0081\3"+ + "\2\2\2\u0387\u038d\5\u00b6\\\2\u0388\u0389\5\u00c4c\2\u0389\u038a\7s\2"+ + "\2\u038a\u038b\7h\2\2\u038b\u038d\3\2\2\2\u038c\u0387\3\2\2\2\u038c\u0388"+ + "\3\2\2\2\u038d\u0083\3\2\2\2\u038e\u038f\7:\2\2\u038f\u0390\7h\2\2\u0390"+ + "\u0393\7v\2\2\u0391\u0394\5\u0082B\2\u0392\u0394\5\u0150\u00a9\2\u0393"+ + "\u0391\3\2\2\2\u0393\u0392\3\2\2\2\u0394\u0085\3\2\2\2\u0395\u0396\7\61"+ + "\2\2\u0396\u0397\7i\2\2\u0397\u039a\5\u00c4c\2\u0398\u0399\7p\2\2\u0399"+ + "\u039b\5\u00e8u\2\u039a\u0398\3\2\2\2\u039a\u039b\3\2\2\2\u039b\u039c"+ + "\3\2\2\2\u039c\u039d\7j\2\2\u039d\u0087\3\2\2\2\u039e\u039f\7\60\2\2\u039f"+ + "\u03a0\7i\2\2\u03a0\u03a1\5\u00c4c\2\u03a1\u03a2\7j\2\2\u03a2\u0089\3"+ + "\2\2\2\u03a3\u03a6\5`\61\2\u03a4\u03a7\5\u008cG\2\u03a5\u03a7\5\u008e"+ + "H\2\u03a6\u03a4\3\2\2\2\u03a6\u03a5\3\2\2\2\u03a7\u008b\3\2\2\2\u03a8"+ + "\u03a9\7P\2\2\u03a9\u03aa\7h\2\2\u03aa\u03ac\5\u0140\u00a1\2\u03ab\u03ad"+ + "\5r:\2\u03ac\u03ab\3\2\2\2\u03ac\u03ad\3\2\2\2\u03ad\u008d\3\2\2\2\u03ae"+ + "\u03af\7P\2\2\u03af\u03b0\5\u009cO\2\u03b0\u03b1\7h\2\2\u03b1\u03b3\5"+ + "\u0140\u00a1\2\u03b2\u03b4\5r:\2\u03b3\u03b2\3\2\2\2\u03b3\u03b4\3\2\2"+ + "\2\u03b4\u008f\3\2\2\2\u03b5\u03b8\7\35\2\2\u03b6\u03b9\5\u008aF\2\u03b7"+ + "\u03b9\5\u00e0q\2\u03b8\u03b6\3\2\2\2\u03b8\u03b7\3\2\2\2\u03b9\u0091"+ + "\3\2\2\2\u03ba\u03bb\7:\2\2\u03bb\u03bc\7h\2\2\u03bc\u03be\5\u0144\u00a3"+ + "\2\u03bd\u03bf\5\u0094K\2\u03be\u03bd\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf"+ + "\u0093\3\2\2\2\u03c0\u03c1\7k\2\2\u03c1\u03c2\5\u00a6T\2\u03c2\u03c3\5"+ + "\u0172\u00ba\2\u03c3\u03c4\7l\2\2\u03c4\u0095\3\2\2\2\u03c5\u03c6\7:\2"+ + "\2\u03c6\u03c7\5\u009cO\2\u03c7\u03c8\7h\2\2\u03c8\u03ca\5\u0144\u00a3"+ + "\2\u03c9\u03cb\5\u0094K\2\u03ca\u03c9\3\2\2\2\u03ca\u03cb\3\2\2\2\u03cb"+ + "\u0097\3\2\2\2\u03cc\u03d4\5\b\5\2\u03cd\u03d0\5\u00c4c\2\u03ce\u03cf"+ + "\7o\2\2\u03cf\u03d1\5\u00e8u\2\u03d0\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2"+ + "\u03d1\u03d5\3\2\2\2\u03d2\u03d3\7o\2\2\u03d3\u03d5\5\u00e8u\2\u03d4\u03cd"+ + "\3\2\2\2\u03d4\u03d2\3\2\2\2\u03d5\u0099\3\2\2\2\u03d6\u03d7\5\b\5\2\u03d7"+ + "\u03d8\7v\2\2\u03d8\u03d9\5\u00e8u\2\u03d9\u009b\3\2\2\2\u03da\u03dc\7"+ + "i\2\2\u03db\u03dd\5\n\6\2\u03dc\u03db\3\2\2\2\u03dc\u03dd\3\2\2\2\u03dd"+ + "\u03de\3\2\2\2\u03de\u03e0\5\u00c4c\2\u03df\u03e1\7p\2\2\u03e0\u03df\3"+ + "\2\2\2\u03e0\u03e1\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2\u03e3\7j\2\2\u03e3"+ + "\u009d\3\2\2\2\u03e4\u03e7\5\u00a0Q\2\u03e5\u03e7\5\u00a2R\2\u03e6\u03e4"+ + "\3\2\2\2\u03e6\u03e5\3\2\2\2\u03e7\u009f\3\2\2\2\u03e8\u03ea\5\u00e6t"+ + "\2\u03e9\u03e8\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea\u03eb\3\2\2\2\u03eb\u03ec"+ + "\5\u00a4S\2\u03ec\u00a1\3\2\2\2\u03ed\u03ef\7\35\2\2\u03ee\u03f0\5\u00e6"+ + "t\2\u03ef\u03ee\3\2\2\2\u03ef\u03f0\3\2\2\2\u03f0\u03f1\3\2\2\2\u03f1"+ + "\u03f2\5\u00a4S\2\u03f2\u00a3\3\2\2\2\u03f3\u03f5\7w\2\2\u03f4\u03f3\3"+ + "\2\2\2\u03f4\u03f5\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6\u03f7\5\u00c4c\2"+ + "\u03f7\u00a5\3\2\2\2\u03f8\u03f9\bT\1\2\u03f9\u03fa\t\b\2\2\u03fa\u040e"+ + "\5\u00a6T\21\u03fb\u040e\5\u00b6\\\2\u03fc\u03fd\7\33\2\2\u03fd\u03fe"+ + "\5.\30\2\u03fe\u03ff\7\36\2\2\u03ff\u0400\5\u00a6T\5\u0400\u040e\3\2\2"+ + "\2\u0401\u0402\7\34\2\2\u0402\u0403\5\u009aN\2\u0403\u0404\7\36\2\2\u0404"+ + "\u0405\5\u00a6T\4\u0405\u040e\3\2\2\2\u0406\u0407\t\t\2\2\u0407\u0408"+ + "\5&\24\2\u0408\u0409\7r\2\2\u0409\u040a\7r\2\2\u040a\u040b\5*\26\2\u040b"+ + "\u040c\5\u00a6T\3\u040c\u040e\3\2\2\2\u040d\u03f8\3\2\2\2\u040d\u03fb"+ + "\3\2\2\2\u040d\u03fc\3\2\2\2\u040d\u0401\3\2\2\2\u040d\u0406\3\2\2\2\u040e"+ + "\u0432\3\2\2\2\u040f\u0410\f\17\2\2\u0410\u0411\t\n\2\2\u0411\u0431\5"+ + "\u00a6T\20\u0412\u0413\f\16\2\2\u0413\u0414\t\13\2\2\u0414\u0431\5\u00a6"+ + "T\17\u0415\u0416\f\r\2\2\u0416\u0417\t\f\2\2\u0417\u0431\5\u00a6T\16\u0418"+ + "\u0419\f\f\2\2\u0419\u041a\t\r\2\2\u041a\u0431\5\u00a6T\r\u041b\u041c"+ + "\f\13\2\2\u041c\u041d\t\16\2\2\u041d\u0431\5\u00a6T\f\u041e\u041f\f\t"+ + "\2\2\u041f\u0420\7y\2\2\u0420\u0431\5\u00a6T\n\u0421\u0422\f\b\2\2\u0422"+ + "\u0423\7x\2\2\u0423\u0431\5\u00a6T\t\u0424\u0425\f\7\2\2\u0425\u0426\7"+ + "$\2\2\u0426\u0431\5\u00a6T\7\u0427\u0428\f\6\2\2\u0428\u0429\7\'\2\2\u0429"+ + "\u042a\5\u00a6T\2\u042a\u042b\7r\2\2\u042b\u042c\5\u00a6T\6\u042c\u0431"+ + "\3\2\2\2\u042d\u042e\f\n\2\2\u042e\u042f\7\21\2\2\u042f\u0431\5t;\2\u0430"+ + "\u040f\3\2\2\2\u0430\u0412\3\2\2\2\u0430\u0415\3\2\2\2\u0430\u0418\3\2"+ + "\2\2\u0430\u041b\3\2\2\2\u0430\u041e\3\2\2\2\u0430\u0421\3\2\2\2\u0430"+ + "\u0424\3\2\2\2\u0430\u0427\3\2\2\2\u0430\u042d\3\2\2\2\u0431\u0434\3\2"+ + "\2\2\u0432\u0430\3\2\2\2\u0432\u0433\3\2\2\2\u0433\u00a7\3\2\2\2\u0434"+ + "\u0432\3\2\2\2\u0435\u044a\5\30\r\2\u0436\u044a\5\32\16\2\u0437\u044a"+ + "\5\u00acW\2\u0438\u044a\5\u00aaV\2\u0439\u044a\5\u00e0q\2\u043a\u044a"+ + "\5\u0100\u0081\2\u043b\u044a\5\u00f4{\2\u043c\u044a\5\u012c\u0097\2\u043d"+ + "\u044a\5\u0102\u0082\2\u043e\u044a\5\u0104\u0083\2\u043f\u044a\5\u0106"+ + "\u0084\2\u0440\u044a\5\u0108\u0085\2\u0441\u044a\5\u010a\u0086\2\u0442"+ + "\u044a\5\u00f0y\2\u0443\u044a\5\u010c\u0087\2\u0444\u044a\5\u010e\u0088"+ + "\2\u0445\u044a\5\u0120\u0091\2\u0446\u044a\5\u00aeX\2\u0447\u044a\5\u00b2"+ + "Z\2\u0448\u044a\5z>\2\u0449\u0435\3\2\2\2\u0449\u0436\3\2\2\2\u0449\u0437"+ + "\3\2\2\2\u0449\u0438\3\2\2\2\u0449\u0439\3\2\2\2\u0449\u043a\3\2\2\2\u0449"+ + "\u043b\3\2\2\2\u0449\u043c\3\2\2\2\u0449\u043d\3\2\2\2\u0449\u043e\3\2"+ + "\2\2\u0449\u043f\3\2\2\2\u0449\u0440\3\2\2\2\u0449\u0441\3\2\2\2\u0449"+ + "\u0442\3\2\2\2\u0449\u0443\3\2\2\2\u0449\u0444\3\2\2\2\u0449\u0445\3\2"+ + "\2\2\u0449\u0446\3\2\2\2\u0449\u0447\3\2\2\2\u0449\u0448\3\2\2\2\u044a"+ + "\u00a9\3\2\2\2\u044b\u044c\7&\2\2\u044c\u044d\5\u00a6T\2\u044d\u00ab\3"+ + "\2\2\2\u044e\u044f\7[\2\2\u044f\u0451\5\u00a6T\2\u0450\u0452\5\u00f0y"+ + "\2\u0451\u0450\3\2\2\2\u0451\u0452\3\2\2\2\u0452\u00ad\3\2\2\2\u0453\u0454"+ + "\5\u00b0Y\2\u0454\u0455\5\u0128\u0095\2\u0455\u00af\3\2\2\2\u0456\u0457"+ + "\7\16\2\2\u0457\u0458\5\u00a6T\2\u0458\u0459\5\u0172\u00ba\2\u0459\u045b"+ + "\3\2\2\2\u045a\u0456\3\2\2\2\u045b\u045e\3\2\2\2\u045c\u045a\3\2\2\2\u045c"+ + "\u045d\3\2\2\2\u045d\u0463\3\2\2\2\u045e\u045c\3\2\2\2\u045f\u0460\7\17"+ + "\2\2\u0460\u0461\5d\63\2\u0461\u0462\5\u0172\u00ba\2\u0462\u0464\3\2\2"+ + "\2\u0463\u045f\3\2\2\2\u0463\u0464\3\2\2\2\u0464\u00b1\3\2\2\2\u0465\u0466"+ + "\7T\2\2\u0466\u046b\5\u00a6T\2\u0467\u0468\7T\2\2\u0468\u0469\t\3\2\2"+ + "\u0469\u046b\5.\30\2\u046a\u0465\3\2\2\2\u046a\u0467\3\2\2\2\u046b\u00b3"+ + "\3\2\2\2\u046c\u0475\7\5\2\2\u046d\u0475\7\6\2\2\u046e\u0475\7g\2\2\u046f"+ + "\u0475\5\u014e\u00a8\2\u0470\u0475\5\u0164\u00b3\2\u0471\u0475\7\3\2\2"+ + "\u0472\u0475\7\u0092\2\2\u0473\u0475\7\u0093\2\2\u0474\u046c\3\2\2\2\u0474"+ + "\u046d\3\2\2\2\u0474\u046e\3\2\2\2\u0474\u046f\3\2\2\2\u0474\u0470\3\2"+ + "\2\2\u0474\u0471\3\2\2\2\u0474\u0472\3\2\2\2\u0474\u0473\3\2\2\2\u0475"+ + "\u00b5\3\2\2\2\u0476\u0477\b\\\1\2\u0477\u0483\5\u014a\u00a6\2\u0478\u0483"+ + "\5\u0146\u00a4\2\u0479\u0483\5\u016e\u00b8\2\u047a\u0483\5 \21\2\u047b"+ + "\u0483\5\u0088E\2\u047c\u0483\5\u0086D\2\u047d\u047e\t\17\2\2\u047e\u047f"+ + "\7i\2\2\u047f\u0480\5\u00a6T\2\u0480\u0481\7j\2\2\u0481\u0483\3\2\2\2"+ + "\u0482\u0476\3\2\2\2\u0482\u0478\3\2\2\2\u0482\u0479\3\2\2\2\u0482\u047a"+ + "\3\2\2\2\u0482\u047b\3\2\2\2\u0482\u047c\3\2\2\2\u0482\u047d\3\2\2\2\u0483"+ + "\u049a\3\2\2\2\u0484\u0485\f\13\2\2\u0485\u0486\7s\2\2\u0486\u0499\7h"+ + "\2\2\u0487\u0488\f\n\2\2\u0488\u0499\5\u0168\u00b5\2\u0489\u048a\f\t\2"+ + "\2\u048a\u0499\5\u00d0i\2\u048b\u048c\f\b\2\2\u048c\u0499\5N(\2\u048d"+ + "\u048e\f\7\2\2\u048e\u0499\5\u016a\u00b6\2\u048f\u0490\f\6\2\2\u0490\u0499"+ + "\5\u016c\u00b7\2\u0491\u0492\f\5\2\2\u0492\u0493\5\u016c\u00b7\2\u0493"+ + "\u0494\7\22\2\2\u0494\u0495\5t;\2\u0495\u0499\3\2\2\2\u0496\u0497\f\4"+ + "\2\2\u0497\u0499\5\u00bc_\2\u0498\u0484\3\2\2\2\u0498\u0487\3\2\2\2\u0498"+ + "\u0489\3\2\2\2\u0498\u048b\3\2\2\2\u0498\u048d\3\2\2\2\u0498\u048f\3\2"+ + "\2\2\u0498\u0491\3\2\2\2\u0498\u0496\3\2\2\2\u0499\u049c\3\2\2\2\u049a"+ + "\u0498\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u00b7\3\2\2\2\u049c\u049a\3\2"+ + "\2\2\u049d\u049e\5`\61\2\u049e\u049f\5\u00ba^\2\u049f\u00b9\3\2\2\2\u04a0"+ + "\u04a2\7P\2\2\u04a1\u04a3\7h\2\2\u04a2\u04a1\3\2\2\2\u04a2\u04a3\3\2\2"+ + "\2\u04a3\u04a4\3\2\2\2\u04a4\u04a6\5\u0140\u00a1\2\u04a5\u04a7\5r:\2\u04a6"+ + "\u04a5\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7\u00bb\3\2\2\2\u04a8\u04aa\7("+ + "\2\2\u04a9\u04ab\5\u00e8u\2\u04aa\u04a9\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab"+ + "\u04ad\3\2\2\2\u04ac\u04ae\7p\2\2\u04ad\u04ac\3\2\2\2\u04ad\u04ae\3\2"+ + "\2\2\u04ae\u04af\3\2\2\2\u04af\u04b0\7)\2\2\u04b0\u00bd\3\2\2\2\u04b1"+ + "\u04b2\7Q\2\2\u04b2\u04bc\7k\2\2\u04b3\u04b7\5\u00c2b\2\u04b4\u04b7\5"+ + "\u012e\u0098\2\u04b5\u04b7\5\u00c0a\2\u04b6\u04b3\3\2\2\2\u04b6\u04b4"+ + "\3\2\2\2\u04b6\u04b5\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04b9\5\u0172\u00ba"+ + "\2\u04b9\u04bb\3\2\2\2\u04ba\u04b6\3\2\2\2\u04bb\u04be\3\2\2\2\u04bc\u04ba"+ + "\3\2\2\2\u04bc\u04bd\3\2\2\2\u04bd\u04bf\3\2\2\2\u04be\u04bc\3\2\2\2\u04bf"+ + "\u04c0\7l\2\2\u04c0\u00bf\3\2\2\2\u04c1\u04c2\7:\2\2\u04c2\u04c3\7h\2"+ + "\2\u04c3\u04c4\5\u0144\u00a3\2\u04c4\u00c1\3\2\2\2\u04c5\u04c7\7\35\2"+ "\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04c9"+ - "\5^\60\2\u04c9\u04ca\7g\2\2\u04ca\u04cb\5\u0142\u00a2\2\u04cb\u04cd\3"+ - "\2\2\2\u04cc\u04be\3\2\2\2\u04cc\u04c6\3\2\2\2\u04cd\u00c1\3\2\2\2\u04ce"+ - "\u04d6\5\u012c\u0097\2\u04cf\u04d6\5\u00c4c\2\u04d0\u04d6\5P)\2\u04d1"+ - "\u04d2\7h\2\2\u04d2\u04d3\5\u00c2b\2\u04d3\u04d4\7i\2\2\u04d4\u04d6\3"+ - "\2\2\2\u04d5\u04ce\3\2\2\2\u04d5\u04cf\3\2\2\2\u04d5\u04d0\3\2\2\2\u04d5"+ - "\u04d1\3\2\2\2\u04d6\u00c3\3\2\2\2\u04d7\u04e1\5\u012e\u0098\2\u04d8\u04e1"+ - "\5\u015e\u00b0\2\u04d9\u04e1\5\u0134\u009b\2\u04da\u04e1\5\u013c\u009f"+ - "\2\u04db\u04e1\5\u00bc_\2\u04dc\u04e1\5\u0136\u009c\2\u04dd\u04e1\5\u0138"+ - "\u009d\2\u04de\u04e1\5\u013a\u009e\2\u04df\u04e1\5\u00c6d\2\u04e0\u04d7"+ - "\3\2\2\2\u04e0\u04d8\3\2\2\2\u04e0\u04d9\3\2\2\2\u04e0\u04da\3\2\2\2\u04e0"+ - "\u04db\3\2\2\2\u04e0\u04dc\3\2\2\2\u04e0\u04dd\3\2\2\2\u04e0\u04de\3\2"+ - "\2\2\u04e0\u04df\3\2\2\2\u04e1\u00c5\3\2\2\2\u04e2\u04e3\7:\2\2\u04e3"+ - "\u04e4\5\u00c8e\2\u04e4\u00c7\3\2\2\2\u04e5\u04f1\7h\2\2\u04e6\u04eb\5"+ - "\u00c2b\2\u04e7\u04e8\7o\2\2\u04e8\u04ea\5\u00c2b\2\u04e9\u04e7\3\2\2"+ - "\2\u04ea\u04ed\3\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u04ef"+ - "\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ee\u04f0\7o\2\2\u04ef\u04ee\3\2\2\2\u04ef"+ - "\u04f0\3\2\2\2\u04f0\u04f2\3\2\2\2\u04f1\u04e6\3\2\2\2\u04f1\u04f2\3\2"+ - "\2\2\u04f2\u04f3\3\2\2\2\u04f3\u04f4\7i\2\2\u04f4\u00c9\3\2\2\2\u04f5"+ - "\u04fd\5\u015e\u00b0\2\u04f6\u04fd\5\u012e\u0098\2\u04f7\u04fd\5\u00cc"+ - "g\2\u04f8\u04fd\5\u0136\u009c\2\u04f9\u04fd\5\u0138\u009d\2\u04fa\u04fd"+ - "\5P)\2\u04fb\u04fd\5\u012c\u0097\2\u04fc\u04f5\3\2\2\2\u04fc\u04f6\3\2"+ - "\2\2\u04fc\u04f7\3\2\2\2\u04fc\u04f8\3\2\2\2\u04fc\u04f9\3\2\2\2\u04fc"+ - "\u04fa\3\2\2\2\u04fc\u04fb\3\2\2\2\u04fd\u00cb\3\2\2\2\u04fe\u04ff\7l"+ - "\2\2\u04ff\u0500\7v\2\2\u0500\u0501\7m\2\2\u0501\u0502\5\u0132\u009a\2"+ - "\u0502\u00cd\3\2\2\2\u0503\u0513\7l\2\2\u0504\u0506\5\u00d0i\2\u0505\u0504"+ - "\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u0507\3\2\2\2\u0507\u0509\7q\2\2\u0508"+ - "\u050a\5\u00d2j\2\u0509\u0508\3\2\2\2\u0509\u050a\3\2\2\2\u050a\u0514"+ - "\3\2\2\2\u050b\u050d\5\u00d0i\2\u050c\u050b\3\2\2\2\u050c\u050d\3\2\2"+ - "\2\u050d\u050e\3\2\2\2\u050e\u050f\7q\2\2\u050f\u0510\5\u00d2j\2\u0510"+ - "\u0511\7q\2\2\u0511\u0512\5\u00d4k\2\u0512\u0514\3\2\2\2\u0513\u0505\3"+ - "\2\2\2\u0513\u050c\3\2\2\2\u0514\u0515\3\2\2\2\u0515\u0516\7m\2\2\u0516"+ - "\u00cf\3\2\2\2\u0517\u0518\5\u00a4S\2\u0518\u00d1\3\2\2\2\u0519\u051a"+ - "\5\u00a4S\2\u051a\u00d3\3\2\2\2\u051b\u051c\5\u00a4S\2\u051c\u00d5\3\2"+ - "\2\2\u051d\u051f\t\20\2\2\u051e\u051d\3\2\2\2\u051e\u051f\3\2\2\2\u051f"+ - "\u0520\3\2\2\2\u0520\u0521\7n\2\2\u0521\u00d7\3\2\2\2\u0522\u0523\5\u00e6"+ - "t\2\u0523\u0524\7n\2\2\u0524\u0529\3\2\2\2\u0525\u0526\5\b\5\2\u0526\u0527"+ - "\7u\2\2\u0527\u0529\3\2\2\2\u0528\u0522\3\2\2\2\u0528\u0525\3\2\2\2\u0528"+ - "\u0529\3\2\2\2\u0529\u052a\3\2\2\2\u052a\u052b\7_\2\2\u052b\u0530\5\u00a4"+ - "S\2\u052c\u052e\7L\2\2\u052d\u052f\7g\2\2\u052e\u052d\3\2\2\2\u052e\u052f"+ - "\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052c\3\2\2\2\u0530\u0531\3\2\2\2\u0531"+ - "\u00d9\3\2\2\2\u0532\u0533\7Z\2\2\u0533\u0534\7g\2\2\u0534\u00db\3\2\2"+ - "\2\u0535\u0536\5\u0162\u00b2\2\u0536\u00dd\3\2\2\2\u0537\u053b\5\u00e0"+ - "q\2\u0538\u053b\5\u00e8u\2\u0539\u053b\5\u00ecw\2\u053a\u0537\3\2\2\2"+ - "\u053a\u0538\3\2\2\2\u053a\u0539\3\2\2\2\u053b\u00df\3\2\2\2\u053c\u0548"+ - "\7\\\2\2\u053d\u0549\5\u00e2r\2\u053e\u0544\7h\2\2\u053f\u0540\5\u00e2"+ - "r\2\u0540\u0541\5\u0170\u00b9\2\u0541\u0543\3\2\2\2\u0542\u053f\3\2\2"+ - "\2\u0543\u0546\3\2\2\2\u0544\u0542\3\2\2\2\u0544\u0545\3\2\2\2\u0545\u0547"+ - "\3\2\2\2\u0546\u0544\3\2\2\2\u0547\u0549\7i\2\2\u0548\u053d\3\2\2\2\u0548"+ - "\u053e\3\2\2\2\u0549\u00e1\3\2\2\2\u054a\u0550\5\u00e4s\2\u054b\u054d"+ - "\5\u00c2b\2\u054c\u054b\3\2\2\2\u054c\u054d\3\2\2\2\u054d\u054e\3\2\2"+ - "\2\u054e\u054f\7n\2\2\u054f\u0551\5\u00e6t\2\u0550\u054c\3\2\2\2\u0550"+ - "\u0551\3\2\2\2\u0551\u00e3\3\2\2\2\u0552\u0557\7g\2\2\u0553\u0554\7o\2"+ - "\2\u0554\u0556\7g\2\2\u0555\u0553\3\2\2\2\u0556\u0559\3\2\2\2\u0557\u0555"+ - "\3\2\2\2\u0557\u0558\3\2\2\2\u0558\u00e5\3\2\2\2\u0559\u0557\3\2\2\2\u055a"+ - "\u055f\5\u00a4S\2\u055b\u055c\7o\2\2\u055c\u055e\5\u00a4S\2\u055d\u055b"+ + "\5`\61\2\u04c9\u04ca\7h\2\2\u04ca\u04cb\5\u0144\u00a3\2\u04cb\u04cc\5"+ + "\u0142\u00a2\2\u04cc\u04d5\3\2\2\2\u04cd\u04cf\7\35\2\2\u04ce\u04cd\3"+ + "\2\2\2\u04ce\u04cf\3\2\2\2\u04cf\u04d0\3\2\2\2\u04d0\u04d1\5`\61\2\u04d1"+ + "\u04d2\7h\2\2\u04d2\u04d3\5\u0144\u00a3\2\u04d3\u04d5\3\2\2\2\u04d4\u04c6"+ + "\3\2\2\2\u04d4\u04ce\3\2\2\2\u04d5\u00c3\3\2\2\2\u04d6\u04de\5\u012e\u0098"+ + "\2\u04d7\u04de\5\u00c6d\2\u04d8\u04de\5R*\2\u04d9\u04da\7i\2\2\u04da\u04db"+ + "\5\u00c4c\2\u04db\u04dc\7j\2\2\u04dc\u04de\3\2\2\2\u04dd\u04d6\3\2\2\2"+ + "\u04dd\u04d7\3\2\2\2\u04dd\u04d8\3\2\2\2\u04dd\u04d9\3\2\2\2\u04de\u00c5"+ + "\3\2\2\2\u04df\u04e9\5\u0130\u0099\2\u04e0\u04e9\5\u0160\u00b1\2\u04e1"+ + "\u04e9\5\u0136\u009c\2\u04e2\u04e9\5\u013e\u00a0\2\u04e3\u04e9\5\u00be"+ + "`\2\u04e4\u04e9\5\u0138\u009d\2\u04e5\u04e9\5\u013a\u009e\2\u04e6\u04e9"+ + "\5\u013c\u009f\2\u04e7\u04e9\5\u00c8e\2\u04e8\u04df\3\2\2\2\u04e8\u04e0"+ + "\3\2\2\2\u04e8\u04e1\3\2\2\2\u04e8\u04e2\3\2\2\2\u04e8\u04e3\3\2\2\2\u04e8"+ + "\u04e4\3\2\2\2\u04e8\u04e5\3\2\2\2\u04e8\u04e6\3\2\2\2\u04e8\u04e7\3\2"+ + "\2\2\u04e9\u00c7\3\2\2\2\u04ea\u04eb\7:\2\2\u04eb\u04ec\5\u00caf\2\u04ec"+ + "\u00c9\3\2\2\2\u04ed\u04f9\7i\2\2\u04ee\u04f3\5\u00c4c\2\u04ef\u04f0\7"+ + "p\2\2\u04f0\u04f2\5\u00c4c\2\u04f1\u04ef\3\2\2\2\u04f2\u04f5\3\2\2\2\u04f3"+ + "\u04f1\3\2\2\2\u04f3\u04f4\3\2\2\2\u04f4\u04f7\3\2\2\2\u04f5\u04f3\3\2"+ + "\2\2\u04f6\u04f8\7p\2\2\u04f7\u04f6\3\2\2\2\u04f7\u04f8\3\2\2\2\u04f8"+ + "\u04fa\3\2\2\2\u04f9\u04ee\3\2\2\2\u04f9\u04fa\3\2\2\2\u04fa\u04fb\3\2"+ + "\2\2\u04fb\u04fc\7j\2\2\u04fc\u00cb\3\2\2\2\u04fd\u0505\5\u0160\u00b1"+ + "\2\u04fe\u0505\5\u0130\u0099\2\u04ff\u0505\5\u00ceh\2\u0500\u0505\5\u0138"+ + "\u009d\2\u0501\u0505\5\u013a\u009e\2\u0502\u0505\5R*\2\u0503\u0505\5\u012e"+ + "\u0098\2\u0504\u04fd\3\2\2\2\u0504\u04fe\3\2\2\2\u0504\u04ff\3\2\2\2\u0504"+ + "\u0500\3\2\2\2\u0504\u0501\3\2\2\2\u0504\u0502\3\2\2\2\u0504\u0503\3\2"+ + "\2\2\u0505\u00cd\3\2\2\2\u0506\u0507\7m\2\2\u0507\u0508\7w\2\2\u0508\u0509"+ + "\7n\2\2\u0509\u050a\5\u0134\u009b\2\u050a\u00cf\3\2\2\2\u050b\u051b\7"+ + "m\2\2\u050c\u050e\5\u00d2j\2\u050d\u050c\3\2\2\2\u050d\u050e\3\2\2\2\u050e"+ + "\u050f\3\2\2\2\u050f\u0511\7r\2\2\u0510\u0512\5\u00d4k\2\u0511\u0510\3"+ + "\2\2\2\u0511\u0512\3\2\2\2\u0512\u051c\3\2\2\2\u0513\u0515\5\u00d2j\2"+ + "\u0514\u0513\3\2\2\2\u0514\u0515\3\2\2\2\u0515\u0516\3\2\2\2\u0516\u0517"+ + "\7r\2\2\u0517\u0518\5\u00d4k\2\u0518\u0519\7r\2\2\u0519\u051a\5\u00d6"+ + "l\2\u051a\u051c\3\2\2\2\u051b\u050d\3\2\2\2\u051b\u0514\3\2\2\2\u051c"+ + "\u051d\3\2\2\2\u051d\u051e\7n\2\2\u051e\u00d1\3\2\2\2\u051f\u0520\5\u00a6"+ + "T\2\u0520\u00d3\3\2\2\2\u0521\u0522\5\u00a6T\2\u0522\u00d5\3\2\2\2\u0523"+ + "\u0524\5\u00a6T\2\u0524\u00d7\3\2\2\2\u0525\u0527\t\20\2\2\u0526\u0525"+ + "\3\2\2\2\u0526\u0527\3\2\2\2\u0527\u0528\3\2\2\2\u0528\u0529\7o\2\2\u0529"+ + "\u00d9\3\2\2\2\u052a\u052b\5\u00e8u\2\u052b\u052c\7o\2\2\u052c\u0531\3"+ + "\2\2\2\u052d\u052e\5\b\5\2\u052e\u052f\7v\2\2\u052f\u0531\3\2\2\2\u0530"+ + "\u052a\3\2\2\2\u0530\u052d\3\2\2\2\u0530\u0531\3\2\2\2\u0531\u0532\3\2"+ + "\2\2\u0532\u0533\7`\2\2\u0533\u0538\5\u00a6T\2\u0534\u0536\7M\2\2\u0535"+ + "\u0537\7h\2\2\u0536\u0535\3\2\2\2\u0536\u0537\3\2\2\2\u0537\u0539\3\2"+ + "\2\2\u0538\u0534\3\2\2\2\u0538\u0539\3\2\2\2\u0539\u00db\3\2\2\2\u053a"+ + "\u053b\7[\2\2\u053b\u053c\7h\2\2\u053c\u00dd\3\2\2\2\u053d\u053e\5\u0164"+ + "\u00b3\2\u053e\u00df\3\2\2\2\u053f\u0543\5\u00e2r\2\u0540\u0543\5\u00ea"+ + "v\2\u0541\u0543\5\u00eex\2\u0542\u053f\3\2\2\2\u0542\u0540\3\2\2\2\u0542"+ + "\u0541\3\2\2\2\u0543\u00e1\3\2\2\2\u0544\u0550\7]\2\2\u0545\u0551\5\u00e4"+ + "s\2\u0546\u054c\7i\2\2\u0547\u0548\5\u00e4s\2\u0548\u0549\5\u0172\u00ba"+ + "\2\u0549\u054b\3\2\2\2\u054a\u0547\3\2\2\2\u054b\u054e\3\2\2\2\u054c\u054a"+ + "\3\2\2\2\u054c\u054d\3\2\2\2\u054d\u054f\3\2\2\2\u054e\u054c\3\2\2\2\u054f"+ + "\u0551\7j\2\2\u0550\u0545\3\2\2\2\u0550\u0546\3\2\2\2\u0551\u00e3\3\2"+ + "\2\2\u0552\u0558\5\u00e6t\2\u0553\u0555\5\u00c4c\2\u0554\u0553\3\2\2\2"+ + "\u0554\u0555\3\2\2\2\u0555\u0556\3\2\2\2\u0556\u0557\7o\2\2\u0557\u0559"+ + "\5\u00e8u\2\u0558\u0554\3\2\2\2\u0558\u0559\3\2\2\2\u0559\u00e5\3\2\2"+ + "\2\u055a\u055f\7h\2\2\u055b\u055c\7p\2\2\u055c\u055e\7h\2\2\u055d\u055b"+ "\3\2\2\2\u055e\u0561\3\2\2\2\u055f\u055d\3\2\2\2\u055f\u0560\3\2\2\2\u0560"+ - "\u00e7\3\2\2\2\u0561\u055f\3\2\2\2\u0562\u056e\7`\2\2\u0563\u056f\5\u00ea"+ - "v\2\u0564\u056a\7h\2\2\u0565\u0566\5\u00eav\2\u0566\u0567\5\u0170\u00b9"+ - "\2\u0567\u0569\3\2\2\2\u0568\u0565\3\2\2\2\u0569\u056c\3\2\2\2\u056a\u0568"+ - "\3\2\2\2\u056a\u056b\3\2\2\2\u056b\u056d\3\2\2\2\u056c\u056a\3\2\2\2\u056d"+ - "\u056f\7i\2\2\u056e\u0563\3\2\2\2\u056e\u0564\3\2\2\2\u056f\u00e9\3\2"+ - "\2\2\u0570\u0572\7g\2\2\u0571\u0573\7n\2\2\u0572\u0571\3\2\2\2\u0572\u0573"+ - "\3\2\2\2\u0573\u0574\3\2\2\2\u0574\u0575\5\u00c2b\2\u0575\u00eb\3\2\2"+ - "\2\u0576\u0582\7e\2\2\u0577\u0583\5\u0096L\2\u0578\u057e\7h\2\2\u0579"+ - "\u057a\5\u0096L\2\u057a\u057b\5\u0170\u00b9\2\u057b\u057d\3\2\2\2\u057c"+ - "\u0579\3\2\2\2\u057d\u0580\3\2\2\2\u057e\u057c\3\2\2\2\u057e\u057f\3\2"+ - "\2\2\u057f\u0581\3\2\2\2\u0580\u057e\3\2\2\2\u0581\u0583\7i\2\2\u0582"+ - "\u0577\3\2\2\2\u0582\u0578\3\2\2\2\u0583\u00ed\3\2\2\2\u0584\u0586\7j"+ - "\2\2\u0585\u0587\5\u00f0y\2\u0586\u0585\3\2\2\2\u0586\u0587\3\2\2\2\u0587"+ - "\u0588\3\2\2\2\u0588\u0589\7k\2\2\u0589\u00ef\3\2\2\2\u058a\u058c\5\u0170"+ - "\u00b9\2\u058b\u058a\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d"+ - "\u058e\5\u00a6T\2\u058e\u058f\5\u0170\u00b9\2\u058f\u0591\3\2\2\2\u0590"+ - "\u058b\3\2\2\2\u0591\u0592\3\2\2\2\u0592\u0590\3\2\2\2\u0592\u0593\3\2"+ - "\2\2\u0593\u00f1\3\2\2\2\u0594\u059a\5\u00f6|\2\u0595\u059a\5\u00f8}\2"+ - "\u0596\u059a\5\u00fa~\2\u0597\u059a\5\u00f4{\2\u0598\u059a\5\u0098M\2"+ - "\u0599\u0594\3\2\2\2\u0599\u0595\3\2\2\2\u0599\u0596\3\2\2\2\u0599\u0597"+ - "\3\2\2\2\u0599\u0598\3\2\2\2\u059a\u00f3\3\2\2\2\u059b\u059c\5\u00a4S"+ - "\2\u059c\u00f5\3\2\2\2\u059d\u059e\5\u00a4S\2\u059e\u059f\7\u008b\2\2"+ - "\u059f\u05a0\5\u00a4S\2\u05a0\u00f7\3\2\2\2\u05a1\u05a2\5\u00a4S\2\u05a2"+ - "\u05a3\t\21\2\2\u05a3\u00f9\3\2\2\2\u05a4\u05a5\5\u00e6t\2\u05a5\u05a6"+ - "\5\u00d6l\2\u05a6\u05a7\5\u00e6t\2\u05a7\u00fb\3\2\2\2\u05a8\u05a9\t\22"+ - "\2\2\u05a9\u00fd\3\2\2\2\u05aa\u05ab\7g\2\2\u05ab\u05ad\7q\2\2\u05ac\u05ae"+ - "\5\u00a6T\2\u05ad\u05ac\3\2\2\2\u05ad\u05ae\3\2\2\2\u05ae\u00ff\3\2\2"+ - "\2\u05af\u05b1\7d\2\2\u05b0\u05b2\5\u00e6t\2\u05b1\u05b0\3\2\2\2\u05b1"+ - "\u05b2\3\2\2\2\u05b2\u0101\3\2\2\2\u05b3\u05b5\7M\2\2\u05b4\u05b6\7g\2"+ - "\2\u05b5\u05b4\3\2\2\2\u05b5\u05b6\3\2\2\2\u05b6\u0103\3\2\2\2\u05b7\u05b9"+ - "\7a\2\2\u05b8\u05ba\7g\2\2\u05b9\u05b8\3\2\2\2\u05b9\u05ba\3\2\2\2\u05ba"+ - "\u0105\3\2\2\2\u05bb\u05bc\7Y\2\2\u05bc\u05bd\7g\2\2\u05bd\u0107\3\2\2"+ - "\2\u05be\u05bf\7]\2\2\u05bf\u0109\3\2\2\2\u05c0\u05c9\7^\2\2\u05c1\u05ca"+ - "\5\u00a4S\2\u05c2\u05c3\5\u0170\u00b9\2\u05c3\u05c4\5\u00a4S\2\u05c4\u05ca"+ - "\3\2\2\2\u05c5\u05c6\5\u00f2z\2\u05c6\u05c7\5\u0170\u00b9\2\u05c7\u05c8"+ - "\5\u00a4S\2\u05c8\u05ca\3\2\2\2\u05c9\u05c1\3\2\2\2\u05c9\u05c2\3\2\2"+ - "\2\u05c9\u05c5\3\2\2\2\u05ca\u05cb\3\2\2\2\u05cb\u05d1\5\u00eex\2\u05cc"+ - "\u05cf\7X\2\2\u05cd\u05d0\5\u010a\u0086\2\u05ce\u05d0\5\u00eex\2\u05cf"+ - "\u05cd\3\2\2\2\u05cf\u05ce\3\2\2\2\u05d0\u05d2\3\2\2\2\u05d1\u05cc\3\2"+ - "\2\2\u05d1\u05d2\3\2\2\2\u05d2\u010b\3\2\2\2\u05d3\u05d6\5\u010e\u0088"+ - "\2\u05d4\u05d6\5\u0114\u008b\2\u05d5\u05d3\3\2\2\2\u05d5\u05d4\3\2\2\2"+ - "\u05d6\u010d\3\2\2\2\u05d7\u05e2\7[\2\2\u05d8\u05da\5\u00a4S\2\u05d9\u05d8"+ - "\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05e3\3\2\2\2\u05db\u05dd\5\u00f2z"+ - "\2\u05dc\u05db\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\3\2\2\2\u05de\u05e0"+ - "\5\u0170\u00b9\2\u05df\u05e1\5\u00a4S\2\u05e0\u05df\3\2\2\2\u05e0\u05e1"+ - "\3\2\2\2\u05e1\u05e3\3\2\2\2\u05e2\u05d9\3\2\2\2\u05e2\u05dc\3\2\2\2\u05e3"+ - "\u05e4\3\2\2\2\u05e4\u05e8\7j\2\2\u05e5\u05e7\5\u0110\u0089\2\u05e6\u05e5"+ - "\3\2\2\2\u05e7\u05ea\3\2\2\2\u05e8\u05e6\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9"+ - "\u05eb\3\2\2\2\u05ea\u05e8\3\2\2\2\u05eb\u05ec\7k\2\2\u05ec\u010f\3\2"+ - "\2\2\u05ed\u05ee\5\u0112\u008a\2\u05ee\u05f0\7q\2\2\u05ef\u05f1\5\u00f0"+ - "y\2\u05f0\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0111\3\2\2\2\u05f2"+ - "\u05f3\7R\2\2\u05f3\u05f6\5\u00e6t\2\u05f4\u05f6\7N\2\2\u05f5\u05f2\3"+ - "\2\2\2\u05f5\u05f4\3\2\2\2\u05f6\u0113\3\2\2\2\u05f7\u0600\7[\2\2\u05f8"+ - "\u0601\5\u0116\u008c\2\u05f9\u05fa\5\u0170\u00b9\2\u05fa\u05fb\5\u0116"+ - "\u008c\2\u05fb\u0601\3\2\2\2\u05fc\u05fd\5\u00f2z\2\u05fd\u05fe\5\u0170"+ - "\u00b9\2\u05fe\u05ff\5\u0116\u008c\2\u05ff\u0601\3\2\2\2\u0600\u05f8\3"+ - "\2\2\2\u0600\u05f9\3\2\2\2\u0600\u05fc\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+ - "\u0606\7j\2\2\u0603\u0605\5\u0118\u008d\2\u0604\u0603\3\2\2\2\u0605\u0608"+ - "\3\2\2\2\u0606\u0604\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0609\3\2\2\2\u0608"+ - "\u0606\3\2\2\2\u0609\u060a\7k\2\2\u060a\u0115\3\2\2\2\u060b\u060c\7g\2"+ - "\2\u060c\u060e\7u\2\2\u060d\u060b\3\2\2\2\u060d\u060e\3\2\2\2\u060e\u060f"+ - "\3\2\2\2\u060f\u0610\5\u00b4[\2\u0610\u0611\7r\2\2\u0611\u0612\7h\2\2"+ - "\u0612\u0613\7`\2\2\u0613\u0614\7i\2\2\u0614\u0117\3\2\2\2\u0615\u0616"+ - "\5\u011a\u008e\2\u0616\u0618\7q\2\2\u0617\u0619\5\u00f0y\2\u0618\u0617"+ - "\3\2\2\2\u0618\u0619\3\2\2\2\u0619\u0119\3\2\2\2\u061a\u061b\7R\2\2\u061b"+ - "\u061e\5\u011c\u008f\2\u061c\u061e\7N\2\2\u061d\u061a\3\2\2\2\u061d\u061c"+ - "\3\2\2\2\u061e\u011b\3\2\2\2\u061f\u0622\5\u00c2b\2\u0620\u0622\7f\2\2"+ - "\u0621\u061f\3\2\2\2\u0621\u0620\3\2\2\2\u0622\u062a\3\2\2\2\u0623\u0626"+ - "\7o\2\2\u0624\u0627\5\u00c2b\2\u0625\u0627\7f\2\2\u0626\u0624\3\2\2\2"+ - "\u0626\u0625\3\2\2\2\u0627\u0629\3\2\2\2\u0628\u0623\3\2\2\2\u0629\u062c"+ - "\3\2\2\2\u062a\u0628\3\2\2\2\u062a\u062b\3\2\2\2\u062b\u011d\3\2\2\2\u062c"+ - "\u062a\3\2\2\2\u062d\u062e\7Q\2\2\u062e\u0632\7j\2\2\u062f\u0631\5\u0120"+ - "\u0091\2\u0630\u062f\3\2\2\2\u0631\u0634\3\2\2\2\u0632\u0630\3\2\2\2\u0632"+ - "\u0633\3\2\2\2\u0633\u0635\3\2\2\2\u0634\u0632\3\2\2\2\u0635\u0636\7k"+ - "\2\2\u0636\u011f\3\2\2\2\u0637\u0638\5\u0122\u0092\2\u0638\u063a\7q\2"+ - "\2\u0639\u063b\5\u00f0y\2\u063a\u0639\3\2\2\2\u063a\u063b\3\2\2\2\u063b"+ - "\u0121\3\2\2\2\u063c\u063f\7R\2\2\u063d\u0640\5\u00f6|\2\u063e\u0640\5"+ - "\u0124\u0093\2\u063f\u063d\3\2\2\2\u063f\u063e\3\2\2\2\u0640\u0643\3\2"+ - "\2\2\u0641\u0643\7N\2\2\u0642\u063c\3\2\2\2\u0642\u0641\3\2\2\2\u0643"+ - "\u0123\3\2\2\2\u0644\u0645\5\u00e6t\2\u0645\u0646\7n\2\2\u0646\u064b\3"+ - "\2\2\2\u0647\u0648\5\u00e4s\2\u0648\u0649\7u\2\2\u0649\u064b\3\2\2\2\u064a"+ - "\u0644\3\2\2\2\u064a\u0647\3\2\2\2\u064a\u064b\3\2\2\2\u064b\u064c\3\2"+ - "\2\2\u064c\u064d\5\u00a4S\2\u064d\u0125\3\2\2\2\u064e\u0652\7b\2\2\u064f"+ - "\u0653\5\u00a4S\2\u0650\u0653\5\u0128\u0095\2\u0651\u0653\5\u00d8m\2\u0652"+ - "\u064f\3\2\2\2\u0652\u0650\3\2\2\2\u0652\u0651\3\2\2\2\u0652\u0653\3\2"+ - "\2\2\u0653\u0654\3\2\2\2\u0654\u0655\5\u00eex\2\u0655\u0127\3\2\2\2\u0656"+ - "\u0658\5\u00f2z\2\u0657\u0656\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u0659"+ - "\3\2\2\2\u0659\u065b\5\u0170\u00b9\2\u065a\u065c\5\u00a4S\2\u065b\u065a"+ - "\3\2\2\2\u065b\u065c\3\2\2\2\u065c\u065d\3\2\2\2\u065d\u065f\5\u0170\u00b9"+ - "\2\u065e\u0660\5\u00f2z\2\u065f\u065e\3\2\2\2\u065f\u0660\3\2\2\2\u0660"+ - "\u0129\3\2\2\2\u0661\u0662\7T\2\2\u0662\u0663\5\u00a4S\2\u0663\u012b\3"+ - "\2\2\2\u0664\u0667\5\u0150\u00a9\2\u0665\u0667\7g\2\2\u0666\u0664\3\2"+ - "\2\2\u0666\u0665\3\2\2\2\u0667\u012d\3\2\2\2\u0668\u0669\7l\2\2\u0669"+ - "\u066a\5\u0130\u0099\2\u066a\u066b\7m\2\2\u066b\u066c\5\u0132\u009a\2"+ - "\u066c\u012f\3\2\2\2\u066d\u066e\5\u00a4S\2\u066e\u0131\3\2\2\2\u066f"+ - "\u0670\5\u00c2b\2\u0670\u0133\3\2\2\2\u0671\u0672\7\u0089\2\2\u0672\u0673"+ - "\5\u00c2b\2\u0673\u0135\3\2\2\2\u0674\u0675\7l\2\2\u0675\u0676\7m\2\2"+ - "\u0676\u0677\5\u0132\u009a\2\u0677\u0137\3\2\2\2\u0678\u0679\7U\2\2\u0679"+ - "\u067a\7l\2\2\u067a\u067b\5\u00c2b\2\u067b\u067c\7m\2\2\u067c\u067d\5"+ - "\u0132\u009a\2\u067d\u0139\3\2\2\2\u067e\u0684\7W\2\2\u067f\u0680\7W\2"+ - "\2\u0680\u0684\7\u008b\2\2\u0681\u0682\7\u008b\2\2\u0682\u0684\7W\2\2"+ - "\u0683\u067e\3\2\2\2\u0683\u067f\3\2\2\2\u0683\u0681\3\2\2\2\u0684\u0685"+ - "\3\2\2\2\u0685\u0686\5\u0132\u009a\2\u0686\u013b\3\2\2\2\u0687\u0688\7"+ - "O\2\2\u0688\u0689\5\u013e\u00a0\2\u0689\u013d\3\2\2\2\u068a\u068b\5\u0142"+ - "\u00a2\2\u068b\u068c\5\u0140\u00a1\2\u068c\u068f\3\2\2\2\u068d\u068f\5"+ - "\u0142\u00a2\2\u068e\u068a\3\2\2\2\u068e\u068d\3\2\2\2\u068f\u013f\3\2"+ - "\2\2\u0690\u0693\5\u0142\u00a2\2\u0691\u0693\5\u00c2b\2\u0692\u0690\3"+ - "\2\2\2\u0692\u0691\3\2\2\2\u0693\u0141\3\2\2\2\u0694\u06a0\7h\2\2\u0695"+ - "\u069a\5\u009cO\2\u0696\u0697\7o\2\2\u0697\u0699\5\u009cO\2\u0698\u0696"+ - "\3\2\2\2\u0699\u069c\3\2\2\2\u069a\u0698\3\2\2\2\u069a\u069b\3\2\2\2\u069b"+ - "\u069e\3\2\2\2\u069c\u069a\3\2\2\2\u069d\u069f\7o\2\2\u069e\u069d\3\2"+ - "\2\2\u069e\u069f\3\2\2\2\u069f\u06a1\3\2\2\2\u06a0\u0695\3\2\2\2\u06a0"+ - "\u06a1\3\2\2\2\u06a1\u06a2\3\2\2\2\u06a2\u06a3\7i\2\2\u06a3\u0143\3\2"+ - "\2\2\u06a4\u06a5\5\u0146\u00a4\2\u06a5\u06a6\7h\2\2\u06a6\u06a8\5\u00a4"+ - "S\2\u06a7\u06a9\7o\2\2\u06a8\u06a7\3\2\2\2\u06a8\u06a9\3\2\2\2\u06a9\u06aa"+ - "\3\2\2\2\u06aa\u06ab\7i\2\2\u06ab\u0145\3\2\2\2\u06ac\u06b2\5\u00c4c\2"+ - "\u06ad\u06ae\7h\2\2\u06ae\u06af\5\u0146\u00a4\2\u06af\u06b0\7i\2\2\u06b0"+ - "\u06b2\3\2\2\2\u06b1\u06ac\3\2\2\2\u06b1\u06ad\3\2\2\2\u06b2\u0147\3\2"+ - "\2\2\u06b3\u06ba\5\u014a\u00a6\2\u06b4\u06ba\5\u014e\u00a8\2\u06b5\u06b6"+ - "\7h\2\2\u06b6\u06b7\5\u00a4S\2\u06b7\u06b8\7i\2\2\u06b8\u06ba\3\2\2\2"+ - "\u06b9\u06b3\3\2\2\2\u06b9\u06b4\3\2\2\2\u06b9\u06b5\3\2\2\2\u06ba\u0149"+ - "\3\2\2\2\u06bb\u06bf\5\u00b2Z\2\u06bc\u06bf\5\u0152\u00aa\2\u06bd\u06bf"+ - "\5\u00b6\\\2\u06be\u06bb\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2"+ - "\2\u06bf\u014b\3\2\2\2\u06c0\u06c1\t\23\2\2\u06c1\u014d\3\2\2\2\u06c2"+ - "\u06c3\7g\2\2\u06c3\u014f\3\2\2\2\u06c4\u06c5\7g\2\2\u06c5\u06c6\7r\2"+ - "\2\u06c6\u06c7\7g\2\2\u06c7\u0151\3\2\2\2\u06c8\u06c9\5\u00caf\2\u06c9"+ - "\u06ca\5\u0154\u00ab\2\u06ca\u0153\3\2\2\2\u06cb\u06d0\7j\2\2\u06cc\u06ce"+ - "\5\u0156\u00ac\2\u06cd\u06cf\7o\2\2\u06ce\u06cd\3\2\2\2\u06ce\u06cf\3"+ - "\2\2\2\u06cf\u06d1\3\2\2\2\u06d0\u06cc\3\2\2\2\u06d0\u06d1\3\2\2\2\u06d1"+ - "\u06d2\3\2\2\2\u06d2\u06d3\7k\2\2\u06d3\u0155\3\2\2\2\u06d4\u06d9\5\u0158"+ - "\u00ad\2\u06d5\u06d6\7o\2\2\u06d6\u06d8\5\u0158\u00ad\2\u06d7\u06d5\3"+ - "\2\2\2\u06d8\u06db\3\2\2\2\u06d9\u06d7\3\2\2\2\u06d9\u06da\3\2\2\2\u06da"+ - "\u0157\3\2\2\2\u06db\u06d9\3\2\2\2\u06dc\u06dd\5\u015a\u00ae\2\u06dd\u06de"+ - "\7q\2\2\u06de\u06e0\3\2\2\2\u06df\u06dc\3\2\2\2\u06df\u06e0\3\2\2\2\u06e0"+ - "\u06e1\3\2\2\2\u06e1\u06e2\5\u015c\u00af\2\u06e2\u0159\3\2\2\2\u06e3\u06e6"+ - "\5\u00a4S\2\u06e4\u06e6\5\u0154\u00ab\2\u06e5\u06e3\3\2\2\2\u06e5\u06e4"+ - "\3\2\2\2\u06e6\u015b\3\2\2\2\u06e7\u06ea\5\u00a4S\2\u06e8\u06ea\5\u0154"+ - "\u00ab\2\u06e9\u06e7\3\2\2\2\u06e9\u06e8\3\2\2\2\u06ea\u015d\3\2\2\2\u06eb"+ - "\u06ec\7V\2\2\u06ec\u06f2\7j\2\2\u06ed\u06ee\5\u0160\u00b1\2\u06ee\u06ef"+ - "\5\u0170\u00b9\2\u06ef\u06f1\3\2\2\2\u06f0\u06ed\3\2\2\2\u06f1\u06f4\3"+ - "\2\2\2\u06f2\u06f0\3\2\2\2\u06f2\u06f3\3\2\2\2\u06f3\u06f5\3\2\2\2\u06f4"+ - "\u06f2\3\2\2\2\u06f5\u06f6\7k\2\2\u06f6\u015f\3\2\2\2\u06f7\u06f8\5\u00e4"+ - "s\2\u06f8\u06f9\5\u00c2b\2\u06f9\u06fc\3\2\2\2\u06fa\u06fc\5\u0164\u00b3"+ - "\2\u06fb\u06f7\3\2\2\2\u06fb\u06fa\3\2\2\2\u06fc\u06fe\3\2\2\2\u06fd\u06ff"+ - "\5\u0162\u00b2\2\u06fe\u06fd\3\2\2\2\u06fe\u06ff\3\2\2\2\u06ff\u0161\3"+ - "\2\2\2\u0700\u0701\t\24\2\2\u0701\u0163\3\2\2\2\u0702\u0704\7\u0089\2"+ - "\2\u0703\u0702\3\2\2\2\u0703\u0704\3\2\2\2\u0704\u0705\3\2\2\2\u0705\u0706"+ - "\5\u012c\u0097\2\u0706\u0165\3\2\2\2\u0707\u0708\7l\2\2\u0708\u0709\5"+ - "\u00a4S\2\u0709\u070a\7m\2\2\u070a\u0167\3\2\2\2\u070b\u070c\7r\2\2\u070c"+ - "\u070d\7h\2\2\u070d\u070e\5\u00c2b\2\u070e\u070f\7i\2\2\u070f\u0169\3"+ - "\2\2\2\u0710\u071f\7h\2\2\u0711\u0718\5\u00e6t\2\u0712\u0715\5\u0146\u00a4"+ - "\2\u0713\u0714\7o\2\2\u0714\u0716\5\u00e6t\2\u0715\u0713\3\2\2\2\u0715"+ - "\u0716\3\2\2\2\u0716\u0718\3\2\2\2\u0717\u0711\3\2\2\2\u0717\u0712\3\2"+ - "\2\2\u0718\u071a\3\2\2\2\u0719\u071b\7v\2\2\u071a\u0719\3\2\2\2\u071a"+ - "\u071b\3\2\2\2\u071b\u071d\3\2\2\2\u071c\u071e\7o\2\2\u071d\u071c\3\2"+ - "\2\2\u071d\u071e\3\2\2\2\u071e\u0720\3\2\2\2\u071f\u0717\3\2\2\2\u071f"+ - "\u0720\3\2\2\2\u0720\u0721\3\2\2\2\u0721\u0722\7i\2\2\u0722\u016b\3\2"+ - "\2\2\u0723\u0724\5\u0146\u00a4\2\u0724\u0725\7r\2\2\u0725\u0726\7g\2\2"+ - "\u0726\u016d\3\2\2\2\u0727\u0728\5\u00c2b\2\u0728\u016f\3\2\2\2\u0729"+ - "\u072e\7p\2\2\u072a\u072e\7\2\2\3\u072b\u072e\7\u00a1\2\2\u072c\u072e"+ - "\6\u00b9\24\2\u072d\u0729\3\2\2\2\u072d\u072a\3\2\2\2\u072d\u072b\3\2"+ - "\2\2\u072d\u072c\3\2\2\2\u072e\u0171\3\2\2\2\u00bd\u0180\u0185\u018c\u0196"+ - "\u019c\u01a2\u01b2\u01b6\u01bf\u01cb\u01cf\u01d5\u01de\u01e8\u01f9\u0207"+ - "\u020b\u0212\u021a\u0223\u0243\u024b\u0263\u0276\u0285\u0292\u029b\u02a9"+ - "\u02b2\u02be\u02d3\u02da\u02df\u02e4\u02ee\u02f1\u02f5\u02f9\u0301\u0309"+ - "\u030e\u0316\u0318\u031d\u0324\u032c\u032f\u0335\u033a\u033c\u033f\u0346"+ - "\u034b\u035e\u0366\u036a\u036d\u0373\u0377\u037a\u0384\u038b\u0392\u039e"+ - "\u03a4\u03ab\u03b0\u03b6\u03c2\u03c8\u03cc\u03d4\u03d8\u03de\u03e1\u03e7"+ - "\u03ec\u0405\u0428\u042a\u0441\u0449\u0454\u045b\u0462\u046c\u047a\u0490"+ - "\u0492\u049a\u049e\u04a2\u04a5\u04ae\u04b4\u04be\u04c6\u04cc\u04d5\u04e0"+ - "\u04eb\u04ef\u04f1\u04fc\u0505\u0509\u050c\u0513\u051e\u0528\u052e\u0530"+ - "\u053a\u0544\u0548\u054c\u0550\u0557\u055f\u056a\u056e\u0572\u057e\u0582"+ - "\u0586\u058b\u0592\u0599\u05ad\u05b1\u05b5\u05b9\u05c9\u05cf\u05d1\u05d5"+ - "\u05d9\u05dc\u05e0\u05e2\u05e8\u05f0\u05f5\u0600\u0606\u060d\u0618\u061d"+ - "\u0621\u0626\u062a\u0632\u063a\u063f\u0642\u064a\u0652\u0657\u065b\u065f"+ - "\u0666\u0683\u068e\u0692\u069a\u069e\u06a0\u06a8\u06b1\u06b9\u06be\u06ce"+ - "\u06d0\u06d9\u06df\u06e5\u06e9\u06f2\u06fb\u06fe\u0703\u0715\u0717\u071a"+ - "\u071d\u071f\u072d"; + "\u00e7\3\2\2\2\u0561\u055f\3\2\2\2\u0562\u0567\5\u00a6T\2\u0563\u0564"+ + "\7p\2\2\u0564\u0566\5\u00a6T\2\u0565\u0563\3\2\2\2\u0566\u0569\3\2\2\2"+ + "\u0567\u0565\3\2\2\2\u0567\u0568\3\2\2\2\u0568\u00e9\3\2\2\2\u0569\u0567"+ + "\3\2\2\2\u056a\u0576\7a\2\2\u056b\u0577\5\u00ecw\2\u056c\u0572\7i\2\2"+ + "\u056d\u056e\5\u00ecw\2\u056e\u056f\5\u0172\u00ba\2\u056f\u0571\3\2\2"+ + "\2\u0570\u056d\3\2\2\2\u0571\u0574\3\2\2\2\u0572\u0570\3\2\2\2\u0572\u0573"+ + "\3\2\2\2\u0573\u0575\3\2\2\2\u0574\u0572\3\2\2\2\u0575\u0577\7j\2\2\u0576"+ + "\u056b\3\2\2\2\u0576\u056c\3\2\2\2\u0577\u00eb\3\2\2\2\u0578\u057a\7h"+ + "\2\2\u0579\u057b\7o\2\2\u057a\u0579\3\2\2\2\u057a\u057b\3\2\2\2\u057b"+ + "\u057c\3\2\2\2\u057c\u057d\5\u00c4c\2\u057d\u00ed\3\2\2\2\u057e\u058a"+ + "\7f\2\2\u057f\u058b\5\u0098M\2\u0580\u0586\7i\2\2\u0581\u0582\5\u0098"+ + "M\2\u0582\u0583\5\u0172\u00ba\2\u0583\u0585\3\2\2\2\u0584\u0581\3\2\2"+ + "\2\u0585\u0588\3\2\2\2\u0586\u0584\3\2\2\2\u0586\u0587\3\2\2\2\u0587\u0589"+ + "\3\2\2\2\u0588\u0586\3\2\2\2\u0589\u058b\7j\2\2\u058a\u057f\3\2\2\2\u058a"+ + "\u0580\3\2\2\2\u058b\u00ef\3\2\2\2\u058c\u058e\7k\2\2\u058d\u058f\5\u00f2"+ + "z\2\u058e\u058d\3\2\2\2\u058e\u058f\3\2\2\2\u058f\u0590\3\2\2\2\u0590"+ + "\u0591\7l\2\2\u0591\u00f1\3\2\2\2\u0592\u0594\5\u0172\u00ba\2\u0593\u0592"+ + "\3\2\2\2\u0593\u0594\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\5\u00a8U"+ + "\2\u0596\u0597\5\u0172\u00ba\2\u0597\u0599\3\2\2\2\u0598\u0593\3\2\2\2"+ + "\u0599\u059a\3\2\2\2\u059a\u0598\3\2\2\2\u059a\u059b\3\2\2\2\u059b\u00f3"+ + "\3\2\2\2\u059c\u05a2\5\u00f8}\2\u059d\u05a2\5\u00fa~\2\u059e\u05a2\5\u00fc"+ + "\177\2\u059f\u05a2\5\u00f6|\2\u05a0\u05a2\5\u009aN\2\u05a1\u059c\3\2\2"+ + "\2\u05a1\u059d\3\2\2\2\u05a1\u059e\3\2\2\2\u05a1\u059f\3\2\2\2\u05a1\u05a0"+ + "\3\2\2\2\u05a2\u00f5\3\2\2\2\u05a3\u05a4\5\u00a6T\2\u05a4\u00f7\3\2\2"+ + "\2\u05a5\u05a6\5\u00a6T\2\u05a6\u05a7\7\u008c\2\2\u05a7\u05a8\5\u00a6"+ + "T\2\u05a8\u00f9\3\2\2\2\u05a9\u05aa\5\u00a6T\2\u05aa\u05ab\t\21\2\2\u05ab"+ + "\u00fb\3\2\2\2\u05ac\u05ad\5\u00e8u\2\u05ad\u05ae\5\u00d8m\2\u05ae\u05af"+ + "\5\u00e8u\2\u05af\u00fd\3\2\2\2\u05b0\u05b1\t\22\2\2\u05b1\u00ff\3\2\2"+ + "\2\u05b2\u05b3\7h\2\2\u05b3\u05b5\7r\2\2\u05b4\u05b6\5\u00a8U\2\u05b5"+ + "\u05b4\3\2\2\2\u05b5\u05b6\3\2\2\2\u05b6\u0101\3\2\2\2\u05b7\u05b9\7e"+ + "\2\2\u05b8\u05ba\5\u00e8u\2\u05b9\u05b8\3\2\2\2\u05b9\u05ba\3\2\2\2\u05ba"+ + "\u0103\3\2\2\2\u05bb\u05bd\7N\2\2\u05bc\u05be\7h\2\2\u05bd\u05bc\3\2\2"+ + "\2\u05bd\u05be\3\2\2\2\u05be\u0105\3\2\2\2\u05bf\u05c1\7b\2\2\u05c0\u05c2"+ + "\7h\2\2\u05c1\u05c0\3\2\2\2\u05c1\u05c2\3\2\2\2\u05c2\u0107\3\2\2\2\u05c3"+ + "\u05c4\7Z\2\2\u05c4\u05c5\7h\2\2\u05c5\u0109\3\2\2\2\u05c6\u05c7\7^\2"+ + "\2\u05c7\u010b\3\2\2\2\u05c8\u05d1\7_\2\2\u05c9\u05d2\5\u00a6T\2\u05ca"+ + "\u05cb\5\u0172\u00ba\2\u05cb\u05cc\5\u00a6T\2\u05cc\u05d2\3\2\2\2\u05cd"+ + "\u05ce\5\u00f4{\2\u05ce\u05cf\5\u0172\u00ba\2\u05cf\u05d0\5\u00a6T\2\u05d0"+ + "\u05d2\3\2\2\2\u05d1\u05c9\3\2\2\2\u05d1\u05ca\3\2\2\2\u05d1\u05cd\3\2"+ + "\2\2\u05d2\u05d3\3\2\2\2\u05d3\u05d9\5\u00f0y\2\u05d4\u05d7\7Y\2\2\u05d5"+ + "\u05d8\5\u010c\u0087\2\u05d6\u05d8\5\u00f0y\2\u05d7\u05d5\3\2\2\2\u05d7"+ + "\u05d6\3\2\2\2\u05d8\u05da\3\2\2\2\u05d9\u05d4\3\2\2\2\u05d9\u05da\3\2"+ + "\2\2\u05da\u010d\3\2\2\2\u05db\u05de\5\u0110\u0089\2\u05dc\u05de\5\u0116"+ + "\u008c\2\u05dd\u05db\3\2\2\2\u05dd\u05dc\3\2\2\2\u05de\u010f\3\2\2\2\u05df"+ + "\u05ea\7\\\2\2\u05e0\u05e2\5\u00a6T\2\u05e1\u05e0\3\2\2\2\u05e1\u05e2"+ + "\3\2\2\2\u05e2\u05eb\3\2\2\2\u05e3\u05e5\5\u00f4{\2\u05e4\u05e3\3\2\2"+ + "\2\u05e4\u05e5\3\2\2\2\u05e5\u05e6\3\2\2\2\u05e6\u05e8\5\u0172\u00ba\2"+ + "\u05e7\u05e9\5\u00a6T\2\u05e8\u05e7\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9"+ + "\u05eb\3\2\2\2\u05ea\u05e1\3\2\2\2\u05ea\u05e4\3\2\2\2\u05eb\u05ec\3\2"+ + "\2\2\u05ec\u05f0\7k\2\2\u05ed\u05ef\5\u0112\u008a\2\u05ee\u05ed\3\2\2"+ + "\2\u05ef\u05f2\3\2\2\2\u05f0\u05ee\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u05f3"+ + "\3\2\2\2\u05f2\u05f0\3\2\2\2\u05f3\u05f4\7l\2\2\u05f4\u0111\3\2\2\2\u05f5"+ + "\u05f6\5\u0114\u008b\2\u05f6\u05f8\7r\2\2\u05f7\u05f9\5\u00f2z\2\u05f8"+ + "\u05f7\3\2\2\2\u05f8\u05f9\3\2\2\2\u05f9\u0113\3\2\2\2\u05fa\u05fb\7S"+ + "\2\2\u05fb\u05fe\5\u00e8u\2\u05fc\u05fe\7O\2\2\u05fd\u05fa\3\2\2\2\u05fd"+ + "\u05fc\3\2\2\2\u05fe\u0115\3\2\2\2\u05ff\u0608\7\\\2\2\u0600\u0609\5\u0118"+ + "\u008d\2\u0601\u0602\5\u0172\u00ba\2\u0602\u0603\5\u0118\u008d\2\u0603"+ + "\u0609\3\2\2\2\u0604\u0605\5\u00f4{\2\u0605\u0606\5\u0172\u00ba\2\u0606"+ + "\u0607\5\u0118\u008d\2\u0607\u0609\3\2\2\2\u0608\u0600\3\2\2\2\u0608\u0601"+ + "\3\2\2\2\u0608\u0604\3\2\2\2\u0609\u060a\3\2\2\2\u060a\u060e\7k\2\2\u060b"+ + "\u060d\5\u011a\u008e\2\u060c\u060b\3\2\2\2\u060d\u0610\3\2\2\2\u060e\u060c"+ + "\3\2\2\2\u060e\u060f\3\2\2\2\u060f\u0611\3\2\2\2\u0610\u060e\3\2\2\2\u0611"+ + "\u0612\7l\2\2\u0612\u0117\3\2\2\2\u0613\u0614\7h\2\2\u0614\u0616\7v\2"+ + "\2\u0615\u0613\3\2\2\2\u0615\u0616\3\2\2\2\u0616\u0617\3\2\2\2\u0617\u0618"+ + "\5\u00b6\\\2\u0618\u0619\7s\2\2\u0619\u061a\7i\2\2\u061a\u061b\7a\2\2"+ + "\u061b\u061c\7j\2\2\u061c\u0119\3\2\2\2\u061d\u061e\5\u011c\u008f\2\u061e"+ + "\u0620\7r\2\2\u061f\u0621\5\u00f2z\2\u0620\u061f\3\2\2\2\u0620\u0621\3"+ + "\2\2\2\u0621\u011b\3\2\2\2\u0622\u0623\7S\2\2\u0623\u0626\5\u011e\u0090"+ + "\2\u0624\u0626\7O\2\2\u0625\u0622\3\2\2\2\u0625\u0624\3\2\2\2\u0626\u011d"+ + "\3\2\2\2\u0627\u062a\5\u00c4c\2\u0628\u062a\7g\2\2\u0629\u0627\3\2\2\2"+ + "\u0629\u0628\3\2\2\2\u062a\u0632\3\2\2\2\u062b\u062e\7p\2\2\u062c\u062f"+ + "\5\u00c4c\2\u062d\u062f\7g\2\2\u062e\u062c\3\2\2\2\u062e\u062d\3\2\2\2"+ + "\u062f\u0631\3\2\2\2\u0630\u062b\3\2\2\2\u0631\u0634\3\2\2\2\u0632\u0630"+ + "\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u011f\3\2\2\2\u0634\u0632\3\2\2\2\u0635"+ + "\u0636\7R\2\2\u0636\u063a\7k\2\2\u0637\u0639\5\u0122\u0092\2\u0638\u0637"+ + "\3\2\2\2\u0639\u063c\3\2\2\2\u063a\u0638\3\2\2\2\u063a\u063b\3\2\2\2\u063b"+ + "\u063d\3\2\2\2\u063c\u063a\3\2\2\2\u063d\u063e\7l\2\2\u063e\u0121\3\2"+ + "\2\2\u063f\u0640\5\u0124\u0093\2\u0640\u0642\7r\2\2\u0641\u0643\5\u00f2"+ + "z\2\u0642\u0641\3\2\2\2\u0642\u0643\3\2\2\2\u0643\u0123\3\2\2\2\u0644"+ + "\u0647\7S\2\2\u0645\u0648\5\u00f8}\2\u0646\u0648\5\u0126\u0094\2\u0647"+ + "\u0645\3\2\2\2\u0647\u0646\3\2\2\2\u0648\u064b\3\2\2\2\u0649\u064b\7O"+ + "\2\2\u064a\u0644\3\2\2\2\u064a\u0649\3\2\2\2\u064b\u0125\3\2\2\2\u064c"+ + "\u064d\5\u00e8u\2\u064d\u064e\7o\2\2\u064e\u0653\3\2\2\2\u064f\u0650\5"+ + "\u00e6t\2\u0650\u0651\7v\2\2\u0651\u0653\3\2\2\2\u0652\u064c\3\2\2\2\u0652"+ + "\u064f\3\2\2\2\u0652\u0653\3\2\2\2\u0653\u0654\3\2\2\2\u0654\u0655\5\u00a6"+ + "T\2\u0655\u0127\3\2\2\2\u0656\u065a\7c\2\2\u0657\u065b\5\u00a6T\2\u0658"+ + "\u065b\5\u012a\u0096\2\u0659\u065b\5\u00dan\2\u065a\u0657\3\2\2\2\u065a"+ + "\u0658\3\2\2\2\u065a\u0659\3\2\2\2\u065a\u065b\3\2\2\2\u065b\u065c\3\2"+ + "\2\2\u065c\u065d\5\u00f0y\2\u065d\u0129\3\2\2\2\u065e\u0660\5\u00f4{\2"+ + "\u065f\u065e\3\2\2\2\u065f\u0660\3\2\2\2\u0660\u0661\3\2\2\2\u0661\u0663"+ + "\5\u0172\u00ba\2\u0662\u0664\5\u00a6T\2\u0663\u0662\3\2\2\2\u0663\u0664"+ + "\3\2\2\2\u0664\u0665\3\2\2\2\u0665\u0667\5\u0172\u00ba\2\u0666\u0668\5"+ + "\u00f4{\2\u0667\u0666\3\2\2\2\u0667\u0668\3\2\2\2\u0668\u012b\3\2\2\2"+ + "\u0669\u066a\7U\2\2\u066a\u066b\5\u00a6T\2\u066b\u012d\3\2\2\2\u066c\u066f"+ + "\5\u0152\u00aa\2\u066d\u066f\7h\2\2\u066e\u066c\3\2\2\2\u066e\u066d\3"+ + "\2\2\2\u066f\u012f\3\2\2\2\u0670\u0671\7m\2\2\u0671\u0672\5\u0132\u009a"+ + "\2\u0672\u0673\7n\2\2\u0673\u0674\5\u0134\u009b\2\u0674\u0131\3\2\2\2"+ + "\u0675\u0676\5\u00a6T\2\u0676\u0133\3\2\2\2\u0677\u0678\5\u00c4c\2\u0678"+ + "\u0135\3\2\2\2\u0679\u067a\7\u008a\2\2\u067a\u067b\5\u00c4c\2\u067b\u0137"+ + "\3\2\2\2\u067c\u067d\7m\2\2\u067d\u067e\7n\2\2\u067e\u067f\5\u0134\u009b"+ + "\2\u067f\u0139\3\2\2\2\u0680\u0681\7V\2\2\u0681\u0682\7m\2\2\u0682\u0683"+ + "\5\u00c4c\2\u0683\u0684\7n\2\2\u0684\u0685\5\u0134\u009b\2\u0685\u013b"+ + "\3\2\2\2\u0686\u068c\7X\2\2\u0687\u0688\7X\2\2\u0688\u068c\7\u008c\2\2"+ + "\u0689\u068a\7\u008c\2\2\u068a\u068c\7X\2\2\u068b\u0686\3\2\2\2\u068b"+ + "\u0687\3\2\2\2\u068b\u0689\3\2\2\2\u068c\u068d\3\2\2\2\u068d\u068e\5\u0134"+ + "\u009b\2\u068e\u013d\3\2\2\2\u068f\u0690\7P\2\2\u0690\u0691\5\u0140\u00a1"+ + "\2\u0691\u013f\3\2\2\2\u0692\u0693\5\u0144\u00a3\2\u0693\u0694\5\u0142"+ + "\u00a2\2\u0694\u0697\3\2\2\2\u0695\u0697\5\u0144\u00a3\2\u0696\u0692\3"+ + "\2\2\2\u0696\u0695\3\2\2\2\u0697\u0141\3\2\2\2\u0698\u069b\5\u0144\u00a3"+ + "\2\u0699\u069b\5\u00c4c\2\u069a\u0698\3\2\2\2\u069a\u0699\3\2\2\2\u069b"+ + "\u0143\3\2\2\2\u069c\u06a8\7i\2\2\u069d\u06a2\5\u009eP\2\u069e\u069f\7"+ + "p\2\2\u069f\u06a1\5\u009eP\2\u06a0\u069e\3\2\2\2\u06a1\u06a4\3\2\2\2\u06a2"+ + "\u06a0\3\2\2\2\u06a2\u06a3\3\2\2\2\u06a3\u06a6\3\2\2\2\u06a4\u06a2\3\2"+ + "\2\2\u06a5\u06a7\7p\2\2\u06a6\u06a5\3\2\2\2\u06a6\u06a7\3\2\2\2\u06a7"+ + "\u06a9\3\2\2\2\u06a8\u069d\3\2\2\2\u06a8\u06a9\3\2\2\2\u06a9\u06aa\3\2"+ + "\2\2\u06aa\u06ab\7j\2\2\u06ab\u0145\3\2\2\2\u06ac\u06ad\5\u0148\u00a5"+ + "\2\u06ad\u06ae\7i\2\2\u06ae\u06b0\5\u00a6T\2\u06af\u06b1\7p\2\2\u06b0"+ + "\u06af\3\2\2\2\u06b0\u06b1\3\2\2\2\u06b1\u06b2\3\2\2\2\u06b2\u06b3\7j"+ + "\2\2\u06b3\u0147\3\2\2\2\u06b4\u06ba\5\u00c6d\2\u06b5\u06b6\7i\2\2\u06b6"+ + "\u06b7\5\u0148\u00a5\2\u06b7\u06b8\7j\2\2\u06b8\u06ba\3\2\2\2\u06b9\u06b4"+ + "\3\2\2\2\u06b9\u06b5\3\2\2\2\u06ba\u0149\3\2\2\2\u06bb\u06c2\5\u014c\u00a7"+ + "\2\u06bc\u06c2\5\u0150\u00a9\2\u06bd\u06be\7i\2\2\u06be\u06bf\5\u00a6"+ + "T\2\u06bf\u06c0\7j\2\2\u06c0\u06c2\3\2\2\2\u06c1\u06bb\3\2\2\2\u06c1\u06bc"+ + "\3\2\2\2\u06c1\u06bd\3\2\2\2\u06c2\u014b\3\2\2\2\u06c3\u06c7\5\u00b4["+ + "\2\u06c4\u06c7\5\u0154\u00ab\2\u06c5\u06c7\5\u00b8]\2\u06c6\u06c3\3\2"+ + "\2\2\u06c6\u06c4\3\2\2\2\u06c6\u06c5\3\2\2\2\u06c7\u014d\3\2\2\2\u06c8"+ + "\u06c9\t\23\2\2\u06c9\u014f\3\2\2\2\u06ca\u06cb\7h\2\2\u06cb\u0151\3\2"+ + "\2\2\u06cc\u06cd\7h\2\2\u06cd\u06ce\7s\2\2\u06ce\u06cf\7h\2\2\u06cf\u0153"+ + "\3\2\2\2\u06d0\u06d1\5\u00ccg\2\u06d1\u06d2\5\u0156\u00ac\2\u06d2\u0155"+ + "\3\2\2\2\u06d3\u06d8\7k\2\2\u06d4\u06d6\5\u0158\u00ad\2\u06d5\u06d7\7"+ + "p\2\2\u06d6\u06d5\3\2\2\2\u06d6\u06d7\3\2\2\2\u06d7\u06d9\3\2\2\2\u06d8"+ + "\u06d4\3\2\2\2\u06d8\u06d9\3\2\2\2\u06d9\u06da\3\2\2\2\u06da\u06db\7l"+ + "\2\2\u06db\u0157\3\2\2\2\u06dc\u06e1\5\u015a\u00ae\2\u06dd\u06de\7p\2"+ + "\2\u06de\u06e0\5\u015a\u00ae\2\u06df\u06dd\3\2\2\2\u06e0\u06e3\3\2\2\2"+ + "\u06e1\u06df\3\2\2\2\u06e1\u06e2\3\2\2\2\u06e2\u0159\3\2\2\2\u06e3\u06e1"+ + "\3\2\2\2\u06e4\u06e5\5\u015c\u00af\2\u06e5\u06e6\7r\2\2\u06e6\u06e8\3"+ + "\2\2\2\u06e7\u06e4\3\2\2\2\u06e7\u06e8\3\2\2\2\u06e8\u06e9\3\2\2\2\u06e9"+ + "\u06ea\5\u015e\u00b0\2\u06ea\u015b\3\2\2\2\u06eb\u06ee\5\u00a6T\2\u06ec"+ + "\u06ee\5\u0156\u00ac\2\u06ed\u06eb\3\2\2\2\u06ed\u06ec\3\2\2\2\u06ee\u015d"+ + "\3\2\2\2\u06ef\u06f2\5\u00a6T\2\u06f0\u06f2\5\u0156\u00ac\2\u06f1\u06ef"+ + "\3\2\2\2\u06f1\u06f0\3\2\2\2\u06f2\u015f\3\2\2\2\u06f3\u06f4\7W\2\2\u06f4"+ + "\u06fa\7k\2\2\u06f5\u06f6\5\u0162\u00b2\2\u06f6\u06f7\5\u0172\u00ba\2"+ + "\u06f7\u06f9\3\2\2\2\u06f8\u06f5\3\2\2\2\u06f9\u06fc\3\2\2\2\u06fa\u06f8"+ + "\3\2\2\2\u06fa\u06fb\3\2\2\2\u06fb\u06fd\3\2\2\2\u06fc\u06fa\3\2\2\2\u06fd"+ + "\u06fe\7l\2\2\u06fe\u0161\3\2\2\2\u06ff\u0700\5\u00e6t\2\u0700\u0701\5"+ + "\u00c4c\2\u0701\u0704\3\2\2\2\u0702\u0704\5\u0166\u00b4\2\u0703\u06ff"+ + "\3\2\2\2\u0703\u0702\3\2\2\2\u0704\u0706\3\2\2\2\u0705\u0707\5\u0164\u00b3"+ + "\2\u0706\u0705\3\2\2\2\u0706\u0707\3\2\2\2\u0707\u0163\3\2\2\2\u0708\u0709"+ + "\t\24\2\2\u0709\u0165\3\2\2\2\u070a\u070c\7\u008a\2\2\u070b\u070a\3\2"+ + "\2\2\u070b\u070c\3\2\2\2\u070c\u070d\3\2\2\2\u070d\u070e\5\u012e\u0098"+ + "\2\u070e\u0167\3\2\2\2\u070f\u0710\7m\2\2\u0710\u0711\5\u00a6T\2\u0711"+ + "\u0712\7n\2\2\u0712\u0169\3\2\2\2\u0713\u0714\7s\2\2\u0714\u0715\7i\2"+ + "\2\u0715\u0716\5\u00c4c\2\u0716\u0717\7j\2\2\u0717\u016b\3\2\2\2\u0718"+ + "\u0727\7i\2\2\u0719\u0720\5\u00e8u\2\u071a\u071d\5\u0148\u00a5\2\u071b"+ + "\u071c\7p\2\2\u071c\u071e\5\u00e8u\2\u071d\u071b\3\2\2\2\u071d\u071e\3"+ + "\2\2\2\u071e\u0720\3\2\2\2\u071f\u0719\3\2\2\2\u071f\u071a\3\2\2\2\u0720"+ + "\u0722\3\2\2\2\u0721\u0723\7w\2\2\u0722\u0721\3\2\2\2\u0722\u0723\3\2"+ + "\2\2\u0723\u0725\3\2\2\2\u0724\u0726\7p\2\2\u0725\u0724\3\2\2\2\u0725"+ + "\u0726\3\2\2\2\u0726\u0728\3\2\2\2\u0727\u071f\3\2\2\2\u0727\u0728\3\2"+ + "\2\2\u0728\u0729\3\2\2\2\u0729\u072a\7j\2\2\u072a\u016d\3\2\2\2\u072b"+ + "\u072c\5\u0148\u00a5\2\u072c\u072d\7s\2\2\u072d\u072e\7h\2\2\u072e\u016f"+ + "\3\2\2\2\u072f\u0730\5\u00c4c\2\u0730\u0171\3\2\2\2\u0731\u0736\7q\2\2"+ + "\u0732\u0736\7\2\2\3\u0733\u0736\7\u00a2\2\2\u0734\u0736\6\u00ba\24\2"+ + "\u0735\u0731\3\2\2\2\u0735\u0732\3\2\2\2\u0735\u0733\3\2\2\2\u0735\u0734"+ + "\3\2\2\2\u0736\u0173\3\2\2\2\u00bd\u0182\u0187\u018e\u0198\u019e\u01a4"+ + "\u01b4\u01b8\u01c1\u01cd\u01d1\u01d7\u01e0\u01ea\u01fc\u020a\u020e\u0215"+ + "\u021d\u0226\u0246\u024e\u026b\u027e\u028d\u029a\u02a3\u02b1\u02ba\u02c6"+ + "\u02db\u02e2\u02e7\u02ec\u02f6\u02f9\u02fd\u0301\u0309\u0311\u0316\u031e"+ + "\u0320\u0325\u032c\u0334\u0337\u033d\u0342\u0344\u0347\u034e\u0353\u0366"+ + "\u036e\u0372\u0375\u037b\u037f\u0382\u038c\u0393\u039a\u03a6\u03ac\u03b3"+ + "\u03b8\u03be\u03ca\u03d0\u03d4\u03dc\u03e0\u03e6\u03e9\u03ef\u03f4\u040d"+ + "\u0430\u0432\u0449\u0451\u045c\u0463\u046a\u0474\u0482\u0498\u049a\u04a2"+ + "\u04a6\u04aa\u04ad\u04b6\u04bc\u04c6\u04ce\u04d4\u04dd\u04e8\u04f3\u04f7"+ + "\u04f9\u0504\u050d\u0511\u0514\u051b\u0526\u0530\u0536\u0538\u0542\u054c"+ + "\u0550\u0554\u0558\u055f\u0567\u0572\u0576\u057a\u0586\u058a\u058e\u0593"+ + "\u059a\u05a1\u05b5\u05b9\u05bd\u05c1\u05d1\u05d7\u05d9\u05dd\u05e1\u05e4"+ + "\u05e8\u05ea\u05f0\u05f8\u05fd\u0608\u060e\u0615\u0620\u0625\u0629\u062e"+ + "\u0632\u063a\u0642\u0647\u064a\u0652\u065a\u065f\u0663\u0667\u066e\u068b"+ + "\u0696\u069a\u06a2\u06a6\u06a8\u06b0\u06b9\u06c1\u06c6\u06d6\u06d8\u06e1"+ + "\u06e7\u06ed\u06f1\u06fa\u0703\u0706\u070b\u071d\u071f\u0722\u0725\u0727"+ + "\u0735"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -13655,4 +13717,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 27688feeb..0f25a2c9e 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,3 +1,4 @@ +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -255,6 +256,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitIsComparable(GobraParser.IsComparableContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLow(GobraParser.LowContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -968,21 +976,21 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitLow(GobraParser.LowContext ctx) { return visitChildren(ctx); } + @Override public T visitLowSliceArgument(GobraParser.LowSliceArgumentContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitHigh(GobraParser.HighContext ctx) { return visitChildren(ctx); } + @Override public T visitHighSliceArgument(GobraParser.HighSliceArgumentContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * *

The default implementation returns the result of calling * {@link #visitChildren} on {@code ctx}.

*/ - @Override public T visitCap(GobraParser.CapContext ctx) { return visitChildren(ctx); } + @Override public T visitCapSliceArgument(GobraParser.CapSliceArgumentContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1529,4 +1537,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 79f5cf002..017cadc53 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,3 +1,4 @@ +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -223,6 +224,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitIsComparable(GobraParser.IsComparableContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#low}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLow(GobraParser.LowContext ctx); /** * Visit a parse tree produced by {@link GobraParser#typeOf}. * @param ctx the parse tree @@ -863,23 +870,23 @@ public interface GobraParserVisitor extends ParseTreeVisitor { */ T visitSlice_(GobraParser.Slice_Context ctx); /** - * Visit a parse tree produced by {@link GobraParser#low}. + * Visit a parse tree produced by {@link GobraParser#lowSliceArgument}. * @param ctx the parse tree * @return the visitor result */ - T visitLow(GobraParser.LowContext ctx); + T visitLowSliceArgument(GobraParser.LowSliceArgumentContext ctx); /** - * Visit a parse tree produced by {@link GobraParser#high}. + * Visit a parse tree produced by {@link GobraParser#highSliceArgument}. * @param ctx the parse tree * @return the visitor result */ - T visitHigh(GobraParser.HighContext ctx); + T visitHighSliceArgument(GobraParser.HighSliceArgumentContext ctx); /** - * Visit a parse tree produced by {@link GobraParser#cap}. + * Visit a parse tree produced by {@link GobraParser#capSliceArgument}. * @param ctx the parse tree * @return the visitor result */ - T visitCap(GobraParser.CapContext ctx); + T visitCapSliceArgument(GobraParser.CapSliceArgumentContext ctx); /** * Visit a parse tree produced by {@link GobraParser#assign_op}. * @param ctx the parse tree @@ -1348,4 +1355,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitEos(GobraParser.EosContext ctx); -} +} \ No newline at end of file diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index dcc5c3a65..0db5c8724 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -1031,6 +1031,8 @@ case class PTypeExpr(typ: PType) extends PGhostExpression case class PIsComparable(exp: PExpressionOrType) extends PGhostExpression +case class PLow(exp: PExpression) extends PGhostExpression + case class PMagicWand(left: PExpression, right: PExpression) extends PGhostExpression /* ** Option types */ diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index eaddcec2b..dbc6ed205 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -516,6 +516,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PTypeExpr(typ) => "type" <> brackets(showType(typ)) case PIsComparable(exp) => "isComparable" <> parens(showExprOrType(exp)) + case PLow(exp) => "low" <> parens(showExpr(exp)) + case POptionNone(t) => "none" <> brackets(showType(t)) case POptionSome(e) => "some" <> parens(showExpr(e)) case POptionGet(e) => "get" <> parens(showExpr(e)) diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 4d0cc0040..0eee9c1a8 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -562,6 +562,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case TupleTExpr(elem) => parens(showExprList(elem)) case DefinedTExpr(name) => name + case Low(exp) => "low" <> parens(showExpr(exp)) + case DfltVal(typ) => "dflt" <> brackets(showType(typ)) case Tuple(args) => parens(showExprList(args)) case Deref(exp, _) => "*" <> showExpr(exp) diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index a23f14046..5921bfcd2 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -640,7 +640,11 @@ case class MathMapTExpr(keys: Expr, elems: Expr)(val info: Source.Parser.Info) e case class OptionTExpr(elems: Expr)(val info: Source.Parser.Info) extends TypeExpr case class TupleTExpr(elems: Vector[Expr])(val info: Source.Parser.Info) extends TypeExpr +/* ** Information Flow */ +case class Low(exp: Expr)(val info: Source.Parser.Info) extends Expr { + override val typ: Type = BoolT(Addressability.rValue) +} /* ** Higher-order predicate expressions */ diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 0eff086cd..9bb0eecb5 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -4265,6 +4265,8 @@ object Desugar { case t => Violation.violation(s"Expected interface or sort type, but got $t") } + case PLow(exp) => for { wExp <- go(exp) } yield in.Low(wExp)(src) + case PIn(left, right) => for { dleft <- go(left) dright <- go(right) diff --git a/src/main/scala/viper/gobra/frontend/InformativeErrorListener.scala b/src/main/scala/viper/gobra/frontend/InformativeErrorListener.scala index 9a9a69ae0..471f0e521 100644 --- a/src/main/scala/viper/gobra/frontend/InformativeErrorListener.scala +++ b/src/main/scala/viper/gobra/frontend/InformativeErrorListener.scala @@ -110,7 +110,7 @@ class InformativeErrorListener(val messages: ListBuffer[ParserError], val source case (GobraParser.DECLARE_ASSIGN, _ : TypeSpecContext) => GotAssignErrorType() // We expected more tokens inside a slice expression but got a closing bracket: One of the // limits must be missing. - case (GobraParser.R_BRACKET, expr : ExpressionContext) if expr.parent.isInstanceOf[CapContext] => SliceMissingIndex(3) + case (GobraParser.R_BRACKET, expr : ExpressionContext) if expr.parent.isInstanceOf[CapSliceArgumentContext] => SliceMissingIndex(3) case _ => DefaultExtraneous() } } @@ -128,7 +128,7 @@ class InformativeErrorListener(val messages: ListBuffer[ParserError], val source case (Token.EOF, _) => DefaultMismatch() // Again, we have an unexpected :=, so suggest using a = case (GobraParser.DECLARE_ASSIGN, _) => GotAssignErrorType() - case (GobraParser.R_BRACKET, e : ExpressionContext) if e.parent.isInstanceOf[CapContext] => SliceMissingIndex(3) + case (GobraParser.R_BRACKET, e : ExpressionContext) if e.parent.isInstanceOf[CapSliceArgumentContext] => SliceMissingIndex(3) case _ => DefaultMismatch() } } @@ -156,7 +156,7 @@ class InformativeErrorListener(val messages: ListBuffer[ParserError], val source case _ => DefaultNoViable(exception) } } - case e: ExpressionContext if e.parent.isInstanceOf[CapContext] => SliceMissingIndex(3) + case e: ExpressionContext if e.parent.isInstanceOf[CapSliceArgumentContext] => SliceMissingIndex(3) case _ if new_reserved.contains(context.offendingSymbol.getType) => ReservedWord() case _ => DefaultNoViable(exception) } diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 73425dd07..5faf838b8 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -1318,9 +1318,9 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * @param ctx the parse tree */ override def visitSlice_(ctx: Slice_Context): (Option[PExpression], Option[PExpression], Option[PExpression]) = { - val low = if (ctx.low() != null) Some(visitNode[PExpression](ctx.low().expression())).pos() else None - val high = if (ctx.high() != null) Some(visitNode[PExpression](ctx.high().expression())).pos() else None - val cap = if (ctx.cap() != null) Some(visitNode[PExpression](ctx.cap().expression())).pos() else None + val low = if (ctx.lowSliceArgument() != null) Some(visitNode[PExpression](ctx.lowSliceArgument().expression())).pos() else None + val high = if (ctx.highSliceArgument() != null) Some(visitNode[PExpression](ctx.highSliceArgument().expression())).pos() else None + val cap = if (ctx.capSliceArgument() != null) Some(visitNode[PExpression](ctx.capSliceArgument().expression())).pos() else None (low, high, cap) } @@ -1383,6 +1383,14 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole case Vector("isComparable", "(", e : PExpression, ")") => PIsComparable(e) } + /** + * Visits the rule + * typeOf: LOW L_PAREN expression R_PAREN; + */ + override def visitLow(ctx: LowContext): AnyRef = super.visitLow(ctx) match { + case Vector("low", "(", expr: PExpression, ")") => PLow(expr) + } + /** * Visits the rule diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala index 30ade529b..e9d5f9012 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala @@ -102,7 +102,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl => case _: PConditional | _: PImplication | _: PForall | _: PExists => AddrMod.rValue case _: PAccess | _: PPredicateAccess | _: PMagicWand => AddrMod.rValue case _: PClosureImplements => AddrMod.rValue - case _: PTypeOf | _: PIsComparable => AddrMod.rValue + case _: PTypeOf | _: PIsComparable | _: PLow => AddrMod.rValue case _: PIn | _: PMultiplicity | _: PSequenceAppend | _: PGhostCollectionExp | _: PRangeSequence | _: PUnion | _: PIntersection | _: PSetMinus | _: PSubset | _: PMapKeys | _: PMapValues => AddrMod.rValue diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index a49c58c22..9cd674439 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -107,6 +107,8 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case t => error(n, s"expected interface or type, but got an expression of type $t") } + case PLow(e) => isExpr(e).out + case n: PGhostEquals => val lType = typ(n.left) val rType = typ(n.right) @@ -248,6 +250,8 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case _: PTypeOf => SortT case _: PTypeExpr => SortT case _: PIsComparable => BooleanT + + case _: PLow => BooleanT case _: PGhostEquals | _: PGhostUnequals => BooleanT case POptionNone(t) => OptionT(typeSymbType(t)) @@ -448,6 +452,8 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case _: PTypeExpr => true case n: PIsComparable => asExpr(n.exp).forall(go) + case n: PLow => go(n.exp) + case PCompositeLit(typ, _) => typ match { case _: PArrayType | _: PImplicitSizeArrayType => !strong case _ => true diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala index 537b7d94f..e235071f9 100644 --- a/src/main/scala/viper/gobra/translator/Translator.scala +++ b/src/main/scala/viper/gobra/translator/Translator.scala @@ -13,6 +13,7 @@ import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.reporting.GeneratedViperMessage import viper.gobra.translator.context.DfltTranslatorConfig import viper.gobra.translator.encodings.programs.ProgramsImpl +import viper.gobra.translator.transformers.hyper.SIFTransformer import viper.gobra.translator.transformers.{AssumeTransformer, TerminationTransformer, ViperTransformer} import viper.gobra.util.Violation import viper.silver.ast.pretty.FastPrettyPrinter @@ -27,7 +28,8 @@ object Translator { val transformers: Seq[ViperTransformer] = Seq( new AssumeTransformer, - new TerminationTransformer + new TerminationTransformer, + // new SIFTransformer ) val transformedTask = transformers.foldLeft(task) { diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala index 46c9b13d6..6d319ad37 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala @@ -10,6 +10,7 @@ import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} import viper.gobra.translator.encodings.combinators.Encoding import viper.gobra.translator.context.Context +import viper.gobra.translator.transformers.hyper.SIFLowExp import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation import viper.gobra.translator.util.{ViperUtil => vu} @@ -61,6 +62,8 @@ class AssertionEncoding extends Encoding { l = ctx.variable(let.left) r <- ctx.expression(let.right) } yield withSrc(vpr.Let(l, r, exp), let) + + case n@ in.Low(e) => for {arg <- ctx.expression(e) } yield withSrc(SIFLowExp(arg), n) } override def assertion(ctx: Context): in.Assertion ==> CodeWriter[vpr.Exp] = { diff --git a/src/main/scala/viper/gobra/translator/transformers/hyper/SIFAstExtensions.scala b/src/main/scala/viper/gobra/translator/transformers/hyper/SIFAstExtensions.scala new file mode 100644 index 000000000..e4c4bf210 --- /dev/null +++ b/src/main/scala/viper/gobra/translator/transformers/hyper/SIFAstExtensions.scala @@ -0,0 +1,181 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2023 ETH Zurich. + +package viper.gobra.translator.transformers.hyper + +import viper.silver.ast.pretty.PrettyPrintPrimitives +import viper.silver.ast.pretty.FastPrettyPrinter.{ContOps, nil, parens, show, showBlock, text} +import viper.silver.ast._ +import viper.silver.verifier.VerificationResult + +case class SIFReturnStmt(exp: Option[Exp], resVar: Option[LocalVar]) + (val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = Seq(exp, resVar).collect({case Some(x) => x}) + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("return") <+> (exp match { + case Some(x) => show(x) + case None => nil + }) +} + +case class SIFBreakStmt()(val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = Seq() + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("break") +} + +case class SIFContinueStmt()(val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = Seq() + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("continue") +} + +case class SIFRaiseStmt(assignment: Option[LocalVarAssign]) + (val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = assignment match { + case Some(a) => Seq(a) + case None => Seq() + } + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("raise") <+> + (assignment match {case Some(a) => show(a) case None => nil}) +} + +case class SIFExceptionHandler(errVar: LocalVar, exception: Exp, body: Seqn) + (val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = Seq(errVar, exception, body) + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("catch") <+> parens(show(exception)) <+> + showBlock(body) +} + +case class SIFTryCatchStmt(body: Seqn, + catchBlocks: Seq[SIFExceptionHandler], + elseBlock: Option[Seqn], + finallyBlock: Option[Seqn]) + (val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = Seq(body) ++ + Seq(elseBlock, finallyBlock).collect({case Some(x) => x}) ++ + catchBlocks.flatMap(h => h.subnodes) + + override def prettyPrint: PrettyPrintPrimitives#Cont = { + text("try") <+> showBlock(body) <> + catchBlocks.map(h => h.prettyPrint) + .fold(nil)((l, r) => l <+> r) <+> + (elseBlock match {case Some(x) => text("else") <+> showBlock(x) case None => nil}) <+> + (finallyBlock match {case Some(x) => text("finally") <+> showBlock(x) case None => nil}) + } +} + +case class SIFDeclassifyStmt(exp: Exp) + (val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = Seq(exp) + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("declassify") <+> show(exp) +} + +case class SIFInlinedCallStmt(stmts: Seqn) + (val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = Seq(stmts) + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("inlined call") <> show(stmts) +} + +case class SIFAssertNoException()(val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionStmt { + override def extensionSubnodes: Seq[Node] = Seq() + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("assert no exception") +} + +case class SIFLowExp(exp: Exp, comparator: Option[String] = None, typVarMap: Map[TypeVar, Type] = Map()) + (val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionExp { + override def extensionSubnodes: Seq[Node] = Seq(exp) + + override def typ: Type = Bool + + override def verifyExtExp(): VerificationResult = ??? + + override def prettyPrint: PrettyPrintPrimitives#Cont = (if (comparator.isDefined) text("lowVal") + else text("low")) <> parens(show(exp)) + + override val extensionIsPure: Boolean = exp.isPure +} + +case class SIFLowEventExp()(val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionExp { + override def extensionSubnodes: Seq[Node] = Nil + + override def typ: Type = Bool + + override def verifyExtExp(): VerificationResult = ??? + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("lowEvent") + + override val extensionIsPure: Boolean = true + +} + +case class SIFLowExitExp()(val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionExp { + override def extensionSubnodes: Seq[Node] = Nil + + override def typ: Type = Bool + + override def verifyExtExp(): VerificationResult = ??? + + override def prettyPrint: PrettyPrintPrimitives#Cont = text("lowExit") + + override val extensionIsPure: Boolean = false +} + +case class SIFTerminatesExp(cond: Exp)(val pos: Position = NoPosition, + val info: Info = NoInfo, + val errT: ErrorTrafo = NoTrafos) extends ExtensionExp { + override def extensionSubnodes: Seq[Node] = Seq(cond) + + override def typ: Type = Bool + + override def verifyExtExp(): VerificationResult = ??? + + override def prettyPrint: PrettyPrintPrimitives#Cont = + text("terminates under condition") <+> show(cond) + + override def extensionIsPure: Boolean = cond.isPure +} + +case class SIFInfo(comment: Seq[String], + continueUnaware: Boolean = false, + obligationVar: Boolean = false) extends Info{ + lazy val isCached = false +} + +case class SIFDynCheckInfo(comment: Seq[String], + dynCheck: Exp, + onlyDynVersion: Boolean = false) extends Info{ + lazy val isCached = false +} diff --git a/src/main/scala/viper/gobra/translator/transformers/hyper/SIFError.scala b/src/main/scala/viper/gobra/translator/transformers/hyper/SIFError.scala new file mode 100644 index 000000000..18c8562ca --- /dev/null +++ b/src/main/scala/viper/gobra/translator/transformers/hyper/SIFError.scala @@ -0,0 +1,63 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2023 ETH Zurich. + +package viper.gobra.translator.transformers.hyper + +import viper.silver.ast.{Fold, Unfold} +import viper.silver.verifier.errors.ErrorNode +import viper.silver.verifier._ + + +case class SIFTerminationChannelCheckFailed(offendingNode: ErrorNode, reason: ErrorReason, + override val cached: Boolean = false) extends AbstractVerificationError { + val id: String = "termination_channel_check.failed" + val text: String = "Termination channel might exist." + override def withNode(offendingNode: ErrorNode = this.offendingNode): ErrorMessage = + SIFTerminationChannelCheckFailed(offendingNode, this.reason) + + override def withReason(r: ErrorReason): AbstractVerificationError = SIFTerminationChannelCheckFailed(offendingNode, r) +} + +case class SIFFoldNotLow(offendingNode: Fold) extends AbstractErrorReason { + val id: String = "sif.fold" + val readableMessage: String = s"The low parts of predicate ${offendingNode.acc.loc.predicateName} might not hold." + + override def withNode(offendingNode: ErrorNode = this.offendingNode): ErrorMessage = + SIFFoldNotLow(offendingNode.asInstanceOf[Fold]) +} + +case class SIFUnfoldNotLow(offendingNode: Unfold) extends AbstractErrorReason { + val id: String = "sif.unfold" + val readableMessage: String = s"The low parts of predicate ${offendingNode.acc.loc.predicateName} might not hold." + + override def withNode(offendingNode: ErrorNode = this.offendingNode): ErrorMessage = + SIFUnfoldNotLow(offendingNode.asInstanceOf[Unfold]) +} + +case class SIFTermCondNotLow(offendingNode: SIFTerminatesExp) extends AbstractErrorReason { + val id: String = "sif_termination.condition_not_low" + val readableMessage: String = s"Termination condition ${offendingNode.cond} might not be low." + + override def withNode(offendingNode: ErrorNode = this.offendingNode): ErrorMessage = + SIFTermCondNotLow(offendingNode.asInstanceOf[SIFTerminatesExp]) +} + +case class SIFTermCondLowEvent(offendingNode: SIFTerminatesExp) extends AbstractErrorReason { + val id: String = "sif_termination.not_lowevent" + val readableMessage: String = + s"Termination condition ${offendingNode.cond} evaluating to false might not imply both executions don't terminate." + + override def withNode(offendingNode: ErrorNode = this.offendingNode): ErrorMessage = + SIFTermCondLowEvent(offendingNode.asInstanceOf[SIFTerminatesExp]) +} + +case class SIFTermCondNotTight(offendingNode: SIFTerminatesExp) extends AbstractErrorReason { + val id: String = "sif_termination.condition_not_tight" + val readableMessage: String = s"Termination condition ${offendingNode.cond} might not be tight." + + override def withNode(offendingNode: ErrorNode = this.offendingNode): ErrorMessage = + SIFTermCondNotTight(offendingNode.asInstanceOf[SIFTerminatesExp]) +} diff --git a/src/main/scala/viper/gobra/translator/transformers/hyper/SIFExtendedTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/hyper/SIFExtendedTransformer.scala new file mode 100644 index 000000000..55f5cc1de --- /dev/null +++ b/src/main/scala/viper/gobra/translator/transformers/hyper/SIFExtendedTransformer.scala @@ -0,0 +1,1728 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2023 ETH Zurich. + +package viper.gobra.translator.transformers.hyper + +import viper.gobra.backend.BackendVerifier +import viper.gobra.translator.transformers.ViperTransformer +import viper.silver.ast._ +import viper.silver.ast.utility.Simplifier +import viper.silver.verifier.{AbstractError, errors} +import viper.silver.verifier.errors.{AssertFailed, ErrorNode} + +import scala.collection.immutable.HashSet +import scala.collection.mutable +import scala.collection.mutable.ListBuffer + +trait SIFExtendedTransformer { + object Config { + /** If true, don't generate all the control flow variables, just the ones needed for each method. */ + var optimizeControlFlow: Boolean = true + /** If true, try to bunch as many statements into a single if statement which was introduced for checking active + * executions, instead of having one if stmt per original statement. */ + var optimizeSequential: Boolean = true + /** If true, add an 'assume p1' at the beginning of each method, to cut down on redundant paths the + * verification could consider */ + var optimizeRestrictActVars: Boolean = true + /** Applications of the functions which have an entry here, will be replaced by the expression + * determined by the entry in the second execution. */ + var primedFuncAppReplacements: mutable.HashMap[String, (FuncApp, Exp, Exp) => Exp] = new mutable.HashMap + /** Set this to only transform methods that contain relational assertions somewhere in their spec or body. + * May lead to invalid programs when such a method calls another methods that does contain such specs. + */ + var onlyTransformMethodsWithRelationalSpecs: Boolean = false + var generateAllLowFuncs: Boolean = true + } + def optimizeControlFlow(v: Boolean): Unit = { + Config.optimizeControlFlow = v + } + def optimizeSequential(v: Boolean): Unit = { + Config.optimizeSequential = v + } + def optimizeRestrictActVars(v: Boolean): Unit = { + Config.optimizeRestrictActVars = v + } + def generateAllLowFuncs(v: Boolean): Unit = { + Config.generateAllLowFuncs = v + } + def onlyTransformMethodsWithRelationalSpecs(v: Boolean): Unit = { + Config.onlyTransformMethodsWithRelationalSpecs = v + } + def addPrimedFuncAppReplacement(name: String, strategy: String): Unit = { + strategy match { + case "first_arg" => Config.primedFuncAppReplacements.put(name, + (func, p1, p2) => translatePrime(func.args.head, p1, p2)) + case "true" => Config.primedFuncAppReplacements.put(name, (func, _, _) => + TrueLit()(func.pos, func.info, func.errT)) + case _ => new IllegalArgumentException( + s"""Unknown strategy "$strategy" for primed function application replacement.""") + } + } + def clearPrimedFuncAppReplacement(): Unit = { + Config.primedFuncAppReplacements.clear() + } + + val primedNamesPerMethod = new mutable.HashMap[String, Map[String, String]] + val primedNames = new mutable.HashMap[String, String] + val relationalPredicates = new mutable.HashSet[Predicate] + val predLowFuncs = new mutable.HashMap[String, Option[Function]] + val predLowFuncInfo = new mutable.HashMap[String, Option[(String, Seq[LocalVarDecl], Seq[LocalVarDecl])]] + val predAllLowFuncs = new mutable.HashMap[String, Option[Function]]() + val predAllLowFuncInfo = new mutable.HashMap[String, Option[(String, Seq[LocalVarDecl], Seq[LocalVarDecl])]] + val usedNames = new mutable.HashSet[String] + var newFields : List[Field] = Nil + var newPredicates: Seq[Predicate] = Nil + var _program : Program = null + var getArgFunc : DomainFunc = null + var getOldFunc : DomainFunc = null + var getArgPFunc : DomainFunc = null + var getOldPFunc : DomainFunc = null + + private var _allLowMethods: Set[String] = HashSet[String]() + def allLowMethods: Set[String] = _allLowMethods + def setAllLowMethods(value: Set[String]): Unit = _allLowMethods = value + + private var _preservesLowMethods: Set[String] = HashSet[String]() + def preservesLowMethods: Set[String] = _preservesLowMethods + def setPreservesLowMethods(value: Set[String]): Unit =_preservesLowMethods = value + + private val _domainFuncsToDuplicate = new mutable.HashSet[DomainFunc]() + def domainFuncsToDuplicate: mutable.Set[DomainFunc] = _domainFuncsToDuplicate + def addDomainFuncToDuplicate(funcs: DomainFunc*): Unit = _domainFuncsToDuplicate ++= funcs + + var timing = false + var time : Option[LocalVar] = None + + val skip: Seqn = Seqn(Seq(), Seq())() + + def transform(p: Program, enableTiming: Boolean) : Program = { + primedNames.clear() + predLowFuncs.clear() + predLowFuncInfo.clear() + predAllLowFuncInfo.clear() + usedNames.clear() + newFields = Nil + newPredicates = Nil + timing = enableTiming + _program = p + + val allNames = p.collect({ + case d: Declaration => d.name + }) + usedNames ++= allNames + + collectRelationalPredicates(_program, relationalPredicates) + createNewNames(p) + newFields = p.fields.toList.flatMap(f => List(f, f.copy(name=primedNames(f.name))(f.pos, f.info, f.errT))) + var newFunctions: Seq[Function] = p.functions.flatMap(f => translateFunction(f)) + newPredicates = Seq() + for (pred <- p.predicates) { + val (newPs, predFuncs) = translatePredicate(pred, p) + newPredicates ++= newPs + newFunctions ++= predFuncs.collect{case f if f.isDefined => f.get} + } + val newDomains: Seq[Domain] = p.domains.map(d => translateDomain(d)) + + val newMethods: Seq[Method] = if (Config.onlyTransformMethodsWithRelationalSpecs) { + val relationalMethods = p.methods.filter(m => m.existsDefined({ + case e: Exp if !isUnary(e) => true + })) + val unaryMethods = p.methods.filter(m => !relationalMethods.contains(m)) + relationalMethods.map(m => translateMethod(m)) ++ unaryMethods + }else{ + p.methods.map(m => translateMethod(m)) + } + + p.copy(domains = newDomains, fields = newFields, functions = newFunctions, predicates = newPredicates, + methods = newMethods)(p.pos, p.info, p.errT) + } + + def getName(orig: String) : String = { + if (usedNames.contains(orig)){ + var index = 0 + while (usedNames.contains(orig + "_" + index)){ + index += 1 + } + val result = orig + "_" + index + usedNames.add(result) + return result + }else{ + usedNames.add(orig) + return orig + } + } + + /** Create the new names for the programs variables, functions (those which depend on the heap), + * and predicates, which are used for the second execution. Updates [[primedNames]]. + * @param p The program being encoded. + */ + def createNewNames(p: Program): Unit = { + // duplicate domain func names where needed + for (df <- domainFuncsToDuplicate) { + primedNames.update(df.name, getName(df.name)) + } + // duplicate field names + for (f <- p.fields) { + val newName = getName(f.name + 'p') + primedNames.update(f.name, newName) + } + // duplicate names for functions which depend on the heap + for (f <- p.functions) { + if (isHeapDependent(f, p)) primedNames.update(f.name, getName(f.name)) + } + // duplicate names for predicates + for (pred <- p.predicates) { + primedNames.update(pred.name, getName(pred.name)) + val duplicatedArgs = pred.formalArgs.map{a => + val newName = getName(a.name) + a.copy(name = newName)(a.pos, a.info, a.errT) + } + predLowFuncInfo.update(pred.name, if (relationalPredicates.contains(pred) && pred.body.isDefined) + Some(getName(pred.name + "_low"), pred.formalArgs, duplicatedArgs) + else None + ) + predAllLowFuncInfo.update(pred.name, pred.body match { + case Some(_) => + Some(getName(pred.name + "_all_low"), pred.formalArgs, duplicatedArgs) + case None => None + }) + } + } + + private def isHeapDependent(f: Function, p: Program): Boolean = { + f.pres.exists(pre => pre.isHeapDependent(p)) + } + + def collectRelationalPredicates(p: Program, relPreds: mutable.HashSet[Predicate]): Unit = { + def directlyRelational(pred: Predicate): Boolean = { + pred.body.isDefined && !isUnary(pred.body.get) + } + + relPreds.clear() + relPreds ++= p.predicates.filter(pred => directlyRelational(pred)) + val dependencies = mutable.HashMap[String, Seq[String]]() + + relPreds.foreach(pred => + // put the name of this as depending on all referenced predicates + pred.body.collect{ + case pap: PredicateAccessPredicate => pap + }.foreach(pap => + dependencies.update(pap.loc.predicateName, dependencies.getOrElse(pap.loc.predicateName, Seq()) :+ pred.name) + ) + ) + // go through dependent predicates to add them to relationals + val queue = mutable.Queue[String](relPreds.toSeq.map(rp => rp.name): _*) + while (queue.nonEmpty) { + val head: String = queue.dequeue() + for (dep <- dependencies.getOrElse(head, Seq())) { + if (relPreds.add(p.findPredicate(dep))) queue.enqueue(dep) + } + } + } + + def translateDomain(d: Domain): Domain = { + val newFunctions: Seq[DomainFunc] = d.functions.flatMap{df => + val duplicate: Option[DomainFunc] = if (domainFuncsToDuplicate.contains(df)) { + Some(df.copy(name = primedNames(df.name))(df.pos, df.info, df.domainName, df.errT)) + } else None + Seq(df) ++ Seq(duplicate).collect{case Some(x) => x} + } + d.copy(functions = newFunctions)(d.pos, d.info, d.errT) + } + + def translateMethod(m: Method) : Method = { + val primedBefore = primedNames.clone() + val (p1d, p1r) = getNewBool("p1") + val (p2d, p2r) = getNewBool("p2") + var toAdd = Seq(p1d, p2d) + val (t1d, t1r) = getNewVar("t1", Int) + val (t2d, t2r) = getNewVar("t2", Int) + if (timing){ + toAdd = Seq(p1d, p2d, t1d, t2d) + primedNames.update(t1d.name, t2d.name) + time = Some(t1r) + } + + val newArgs = toAdd ++ m.formalArgs.flatMap{a => + val newName = getName(a.name) + primedNames.update(a.name, newName) + val primedArg = a.copy(name = newName)(a.pos, a.info, a.errT) + Seq(a, primedArg) + } + var toAddRet : Seq[LocalVarDecl] = Seq() + val (t1dr, t1rr) = getNewVar("t1", Int) + val (t2dr, t2rr) = getNewVar("t2", Int) + if (timing){ + toAddRet = Seq(t1dr, t2dr) + primedNames.update(t1dr.name, t2dr.name) + time = Some(t1rr) + } + val newReturns = toAddRet ++ m.formalReturns.flatMap{r => + val newName = getName(r.name) + primedNames.update(r.name, newName) + val primedRet = r.copy(name = newName)(r.pos, r.info, r.errT) + Seq(r, primedRet) + } + + var (newPres, newPosts) = addLownessConditions(m, m.pres, m.posts) + val condCtx = TranslationContext(p1r, p2r, EmptyControlFlowVars(), m) + newPres = newPres.map{e => translateSIFAss(e, condCtx.copy(translatingPrecond = true))} + newPosts = newPosts.map{e => translateSIFAss(e, condCtx)} + // Termination channels + var terminates: Option[SIFTerminatesExp] = None + m.pres.foreach(pre => pre.visit{ + case t: SIFTerminatesExp => terminates = Some(t) + }) + if (terminates.isDefined) { + newPres = simplifyConditions(newPres ++ + terminationChannelsLowChecks(terminates.get, condCtx)) + newPosts :+= translateSIFAss(Old(terminates.get.cond)( + terminates.get.cond.pos, terminates.get.cond.info, + ErrTrafo({case _ => SIFTerminationChannelCheckFailed(terminates.get.cond, SIFTermCondNotTight(terminates.get))}) + ), condCtx) + } + + if (timing){ + val timeUnchanged1 = Implies(Not(p1r)(), EqCmp(t1r, t1rr)())() + val timeUnchanged2 = Implies(Not(p2r)(), EqCmp(t2r, t2rr)())() + newPosts ++= Seq(timeUnchanged1, timeUnchanged2) + } + + var firstStatements : Seq[Stmt] = Seq() + if (Config.optimizeRestrictActVars) firstStatements :+= Inhale(p1r)() + if (timing){ + val assignTime1 = LocalVarAssign(t1rr, t1r)() + val assignTime2 = LocalVarAssign(t2rr, t2r)() + firstStatements ++= Seq(assignTime1, assignTime2) + time = Some(t1rr) + } + + var newBody: Option[Seqn] = None + if (m.body.isDefined) { + var body: Seqn = m.body.get + if (allLowMethods.contains(m.name) || preservesLowMethods.contains(m.name)) { + body = inferLowLoopInvariants(m, preservesOnly = preservesLowMethods.contains(m.name)) + } + + // find which control variables the method requires + val ctrlVars: MethodControlFlowVars = createControlFlowVars(body) + val ctx: TranslationContext = TranslationContext(p1r, p2r, ctrlVars, m) + + newBody = Some(Seqn(firstStatements ++ ctrlVars.initAssigns() ++ + Seq(translateStatement(body, ctx).asInstanceOf[Seqn]), ctrlVars.declarations())()) + } + + time = None + primedNamesPerMethod.update(m.name, primedNames.toMap) + primedNames.clear() + primedNames ++= primedBefore + Method(m.name, newArgs, newReturns, newPres, newPosts, newBody)(m.pos) + } + + def _conjoinOptions(in: Seq[Option[Exp]]): Exp = { + val defined = in.filter(x => x.isDefined).map(x => x.get) + defined.size match { + case 0 => TrueLit()() + case _ => defined.reduceRight((a, b) => And(a, b)(a.pos)) + } + } + + /** Takes a sequence of LocalVarDecls and produces an expression saying each pair of adjacent variables are equal. + */ + def _varDeclsToAllLow(in: Seq[LocalVarDecl]): Exp = { + in.map(decl => decl.localVar) + .map(v => SIFLowExp(v, None)()) + .reduceRight[Exp]((v, e) => And(v, e)()) + } + + def allReachableStateLow(m: Method, old: Boolean, predicateSrc: Seq[Exp]): Option[Exp] = { + var lowExpressions: Seq[Exp] = Seq() + + // all accs to fields in preconditions + val allFieldAccesses: Seq[FieldAccess] = m.pres.flatMap(e => e.deepCollect({ + case FieldAccessPredicate(loc, _) => Seq(loc) + })).flatten.distinct + for (fieldAcc <- allFieldAccesses) { + val eq = SIFLowExp(fieldAcc, None)(m.pos) + if (old) + lowExpressions :+= Old(eq)(m.pos) + else + lowExpressions :+= eq + } + + // all accs we get via predicates + lowExpressions ++= predicateSrc.flatMap(e => e.deepCollect{ + case PredicateAccessPredicate(loc, _) => + val funcApp = FuncApp(predAllLowFuncs(loc.predicateName).get, + loc.args ++ loc.args.map(a => translatePrime(a, null, null)))() + if (old) + Old(funcApp)(m.pos) + else + funcApp + }) + + if (lowExpressions.nonEmpty) + Some(lowExpressions.reduceRight[Exp]((a, b) => And(a, b)(m.pos))) + else + None + } + + def allVarsAndStateLow(m: Method, vars: Seq[LocalVarDecl], old: Boolean, predicateSrc: Seq[Exp]): Exp = { + val nonObligationVars = vars.filterNot(isObligationVar) + val allArgsLow: Option[Exp] = if (nonObligationVars.isEmpty) None else Some(_varDeclsToAllLow(nonObligationVars)) + val allStateLow: Option[Exp] = allReachableStateLow(m, old, predicateSrc) + _conjoinOptions(Seq(allArgsLow, allStateLow)) + } + + def addLownessConditions(m: Method, pres: Seq[Exp], posts: Seq[Exp]): (Seq[Exp], Seq[Exp]) = { + var newPres = pres + if (allLowMethods.contains(m.name)) newPres :+= allVarsAndStateLow(m, m.formalArgs, old = false, predicateSrc = m.pres) + var newPosts = posts + if (allLowMethods.contains(m.name)) newPosts :+= allVarsAndStateLow(m, m.formalReturns, old = false, predicateSrc = m.posts) + if (preservesLowMethods.contains(m.name)) newPosts :+= Implies( + allVarsAndStateLow(m, m.formalArgs, old = true, predicateSrc = m.pres), + allVarsAndStateLow(m, m.formalReturns, old = false, predicateSrc = m.posts))(m.pos) + (newPres, newPosts) + } + + def inferLowLoopInvariants(m: Method, preservesOnly: Boolean): Seqn = { + val _obligationVars: Seq[String] = obligationVars(m) + m.body.get.transform{ + case w@While(cond, invs, body) => + val targets: Seq[LocalVar] = w.deepCollect({ + case LocalVarAssign(lhs, _) => Seq(lhs) + case MethodCall(_, _, ts) => ts + case NewStmt(t, _) => Seq(t) + }).flatten + .distinct + .filterNot(v => _obligationVars.contains(v.name)) + var additionalInvs: Seq[Exp] = targets.map(lv => SIFLowExp(lv, None)()) ++ + allReachableStateLow(m, old = false, predicateSrc = m.pres) + if (preservesOnly) { + additionalInvs = additionalInvs.map( + i => Implies(allVarsAndStateLow(m, m.formalArgs, old=true, predicateSrc = m.pres), i)()) + } + val newInvs: Seq[Exp] = invs ++ additionalInvs + While(cond, newInvs, body)(w.pos, w.info, w.errT) + } + } + + def isObligationVar(v: LocalVarDecl): Boolean = { + val vi = v.info.getUniqueInfo[SIFInfo] + vi match { + case Some(info) => info.obligationVar + case _ => false + } + } + + def obligationVars(m: Method): Seq[String] = { + m.deepCollect[LocalVarDecl]({ + case d: LocalVarDecl if isObligationVar(d) => d + }).map(v => v.name) + } + + def createControlFlowVars(methodBody: Seqn): MethodControlFlowVars = { + val gotos = methodBody.collect({case Goto(l) => l}).toSet + val labels = methodBody.collect({case l@Label(n, _) if gotos.contains(n) => l}).toSet + if (!Config.optimizeControlFlow) return new MethodControlFlowVars(true, true, true, true, labels) + var hasRet, hasBreak, hasCont, hasExcept: Boolean = false + methodBody.visit({ + case _: SIFReturnStmt => hasRet = true + case _: SIFBreakStmt => hasBreak = true + case _: SIFContinueStmt => hasCont = true + case _: SIFRaiseStmt => hasExcept = true + case _: SIFTryCatchStmt => hasExcept = true + }) + if (labels.nonEmpty && (hasRet || hasBreak || hasCont || hasExcept)) + throw new IllegalArgumentException + new MethodControlFlowVars(hasRet, hasBreak, hasCont, hasExcept, labels) + } + + def incrementTime(p1: Exp, p2: Exp) : Seqn = { + if (timing){ + val timeInc1 = If(p1, Seqn(Seq(LocalVarAssign(time.get, Add(time.get, IntLit(1)())())()), Seq())(), skip)() + val timeInc2 = If(p2, Seqn(Seq(LocalVarAssign(translatePrime(time.get, p1, p2), translatePrime(Add(time.get, IntLit(1)())(), p1, p2))()), Seq())(), skip)() + Seqn(Seq(timeInc1, timeInc2), Seq())() + }else{ + skip + } + + } + + private def terminationChannelsLowChecks(terminates: SIFTerminatesExp, + ctx: TranslationContext): Seq[Exp] = { + val condLowEventReasonTrafo = ErrTrafo({case _ => + SIFTerminationChannelCheckFailed(terminates, SIFTermCondLowEvent(terminates))}) + + ReTrafo({case _ => SIFTermCondLowEvent(terminates)}) + val condLowReasonTrafo = ErrTrafo({case _ => + SIFTerminationChannelCheckFailed(terminates, SIFTermCondNotLow(terminates))}) + + ReTrafo({case _ => SIFTermCondNotLow(terminates)}) + val pos = terminates.pos + val info = terminates.info + Seq( + // Note: cast here is not very elegant, maybe there's a better way to attach the error reason + // to result of translateSIFAss + translateSIFAss(Implies(Not(terminates.cond)(pos, info, condLowEventReasonTrafo), + SIFLowEventExp()(pos, info, condLowEventReasonTrafo))(pos, info, condLowEventReasonTrafo), ctx) + .asInstanceOf[Implies].copy()(pos, info, condLowEventReasonTrafo), + translateSIFAss(SIFLowExp(terminates.cond)(pos, info, condLowReasonTrafo), ctx) + .asInstanceOf[Implies].copy()(pos, info, condLowReasonTrafo) + ) + } + + /** Translate a function into MPP. Create two versions (one per execution) if it is heap dependent. + * @param f The function to translate. + * @return A list of either the original function or the two versions. + */ + def translateFunction(f: Function): Seq[Function] = { + if (!primedNames.isDefinedAt(f.name)) return Seq(f) + + // create one function for each execution using different field versions + val newPres1 = f.pres.map(p => translateNormal(p, null, null)) + val newPres2 = f.pres.map(p => translatePrime(p, null, null)) + val newPosts1 = f.posts.map(p => translateNormal(p, null, null)) + val newPosts2 = f.posts.map(p => translatePrime(p, null, null)) + + val newBody1: Option[Exp] = f.body.collect{case x => translateNormal(x, null, null)} + val newBody2: Option[Exp] = f.body.collect{case x => translatePrime(x, null, null)} + + val f1 = f.copy(pres = newPres1, posts = newPosts1, body = newBody1)(f.pos, f.info, f.errT) + val f2 = f.copy(name = primedNames(f.name), pres = newPres2, posts = newPosts2, + body = newBody2)(f.pos, f.info, f.errT) + Seq(f1, f2) + } + + /** Translate a predicate into MPP. Creates two copies of the predicate: one version for first execution, + * one for the second. The predicates only contain the unary expressions of the original predicate. + * Generates a function containing all the relational expressions in the predicates body. + * @param pred The predicate to translate. + * @param p The surrounding program. + * @return List of the new predicates, plus the low-function. + */ + def translatePredicate(pred: Predicate, p: Program): (Seq[Predicate], Seq[Option[Function]]) = { + val unaryBody: Option[Exp] = translateToUnary(pred.body) + val newBody1: Option[Exp] = unaryBody.collect({case x => translateNormal(x, null, null)}) + val newBody2: Option[Exp] = unaryBody.collect({case x => translatePrime(x, null, null)}) + + val pred1 = pred.copy(body = newBody1)(pred.pos, pred.info, pred.errT) + val pred2 = pred.copy(name = primedNames(pred.name), body = newBody2)(pred.pos, pred.info, pred.errT) + + var lowF: Option[Function] = None + var allLowF: Option[Function] = None + if (pred.body.isDefined) { + val (allLowFName, formalArgs, duplicatedFormalArgs) = predAllLowFuncInfo(pred.name).get + + val access1 = PredicateAccess(formalArgs.map{a => a.localVar}, pred1.name)(pred.pos) + val access2 = PredicateAccess(duplicatedFormalArgs.map{a => a.localVar}, pred2.name)(pred.pos) + val fPres: Seq[Exp] = Seq(And(PredicateAccessPredicate(access1, WildcardPerm()())(), + PredicateAccessPredicate(access2, WildcardPerm()())())()) + val lowFFormalArgs = pred.formalArgs ++ duplicatedFormalArgs + val primedBefore = primedNames.clone() + formalArgs.zip(duplicatedFormalArgs).foreach(t => primedNames.update(t._1.name, t._2.name)) + + def unfoldingPredicates(body: Exp): Exp = { + Unfolding(PredicateAccessPredicate(access1, WildcardPerm()())(), + Unfolding(PredicateAccessPredicate(access2, WildcardPerm()())(), + body)())() + } + if (relationalPredicates.contains(pred)) { + val (lowFName, _, _) = predLowFuncInfo(pred.name).get + val fBody: Exp = unfoldingPredicates(translatePredLowFuncBody(pred.body.get)) + lowF = Some(Function(lowFName, lowFFormalArgs, Bool, fPres, Seq(), Some(fBody)) + (pred.pos, pred.info, pred.errT)) + } + + val allLowBody: Exp = unfoldingPredicates(translatePredAllLowFuncBody(pred.body.get)) + allLowF = Some(Function(allLowFName, lowFFormalArgs, Bool, fPres, Seq(), Some(allLowBody)) + (pred.pos, pred.info, pred.errT)) + + primedNames.clear() + primedNames ++= primedBefore + } + + predLowFuncs.update(pred.name, lowF) + predAllLowFuncs.update(pred.name, allLowF) + if (Config.generateAllLowFuncs) + (Seq(pred1, pred2), Seq(lowF, allLowF)) + else + (Seq(pred1, pred2), Seq(lowF, None)) + } + + private def bypassPreamble(p1: Exp, p2: Exp, ctrlVars: MethodControlFlowVars, + bypass1r: LocalVar, bypass2r: LocalVar): Seq[Stmt] = { + Seq(LocalVarAssign(bypass1r, + Not(ctrlVars.activeExecNormal(Some(p1)))())(), + LocalVarAssign(bypass2r, Not(ctrlVars.activeExecPrime(Some(p2)))())()) + } + + /** Translate a while statement into MPP. + */ + private def translateWhileStmt(w: While, ctx: TranslationContext): Seqn = { + val p1 = ctx.p1; val p2 = ctx.p2; val ctrlVars = ctx.ctrlVars + + // check if we need to do a reconstruction of this loop (iff it has ret/break/except stmt or we don't optimize) + val recNeeded: Boolean = { + var rn = !Config.optimizeControlFlow + w.body.visit({ + case _: SIFReturnStmt => rn = true + case _: SIFBreakStmt => rn = true + case _: SIFRaiseStmt => rn = true + case _: SIFTryCatchStmt => rn = true + }) + rn + } + + var newVarDecls = Seq[LocalVarDecl]() + //var targetValRefs = Seq[LocalVar]() + var targetValAssigns = Seq[Stmt]() + var targetValEqualities1 = Set[Exp]() + var targetValEqualities2 = Set[Exp]() + + val (bypass1d, bypass1r) = getNewBool("bypass1") + val (bypass2d, bypass2r) = getNewBool("bypass2") + newVarDecls ++= Seq(bypass1d, bypass2d) + var stmts: Seq[Stmt] = bypassPreamble(p1, p2, ctrlVars, bypass1r, bypass2r) + + def targetCollectF: PartialFunction[Node, Seq[LocalVar]] = { + case LocalVarAssign(lhs, _) => Seq(lhs) + case MethodCall(_, _, ts) => ts + case NewStmt(t, _) => Seq(t) + case SIFReturnStmt(_, _) => Seq(ctrlVars.ret1r.get) + case SIFRaiseStmt(_) => Seq(ctrlVars.except1r.get) + case SIFTryCatchStmt(body, handlers, elseBlock, finallyBlock) => + (body.deepCollect(targetCollectF).distinct.flatten ++ + handlers.map(h => h.body.deepCollect(targetCollectF).flatten).distinct.flatten ++ (elseBlock match { + case Some(eb) => eb.deepCollect(targetCollectF).distinct.flatten + case None => Seq() + }) ++ (finallyBlock match { + case Some(fb) => fb.deepCollect(targetCollectF).distinct.flatten + case None => Seq() + })).distinct + } + + // continue and break control variables will be assigned even if there is no continue in this loop -> add to targets + val targets = w.deepCollect(targetCollectF).flatten.distinct ++ (if (ctrlVars.cont1r.isDefined) + Seq(ctrlVars.cont1r.get, ctrlVars.cont2r.get) else Seq()) ++ (if (ctrlVars.break1r.isDefined) + Seq(ctrlVars.break1r.get, ctrlVars.break2r.get) else Seq()) + + var tmpAssigns1 = Seq[LocalVarAssign]() + var tmpAssigns2 = Seq[LocalVarAssign]() + for (t <- targets) { + // make sure the variable is defined outside the loop + if (primedNames.contains(t.name)){ + val (tmp1d, tmp1r) = getNewVar("tmp1", t.typ) + val (tmp2d, tmp2r) = getNewVar("tmp2", t.typ) + newVarDecls ++= Seq(tmp1d, tmp2d) + //targetValRefs ++= Seq(tmp1r, tmp2r) + tmpAssigns1 :+= LocalVarAssign(tmp1r, t)() + tmpAssigns2 :+= LocalVarAssign(tmp2r, translatePrime(t, p1, p2))() + val eq1 = EqCmp(tmp1r, t)() + val eq2 = EqCmp(tmp2r, translatePrime(t, p1, p2))() + targetValEqualities1 ++= Seq(eq1) + targetValEqualities2 ++= Seq(eq2) + } + } + if (tmpAssigns1.nonEmpty) targetValAssigns :+= If(bypass1r, Seqn(tmpAssigns1, Seq())(), skip)() + if (tmpAssigns2.nonEmpty) targetValAssigns :+= If(bypass2r, Seqn(tmpAssigns2, Seq())(), skip)() + + /*if (timing){ + val (tmp1d, tmp1r) = getNewVar("tmp1", Int) + val (tmp2d, tmp2r) = getNewVar("tmp2", Int) + newVarDecls ++= Seq(tmp1d, tmp2d) + val assign1 = LocalVarAssign(tmp1r, time.get)() + val assign2 = LocalVarAssign(tmp2r, translatePrime(time.get, p1, p2))() + targetValAssigns ++= Seq(assign1, assign2) + val eq1 = EqCmp(tmp1r, time.get)() + val eq2 = EqCmp(tmp2r, translatePrime(time.get, p1, p2))() + targetValEqualities1 ++= Seq(eq1) + targetValEqualities2 ++= Seq(eq2) + }*/ + stmts ++= targetValAssigns + + // tmp assigns for all ctrlVars + var ctrlVarToOldMap: Map[LocalVar, LocalVar] = Map() + if (recNeeded) { + var ctrlFlowTmpAssigns = Seq[Stmt]() + for (v <- ctrlVars.declarations().map(d => d.localVar)) { + val (tmp1d, tmp1r) = getNewBool("old" + v.name) + ctrlVarToOldMap += (v -> tmp1r) + newVarDecls :+= tmp1d + stmts :+= LocalVarAssign(tmp1r, v)() + ctrlFlowTmpAssigns :+= LocalVarAssign(v, tmp1r)() + } + } + + val newCond = Or(And(And(ctrlVars.activeExecNoContNormal(Some(p1)), Not(bypass1r)())(), w.cond)(), + And(And(ctrlVars.activeExecNoContPrime(Some(p2)), Not(bypass2r)())(), translatePrime(w.cond, p1, p2))())() + var bodyPreamble: Seq[Stmt] = Seq() + if (ctrlVars.cont1r.isDefined) bodyPreamble = bodyPreamble :+ + LocalVarAssign(ctrlVars.cont1r.get, FalseLit()())() :+ + LocalVarAssign(ctrlVars.cont2r.get, FalseLit()())() + val (p1d, p1r) = getNewBool("p1") + val (p2d, p2r) = getNewBool("p2") + newVarDecls ++= Seq(p1d, p2d) + val p1Assign = LocalVarAssign(p1r, And(ctrlVars.activeExecNormal(Some(p1)), w.cond)())() + val p2Assign = LocalVarAssign(p2r, And(ctrlVars.activeExecPrime(Some(p2)), translatePrime(w.cond, p1, p2))())() + bodyPreamble ++= Seq(p1Assign, p2Assign) + + var newStdInvs = w.invs + // check if there is an InhaleExhaleExp in invariants + if (w.invs.exists(inv => inv.contains[InhaleExhaleExp])) { + val (idle1d, idle1r) = getNewBool("idle1") + val (idle2d, idle2r) = getNewBool("idle2") + primedNames.update(idle1r.name, idle2r.name) + newVarDecls ++= Seq(idle1d, idle2d) + // assign false before the loop + stmts ++= Seq(LocalVarAssign(idle1r, FalseLit()())(), + LocalVarAssign(idle2r, FalseLit()())()) + // assign inside loop body that the execution is idling + val idle1Assign = LocalVarAssign(idle1r, + And(ctrlVars.activeExecNormal(Some(p1)), Not(w.cond)())())() + val idle2Assign = LocalVarAssign(idle2r, + And(ctrlVars.activeExecPrime(Some(p2)), Not(translatePrime(w.cond, p1, p2))())())() + bodyPreamble ++= Seq(idle1Assign, idle2Assign) + // make all exhales of InhaleExhales dependent on not idling + newStdInvs = newStdInvs.map(inv => inv.transform{ + case ie@InhaleExhaleExp(in, ex) => InhaleExhaleExp(in, + Implies(Not(idle1r)(), ex)())(ie.pos, ie.info, ie.errT) + }) + } + + // --- Terminates --- + var terminates: Option[SIFTerminatesExp] = None + w.invs.foreach(inv => inv.visit{ + case t: SIFTerminatesExp => terminates = Some(t) + }) + if (terminates.isDefined) { + stmts ++= terminationChannelsLowChecks(terminates.get, ctx) + .map(tc => Assert(tc)(tc.pos, tc.info, tc.errT)) + val (cond1d, cond1r) = getNewBool("cond") + val (cond2d, cond2r) = getNewBool("cond") + primedNames.update(cond1r.name, cond2r.name) + newVarDecls ++= Seq(cond1d, cond2d) + stmts ++= Seq(If(p1, Seqn(Seq(LocalVarAssign(cond1r, terminates.get.cond)()), Seq())(), skip)(), + If(p2, Seqn(Seq(LocalVarAssign(cond2r, translatePrime(terminates.get.cond, p1, p2))()), Seq())(), skip)()) + newStdInvs :+= Implies(Not(cond1r)(), w.cond)( + terminates.get.pos, terminates.get.info, ErrTrafo({ + case _ => SIFTerminationChannelCheckFailed(terminates.get, SIFTermCondNotTight(terminates.get)) + })) + } + + val invCtx = ctx.copy( + p1 = And(p1, Not(bypass1r)())(), + p2 = And(p2, Not(bypass2r)())() + ) + /* + val invCtx = ctx.copy( + p1 = ctrlVars.activeExecNoContNormal(Some(p1)), + p2 = ctrlVars.activeExecNoContPrime(Some(p2)) + ) + */ + newStdInvs = simplifyConditions(newStdInvs.map(e => translateSIFAss(e, invCtx, invCtx))) + val newInvs: Seq[Exp] = newStdInvs ++ + targetValEqualities1.map(e => Implies(bypass1r, e)()) ++ + targetValEqualities2.map(e => Implies(bypass2r, e)()) + + val bodyRes = translateStatement(w.body, ctx.copy(p1 = p1r, p2 = p2r)) + /*val bodyPostamble = Seq( + Inhale(Or(Not(p1)(), ctrlVars.activeExecNoContNormal(None))())(), + Inhale(Or(Not(p2)(), ctrlVars.activeExecNoContPrime(None))())() + )*/ + stmts :+= While(newCond, newInvs, Seqn(bodyPreamble ++ Seq(bodyRes), Seq())())() + + // loop reconstruction + if (recNeeded) { + val recCond1 = And(Not(bypass1r)(), Seq(ctrlVars.ret1r, ctrlVars.break1r, ctrlVars.except1r) + .collect({ case Some(x) => x }) + .reduceRight[Exp]((x, y) => Or(x, y)()) + )() + val recCond2 = And(Not(bypass2r)(), Seq(ctrlVars.ret2r, ctrlVars.break2r, ctrlVars.except2r) + .collect({ case Some(x) => x }) + .reduceRight[Exp]((x, y) => Or(x, y)()))() + val recCond = Or(recCond1, recCond2)() + val ctrlVarAssigns: Seq[Stmt] = ctrlVars.declarations() + .map(d => d.localVar) + .map(v => LocalVarAssign(v, ctrlVarToOldMap(v))()) + val recInhales: Seq[Stmt] = Seq() :+ //newStdInvs.map(i => Inhale(i)()) :+ + Inhale(Implies(ctrlVars.activeExecNoContNormal(Some(p1)), w.cond)())() :+ + Inhale(Implies(ctrlVars.activeExecNoContNormal(Some(p2)), translatePrime(w.cond, p1, p2))())() + val recKillInhales: Seq[Stmt] = Seq( + Inhale(Or(Not(p1r)(), Not(ctrlVars.activeExecNoContNormal(None))())())(), + Inhale(Or(Not(p2r)(), Not(ctrlVars.activeExecNoContPrime(None))())())() + ) + val recThn = Seqn( + (ctrlVarAssigns ++ recInhales ++ bodyPreamble ++ Seq(bodyRes) ++ recKillInhales), + Seq())() + stmts :+= If(recCond, recThn, skip)(info=SimpleInfo(Seq("Loop Reconstruction.\n "))) + } + if (Seq(ctrlVars.break1r, ctrlVars.cont1r).collect({case Some(x) => x}).nonEmpty) { + stmts ++= Seq( + If(Not(bypass1r)(), Seqn(Seq(ctrlVars.break1r, ctrlVars.cont1r) + .collect({ case Some(x) => x }) + .map(v => LocalVarAssign(v, FalseLit()())()), + Seq())(), skip)(), + If(Not(bypass2r)(), Seqn(Seq(ctrlVars.break2r, ctrlVars.cont2r) + .collect({ case Some(x) => x }) + .map(v => LocalVarAssign(v, FalseLit()())()), + Seq())(), skip)() + ) + } + Seqn(stmts, newVarDecls)() + } + + /** Translate a try/catch block into MPP. + */ + private def translateTryCatchStmt(tryStmt: SIFTryCatchStmt, ctx: TranslationContext): Seqn = { + val p1 = ctx.p1; val p2 = ctx.p2; val ctrlVars = ctx.ctrlVars + var stmts: Seq[Stmt] = Seq() + var newVarDecls: Seq[LocalVarDecl] = Seq() + val hasFinally: Boolean = tryStmt.finallyBlock.isDefined + // bypass preamble + val (bypass1d, bypass1r) = getNewBool("bypass1") + val (bypass2d, bypass2r) = getNewBool("bypass2") + newVarDecls ++= Seq(bypass1d, bypass2d) + val bypassAssigns: Seq[Stmt] = bypassPreamble(p1, p2, ctrlVars, bypass1r, bypass2r) + stmts ++= bypassAssigns + // assigning old values of ret and except flags + def oldAssign(ctrl: Option[LocalVar], name: String): Option[LocalVar] = { + if (ctrl.isEmpty) return None + val (decl, v) = getNewBool(name) + newVarDecls :+= decl + stmts :+= LocalVarAssign(v, ctrl.get)() + Some(v) + } + var oldret1r, oldret2r, oldbreak1r, oldbreak2r, oldcont1r, oldcont2r, + oldexcept1r, oldexcept2r: Option[LocalVar] = None + if (hasFinally) { + oldret1r = oldAssign(ctrlVars.ret1r, name = "oldret1") + oldret2r = oldAssign(ctrlVars.ret2r, name = "oldret2") + oldbreak1r = oldAssign(ctrlVars.break1r, name = "oldbreak1") + oldbreak2r = oldAssign(ctrlVars.break2r, name = "oldbreak2") + oldcont1r = oldAssign(ctrlVars.cont1r, name = "oldcont1") + oldcont2r = oldAssign(ctrlVars.cont2r, name = "oldcont2") + oldexcept1r = oldAssign(ctrlVars.except1r, name = "oldexcept1") + oldexcept2r = oldAssign(ctrlVars.except2r, name = "oldexcept2") + } + // translate try body + stmts :+= translateStatement(tryStmt.body, ctx) + // create variable 'thisexcept', to express that we had an exception in this tryblock + val (thisexcept1d, thisexcept1r) = getNewBool("thisexcept1") + val (thisexcept2d, thisexcept2r) = getNewBool("thisexcept2") + newVarDecls ++= Seq(thisexcept1d, thisexcept2d) + stmts :+= LocalVarAssign(thisexcept1r, And(ctrlVars.except1r.get, Not(bypass1r)())())() + stmts :+= LocalVarAssign(thisexcept2r, And(ctrlVars.except2r.get, Not(bypass2r)())())() + // translate the exception handlers + for (handler <- tryStmt.catchBlocks) { + val (p1d, p1r) = getNewBool("p1") + val (p2d, p2r) = getNewBool("p2") + newVarDecls ++= Seq(p1d, p2d) + stmts = stmts :+ + LocalVarAssign(p1r, And(p1, And(thisexcept1r, translateNormal(handler.exception, p1, p2))())())() :+ + LocalVarAssign(p2r, And(p2, And(thisexcept2r, translatePrime(handler.exception, p1, p2))())())() :+ + If(p1r, Seqn(Seq(LocalVarAssign(ctrlVars.except1r.get, FalseLit()())()), Seq())(), skip)() :+ + If(p2r, Seqn(Seq(LocalVarAssign(ctrlVars.except2r.get, FalseLit()())()), Seq())(), skip)() + stmts :+= translateStatement(handler.body, TranslationContext(p1r, p2r, ctrlVars, ctx.currentMethod)) + // assign null to error variable if exception was caught + stmts :+= translateStatement(LocalVarAssign(handler.errVar, NullLit()())(), ctx) + } + // translate the else block + if (tryStmt.elseBlock.isDefined) { + val (p1d2, p1r2) = getNewBool("p1") + val (p2d2, p2r2) = getNewBool("p2") + newVarDecls ++= Seq(p1d2, p2d2) + stmts :+= LocalVarAssign(p1r2, And(p1, Not(thisexcept1r)())())() + stmts :+= LocalVarAssign(p2r2, And(p2, Not(thisexcept2r)())())() + stmts :+= translateStatement(tryStmt.elseBlock.get, TranslationContext(p1r2, p2r2, ctrlVars, ctx.currentMethod)) + } + // translate the finally block + if (hasFinally) { + def tmpAssigns(tuples: (LocalVar, Option[LocalVar], Option[LocalVar])*): Seq[Stmt] = { + tuples + .filter(tuple => tuple._2.isDefined) + .flatMap{ + case (tmp: LocalVar, ctrl: Option[LocalVar], old: Option[LocalVar]) => + Seq(LocalVarAssign(tmp, ctrl.get)(), + LocalVarAssign(ctrl.get, old.get)()) + } + } + def tmpReAssigns(tuples: (LocalVar, Option[LocalVar], Option[Seq[Option[LocalVar]]])*): Seq[Stmt] = { + tuples + .filter(tuple => tuple._2.isDefined) + .flatMap{ + case (tmp: LocalVar, ctrl: Option[LocalVar], None) => + Seq(LocalVarAssign(ctrl.get, Or(ctrl.get, tmp)())()) + case (tmp: LocalVar, ctrl: Option[LocalVar], Some(unless)) => + val negatedUnless = unless.map{ + case Some(v) => Some(Not(v)()) + case None => None + } + Seq(LocalVarAssign(ctrl.get, Or(ctrl.get, And(tmp, _conjoinOptions(negatedUnless))())())()) + } + } + + // store ret and except in tmp variables + val (tmpret1d, tmpret1r) = getNewBool("tmp_ret1") + val (tmpret2d, tmpret2r) = getNewBool("tmp_ret2") + val (tmpbreak1d, tmpbreak1r) = getNewBool("tmp_break1") + val (tmpbreak2d, tmpbreak2r) = getNewBool("tmp_break2") + val (tmpcont1d, tmpcont1r) = getNewBool("tmp_cont1") + val (tmpcont2d, tmpcont2r) = getNewBool("tmp_cont2") + val (tmpexcept1d, tmpexcept1r) = getNewBool("tmp_except1") + val (tmpexcept2d, tmpexcept2r) = getNewBool("tmp_except2") + newVarDecls ++= Seq(tmpret1d, tmpret2d, tmpbreak1d, tmpbreak2d, tmpcont1d, tmpcont2d, + tmpexcept1d, tmpexcept2d) + val tmpAssigns1: Seq[Stmt] = tmpAssigns( + (tmpret1r, ctrlVars.ret1r, oldret1r), + (tmpbreak1r, ctrlVars.break1r, oldbreak1r), + (tmpcont1r, ctrlVars.cont1r, oldcont1r), + (tmpexcept1r, ctrlVars.except1r, oldexcept1r) + ) + val tmpAssigns2: Seq[Stmt] = tmpAssigns( + (tmpret2r, ctrlVars.ret2r, oldret2r), + (tmpbreak2r, ctrlVars.break2r, oldbreak2r), + (tmpcont2r, ctrlVars.cont2r, oldcont2r), + (tmpexcept2r, ctrlVars.except2r, oldexcept2r) + ) + stmts :+= If(p1, Seqn(tmpAssigns1, Seq())(), skip)() + stmts :+= If(p2, Seqn(tmpAssigns2, Seq())(), skip)() + stmts :+= translateStatement(tryStmt.finallyBlock.get, ctx) + val tmpReAssigns1 = tmpReAssigns( + (tmpexcept1r, ctrlVars.except1r, Some(Seq(ctrlVars.ret1r, ctrlVars.break1r))), + (tmpret1r, ctrlVars.ret1r, None), + (tmpbreak1r, ctrlVars.break1r, None), + (tmpcont1r, ctrlVars.cont1r, None) + ) + val tmpReAssigns2 = tmpReAssigns( + (tmpexcept2r, ctrlVars.except2r, Some(Seq(ctrlVars.ret2r, ctrlVars.break2r))), + (tmpret2r, ctrlVars.ret2r, None), + (tmpbreak2r, ctrlVars.break2r, None), + (tmpcont2r, ctrlVars.cont2r, None) + ) + stmts :+= If(p1, Seqn(tmpReAssigns1, Seq())(), skip)() + stmts :+= If(p2, Seqn(tmpReAssigns2, Seq())(), skip)() + } + Seqn(stmts, newVarDecls)(info = SimpleInfo(Seq("Try/catch block\n "))) + } + + def translateStatement(s: Stmt, ctx: TranslationContext) : Stmt = { + val p1 = ctx.p1 + val p2 = ctx.p2 + val ctrlVars = ctx.ctrlVars + lazy val act1: Exp = ctx.ctrlVars.activeExecNormal(Some(p1)) + lazy val act2: Exp = ctx.ctrlVars.activeExecPrime(Some(p2)) + lazy val isInPreservesLow: Boolean = preservesLowMethods.contains(ctx.currentMethod.name) + + def executeConditionally(ift1: Seqn, ift2: Seqn): Stmt = { + val a1 = If(act1, ift1, skip)() + val a2 = If(act2, ift2, skip)() + Seqn(Seq(a1, a2, incrementTime(p1, p2)), Seq())() + } + def translateAssignment(to1: LocalVar, v1: Exp, to2: LocalVar, v2: Exp, orig: Stmt) : Stmt = { + executeConditionally( + Seqn(Seq(LocalVarAssign(to1, v1)(orig.pos, orig.info, orig.errT)), Seq())(), + Seqn(Seq(LocalVarAssign(to2, v2)(orig.pos, orig.info, orig.errT)), Seq())() + ) + } + + /** Return true if the statement can be bunched together with others, without doing the interleaving of the + * two executions, thus saving on the number of if-statements generated. + */ + def isCompressible(s: Stmt): Boolean = { + s match { + case _: LocalVarAssign => true + case Inhale(e) => isUnary(e) + case Exhale(e) => isUnary(e) + case _: SIFReturnStmt => true + case _: SIFBreakStmt => true + case _: SIFContinueStmt => true + case _: Goto => false + case _: Label => false + case _ => false + } + } + + /** Do the translation of a statement without wrapping it in an if statement. Just returns the two versions in a + * tuple, to allow putting multiple statements in an if block. Requires [[isCompressible(s)]]. + */ + def translateStmtPartial(s: Stmt): (Stmt, Stmt) = { + assert(isCompressible(s)) + s match { + case l@LocalVarAssign(lhs, rhs) => (LocalVarAssign(translateNormal(lhs, p1, p2), + translateNormal(rhs, p1, p2))(l.pos, l.info, l.errT), + LocalVarAssign(translatePrime(lhs, p1, p2), translatePrime(rhs, p1, p2))(l.pos, l.info, l.errT)) + case a@FieldAssign(lhs, rhs) => (a, FieldAssign(translatePrime(lhs, p1, p2), + translatePrime(rhs, p1, p2))(a.pos, a.info, a.errT)) + case i@Inhale(e) => (Inhale(translateNormal(e, p1, p2))(i.pos, i.info, i.errT), + Inhale(translatePrime(e, p1, p2))(i.pos, i.info, i.errT)) + case ex@Exhale(e) => (Exhale(translateNormal(e, p1, p2))(ex.pos, ex.info, ex.errT), + Exhale(translatePrime(e, p1, p2))(ex.pos, ex.info, ex.errT)) + case b: SIFBreakStmt => { + // TODO + (LocalVarAssign(ctrlVars.break1r.get, TrueLit()())(b.pos, b.info, b.errT), + LocalVarAssign(ctrlVars.break2r.get, TrueLit()())(b.pos, b.info, b.errT)) + } + case c: SIFContinueStmt => (LocalVarAssign(ctrlVars.cont1r.get, TrueLit()())(c.pos, c.info, c.errT), + LocalVarAssign(ctrlVars.cont2r.get, TrueLit()())(c.pos, c.info, c.errT)) + case r@SIFReturnStmt(e, resVar) => + { + // TODO + val assign1 = resVar match { + case Some(rv) => Seq(LocalVarAssign(translateNormal(rv, p1, p2), + translateNormal(e.get, p1, p2))(r.pos, r.info, r.errT)) + case None => Seq() + } + val assign2 = resVar match { + case Some(rv) => Seq(LocalVarAssign(translatePrime(rv, p1, p2), + translatePrime(e.get, p1, p2))(r.pos, r.info, r.errT)) + case None => Seq() + } + (Seqn(assign1 :+ LocalVarAssign(ctrlVars.ret1r.get, TrueLit()())(), Seq())(), + Seqn(assign2 :+ LocalVarAssign(ctrlVars.ret2r.get, TrueLit()())(), Seq())()) + } + + case _ => throw new IllegalArgumentException(s"The statement $s can't be translated partially") + } + } + + def optimizeSequential(s: Seqn): Seq[Stmt] = { + def sequenceSplit(in: Seq[Stmt]): (Seq[Stmt], Seq[Stmt]) = { + // ensure that we make a split after return, break, continue, raise, because the ctrlVars will have changed + var stop: Boolean = false + def keepGoing(stmt: Stmt): Boolean = { + val oldStop = stop + stmt match { + case _: SIFReturnStmt => stop = true + case _: SIFBreakStmt => stop = true + case _: SIFContinueStmt => stop = true + case _: SIFRaiseStmt => stop = true + case _ => + } + !oldStop && isCompressible(stmt) + } + in.span(stmt => keepGoing(stmt)) + } + + var newStmts = Seq[Stmt]() + var (comp, rest) = sequenceSplit(s.ss) + // println("optimizing compressible statements:") + while (comp.nonEmpty || rest.nonEmpty) { + // println(s"split into comp: $comp and rest: $rest") + // collect all compressible statements we have until here + if (comp.nonEmpty) { + val (fstExComp, secExComp): (Seq[Stmt], Seq[Stmt]) = comp.map(stmt => translateStmtPartial(stmt)).unzip + newStmts :+= executeConditionally(Seqn(fstExComp, Seq())(), Seqn(secExComp, Seq())()) + } + // translate all non-compressible statements + var split = rest.span(stmt => !isCompressible(stmt)) + val nonComp = split._1 + rest = split._2 + // println(s"split into non-comp: $nonComp and rest: $rest") + nonComp.foreach(stmt => newStmts :+= translateStatement(stmt, ctx)) + // start anew + split = sequenceSplit(rest) + comp = split._1 + rest = split._2 + } + newStmts + } + + s match { + case l@LocalVarAssign(lhs, rhs) => translateAssignment(translateNormal(lhs, p1, p2), + translateNormal(rhs, p1, p2), translatePrime(lhs, p1, p2), translatePrime(rhs, p1, p2), l) + case a@FieldAssign(lhs, rhs) => executeConditionally(Seqn(Seq(a), Seq())(), + Seqn(Seq(FieldAssign(translatePrime(lhs, p1, p2), + translatePrime(rhs, p1, p2))(a.pos, a.info, a.errT)), Seq())()) + case n@NewStmt(lhs, fields) => { + val allFields = fields ++ fields.map{f => newFields.find(f2 => f2.name == primedNames(f.name)).get} + val (tmpd, tmpr) = getNewVar("tmp", Ref) + val newNew = NewStmt(tmpr, allFields)() + /*val allFieldAssigns = allFields.map { f => + val (hd, hr) = getNewVar("havoc", f.typ) + val fieldAcc = FieldAccess(tmpr, f)() + Seqn(Seq(FieldAssign(fieldAcc, hr)()), Seq(hd))() + }*/ + val assign1 = If(act1, Seqn(Seq(LocalVarAssign(lhs, tmpr)()), Seq())(), skip)() + val assign2 = If(act2, Seqn(Seq(LocalVarAssign(translatePrime(lhs, p1, p2), tmpr)()), + Seq())(), skip)() + Seqn(Seq(newNew) ++ /*allFieldAssigns ++*/ Seq(assign1, assign2, incrementTime(p1, p2)), Seq(tmpd))() + } + case i@If(cond, thn, els) => { + val (p1d, p1r) = getNewBool("p1") + val (p2d, p2r) = getNewBool("p2") + val (p3d, p3r) = getNewBool("p3") + val (p4d, p4r) = getNewBool("p4") + + val p1Assign = LocalVarAssign(p1r, And(act1, cond)())(i.pos) + val p2Assign = LocalVarAssign(p2r, And(act2, translatePrime(cond, p1, p2))())(i.pos) + val p3Assign = LocalVarAssign(p3r, And(act1, Not(cond)())())(i.pos) + val p4Assign = LocalVarAssign(p4r, And(act2, Not(translatePrime(cond, p1, p2))())())(i.pos) + + val thnRes = translateStatement(thn, TranslationContext(p1r, p2r, ctrlVars, ctx.currentMethod)) + val elsRes = translateStatement(els, TranslationContext(p3r, p4r, ctrlVars, ctx.currentMethod)) + Seqn(Seq(p1Assign, p2Assign, p3Assign, p4Assign, incrementTime(p1, p2), thnRes, elsRes), Seq(p1d, p2d, p3d, p4d))() + } + case w: While => translateWhileStmt(w, ctx) + case mc@MethodCall(name, args, targets) => { + var argDecls = Seq[LocalVarDecl]() + var newArgs = Seq[Exp](act1, act2) + var argAssigns1 = Seq[LocalVarAssign]() + var argAssigns2 = Seq[LocalVarAssign]() + + if (timing){ + newArgs ++= Seq(time.get, translatePrime(time.get, p1, p2)) + } + + for (a <- args){ + val (tmp1d, tmp1r) = getNewVar("tmp1", a.typ) + val (tmp2d, tmp2r) = getNewVar("tmp2", a.typ) + argDecls ++= Seq(tmp1d, tmp2d) + newArgs ++= Seq(tmp1r, tmp2r) + argAssigns1 :+= LocalVarAssign(tmp1r, a)() + argAssigns2 :+= LocalVarAssign(tmp2r, translatePrime(a, p1, p2))() + } + val argAssignsConditional: Seq[Stmt] = Seq( + If(act1, Seqn(argAssigns1, Seq())(), skip)(), + If(act2, Seqn(argAssigns2, Seq())(), skip)() + ) + + var targetDecls = Seq[LocalVarDecl]() + var newTargets = Seq[LocalVar]() + var targetAssigns1 = Seq[LocalVarAssign]() + var targetAssigns2 = Seq[LocalVarAssign]() + + if (timing){ + newTargets ++= Seq(time.get, translatePrime(time.get, p1, p2)) + } + + for (t <- targets){ + val (tmp1d, tmp1r) = getNewVar("tmp1", t.typ) + val (tmp2d, tmp2r) = getNewVar("tmp2", t.typ) + targetDecls ++= Seq(tmp1d, tmp2d) + newTargets ++= Seq(tmp1r, tmp2r) + targetAssigns1 :+= LocalVarAssign(t, tmp1r)() + targetAssigns2 :+= LocalVarAssign(translatePrime(t, p1, p2), tmp2r)() + } + val targetAssignsConditional = if (targets.nonEmpty) Seq[Stmt]( + If(act1, Seqn(targetAssigns1, Seq())(), skip)(), + If(act2, Seqn(targetAssigns2, Seq())(), skip)() + ) else Seq() + + val call = MethodCall(name, newArgs, newTargets)(mc.pos, mc.info, mc.errT) + If(Or(act1, act2)(), + Seqn(argAssignsConditional ++ Seq(call) ++ targetAssignsConditional, argDecls ++ targetDecls)(), + skip + )(info = SimpleInfo(Seq(s"Method call: $name\n "))) + } + case s: Seqn => { + val seq = if (Config.optimizeSequential) flattenSeqn(s) else s + var newDecls = Seq[Declaration]() + for (d <- seq.scopedDecls.filter(d => d.isInstanceOf[LocalVarDecl])){ + val newName = getName(d.name) + primedNames.update(d.name, newName) + val newD = LocalVarDecl(newName, d.asInstanceOf[LocalVarDecl].typ)() + newDecls ++= Seq(d, newD) + } + newDecls ++= seq.scopedDecls.filter(d => d.isInstanceOf[Label]) + val newStmts = if (Config.optimizeSequential) optimizeSequential(seq) + else seq.ss.map{stmt => translateStatement(stmt, ctx)} + Seqn(newStmts, newDecls)() + } + case a@Assert(e1) => + val newCtx = a.info.getUniqueInfo[SIFInfo] match { + case Some(info) if info.continueUnaware => ctx.copy(p1 = ctrlVars.activeExecNoContNormal(Some(p1)), + p2 = ctrlVars.activeExecNoContPrime(Some(p2))) + case _ => ctx.copy(p1 = act1, p2 = act2) + } + Assert(translateSIFAss(e1, newCtx))(s.pos, errT= fwTs(s, s)) + case i@Inhale(FalseLit()) => i + case Assume(e1) => Assume(translateSIFAss(e1, ctx.copy(p1 = act1, p2 = act2)))(s.pos, errT= fwTs(s, s)) + case Inhale(e1) => Inhale(translateSIFAss(e1, ctx.copy(p1 = act1, p2 = act2)))(s.pos, errT= fwTs(s, s)) + case Exhale(e1) => Exhale(translateSIFAss(e1, ctx.copy(p1 = act1, p2 = act2)))(s.pos, errT= fwTs(s, s)) + case d : LocalVarDeclStmt => d + case u@Unfold(acc) => + val predicate2 = PredicateAccess(acc.loc.args.map(a => translatePrime(a, p1, p2)), + primedNames(acc.loc.predicateName))() + val (lowFunc, lhs) = getPredicateLowFuncExp(acc.loc.predicateName, ctx) + val assert = lowFunc match { + case Some(f) => + val et = ErrTrafo({case _: AssertFailed => errors.UnfoldFailed(u, SIFUnfoldNotLow(u))}) + Assert(Implies( + lhs, + Implies( + And( + PermGeCmp(CurrentPerm(acc.loc)(), FullPerm()())(), + PermGeCmp(CurrentPerm(predicate2)(), FullPerm()())() + )(), + FuncApp(f, acc.loc.args ++ acc.loc.args.map(a => translatePrime(a, p1, p2)))() + )())() + )(u.pos, u.info, errT = et) + case None => skip + } + val if1 = If(act1, Seqn(Seq(u), Seq())(), skip)() + val if2 = If(act2, Seqn(Seq( + Unfold(PredicateAccessPredicate(predicate2, translatePrime(acc.perm, p1, p2))())(u.pos, u.info, u.errT) + ), Seq())(), skip)() + Seqn(Seq(assert, if1, if2), Seq())() + case f@Fold(acc) => + val if1 = If(act1, Seqn(Seq(f), Seq())(), skip)() + val if2 = If(act2, Seqn(Seq( + Fold(PredicateAccessPredicate( + PredicateAccess(acc.loc.args.map(a => translatePrime(a, p1, p2)), + primedNames(acc.loc.predicateName))(), translatePrime(acc.perm, p1, p2))())(f.pos, f.info, f.errT) + ), Seq())(), skip)() + val (lowFunc, lhs) = getPredicateLowFuncExp(acc.loc.predicateName, ctx) + val assert: Stmt = lowFunc match { + case Some(func) => + val et = ErrTrafo({case AssertFailed(_,_,_) => errors.FoldFailed(f, SIFFoldNotLow(f))}) + Assert(Implies( + lhs, + FuncApp(func.copy()(func.pos, func.info, errT = et), + acc.loc.args ++ acc.loc.args.map(a => translatePrime(a, p1, p2)))() + )())(f.pos, f.info, errT = et) + case None => skip + } + Seqn(Seq(if1, if2, assert), Seq())() + case r: SIFReturnStmt => { + // TODO + val (first, second) = translateStmtPartial(r).asInstanceOf[(Seqn, Seqn)] + val r1 = If(act1, first, skip)() + val r2 = If(act2, second, skip)() + Seqn(Seq(r1, r2, incrementTime(p1, p2)), Seq())() + } + case b@SIFBreakStmt() => { + // TODO + translateAssignment(ctrlVars.break1r.get, TrueLit()(), + ctrlVars.break2r.get, TrueLit()(), b) + } + case c@SIFContinueStmt() => translateAssignment(ctrlVars.cont1r.get, TrueLit()(), + ctrlVars.cont2r.get, TrueLit()(), c) + case tryCatch: SIFTryCatchStmt => translateTryCatchStmt(tryCatch, ctx) + case SIFRaiseStmt(assignment) => + var stmts = Seq[Stmt]() + val assign1 = assignment match { + case Some(a) => Some(LocalVarAssign(translateNormal(a.lhs, p1, p2), + translateNormal(a.rhs, p1, p2))()) + case None => None + } + val assign2 = assignment match { + case Some(a) => Some(LocalVarAssign(translatePrime(a.lhs, p1, p2), + translatePrime(a.rhs, p1, p2))()) + case None => None + } + stmts :+= If(act1, + Seqn(Seq(assign1, Some(LocalVarAssign(ctrlVars.except1r.get, TrueLit()())())) + .collect({case Some(x) => x}), Seq())(), + skip)() + stmts :+= If(act2, + Seqn(Seq(assign2, Some(LocalVarAssign(ctrlVars.except2r.get, TrueLit()())())) + .collect({case Some(x) => x}), Seq())(), + skip)() + Seqn(stmts, Seq())() + case d@SIFDeclassifyStmt(e) => Inhale(Implies( + And(act1, act2)(), EqCmp(translateNormal(e, p1, p2), translatePrime(e, p1, p2))() + )())(d.pos, d.info, d.errT) + case SIFAssertNoException() => + val exp: Exp = if (ctrlVars.except1r.isDefined) And( + Implies(p1, Not(ctrlVars.except1r.get)())(s.pos, s.info, s.errT), + Implies(p2, Not(ctrlVars.except2r.get)())(s.pos, s.info, s.errT) + )(s.pos, s.info, s.errT) + else TrueLit()() + Exhale(exp)(s.pos, s.info, s.errT) + case SIFInlinedCallStmt(stmts) => + val newCtrlVars = createControlFlowVars(stmts) + val inlinedCtx = TranslationContext(p1, p2, newCtrlVars, ctx.currentMethod) + Seqn(newCtrlVars.initAssigns() :+ translateStatement(stmts, inlinedCtx), newCtrlVars.declarations())() + case g@Goto(l) => { + val varName1 = ctrlVars.labelNames.get(l).get + val varName2 = primedNames.get(varName1).get + val assign1 = If(act1, Seqn(Seq(LocalVarAssign(LocalVar(varName1, Bool)(), TrueLit()())()), Seq())(), Seqn(Seq(), Seq())())() + val assign2 = If(act2, Seqn(Seq(LocalVarAssign(LocalVar(varName2, Bool)(), TrueLit()())()), Seq())(), Seqn(Seq(), Seq())())() + Seqn(Seq(assign1, assign2), Seq())() + } + case lb@Label(l, _) if ctrlVars.labelNames.contains(l) => { + val varName1 = ctrlVars.labelNames.get(l).get + val varName2 = primedNames.get(varName1).get + val thisAct1 = ctx.ctrlVars.activeExecNormalExceptLabel(Some(p1), varName1) + val thisAct2 = ctx.ctrlVars.activeExecPrimeExceptLabel(Some(p2), varName2) + val assign1 = If(thisAct1, Seqn(Seq(LocalVarAssign(LocalVar(varName1, Bool)(), FalseLit()())()), Seq())(), Seqn(Seq(), Seq())())() + val assign2 = If(thisAct2, Seqn(Seq(LocalVarAssign(LocalVar(varName2, Bool)(), FalseLit()())()), Seq())(), Seqn(Seq(), Seq())())() + Seqn(Seq(lb, assign1, assign2), Seq())() + } + case lb : Label => lb + case other => throw new IllegalArgumentException("unexpected: " + other) + } + } + + def getNewVar(name: String, typ: Type) : (LocalVarDecl, LocalVar) = { + val newName = getName(name) + (LocalVarDecl(newName, typ)(), LocalVar(newName, typ)()) + } + + def getNewBool(name: String) : (LocalVarDecl, LocalVar) = { + getNewVar(name, Bool) + } + + def isRelational(e: Exp): Boolean = { + !isUnary(e) + } + + def isUnary(e: Exp): Boolean = { + val relVars = e.filter{ + case _: SIFLowExp => true + case _: SIFLowEventExp => true + case f@DomainFuncApp("Low", args, _) => true + case _ => false + } + relVars.isEmpty + } + + def translateSIFExp1(e: Exp, p1: Exp, p2: Exp): Exp = { + e match { + case re if isRelational(e) => Implies(And(p1, p2)(), translateNormal(e, p1, p2))(e.pos, errT = fwTs(re, re)) + case re if isUnary(e) => translateNormal(e, p1, p2) + } + } + + def translateSIFExp2(e: Exp, p1: Exp, p2: Exp): Exp = { + e match { + case re if isRelational(e) => TrueLit()(e. pos, errT = fwTs(re, re)) + case _ => translatePrime(e, p1, p2) + } + } + + def translateSIFLowExpComparison(l: SIFLowExp, p1: Exp, p2: Exp): Exp = { + val primedExp = translatePrime(l.exp, p1, p2) + l.comparator match { + case None => EqCmp(l.exp, primedExp)(l.pos, errT = fwTs(l, l)) + case Some(str) => + _program.findDomainFunctionOptionally(str) match { + case Some(df) => DomainFuncApp(df, Seq(l.exp, primedExp), l.typVarMap)(l.pos, l.info, errT = fwTs(l, l)) + case None => _program.findFunctionOptionally(str) match { + case Some(f) => FuncApp(f, Seq(l.exp, primedExp))(l.pos, l.info, errT = fwTs(l, l)) + case None => sys.error(s"Unknown comparator $str.") + } + } + } + } + + def translateAssDefault(e: Exp, p1: Exp, p2: Exp): And = { + And(Implies(p1, translateSIFExp1(e, p1, p2))(e.pos, errT = fwTs(e, e)), + Implies(p2, translateSIFExp2(e, p1, p2))(e.pos, errT = fwTs(e, e)))(e.pos, errT = fwTs(e, e)) + } + + def fwTs(t: TransformableErrors, node: ErrorNode) = { + Trafos(t.errT.eTransformations, t.errT.rTransformations, Some(node)) + } + + def translateSIFAss(e: Exp, ctx: TranslationContext, relAssertCtx: TranslationContext = null): Exp = { + val p1 = ctx.p1 + val p2 = ctx.p2 + val relCtx = if (relAssertCtx == null) ctx else relAssertCtx + def bothExecutions(e: Exp, pos: Position = NoPosition, info: Info = NoInfo, + errT: ErrorTrafo = NoTrafos): Exp = { + Implies(And(relCtx.p1, relCtx.p2)(), e)(pos, info, errT) + } + + e match { + case And(e1, e2) => And(translateSIFAss(e1, ctx, relAssertCtx), translateSIFAss(e2, ctx, relAssertCtx))(e.pos, errT = fwTs(e, e)) + case i@Implies(e1, e2) if !isUnary(i) => { + Implies(translateSIFAss(e1, ctx, relAssertCtx), translateSIFAss(e2, ctx, relAssertCtx))(e.pos, errT = fwTs(e, e)) + } + case Implies(e1, e2) if e2.exists({ + case PredicateAccess(_, name) => predLowFuncs(name).isDefined + case _ => false + }) => + And(translateAssDefault(e, p1, p2), Implies( + translateSIFAss(e1, ctx, relAssertCtx), + translatePredLowFuncOnly(e2, p1, p2) + )())(e.pos, e.info, e.errT) + case fa@Forall(vars, triggers, exp) => { + if (fa.isPure){ + for (v <- vars){ + if (primedNames.contains(v.name)){ + primedNames.remove(v.name) + } + } + /*var varEqs: Exp = TrueLit()() + val pvars = vars.map { v => + val primeName = getName(v.name) + primedNames.update(v.name, primeName) + varEqs = And(varEqs, EqCmp(v.localVar, LocalVar(primeName)(v.typ))())() + LocalVarDecl(primedNames.get(v.name).get, v.typ)() + }*/ + val newTriggers = triggers.map{t => Trigger(t.exps.map{e => translatePrime(e, p1, p2)})()} + //val res = Forall(vars ++ pvars, newTriggers, Implies(varEqs, translateSIFAss(exp, p1, p2))(e.pos, errT = NodeTrafo(e)))(e.pos, errT = NodeTrafo(e)) + val res = Forall(vars, triggers ++ newTriggers, + translateSIFAss(exp, ctx, relAssertCtx))(e.pos, errT = fwTs(e, e)).autoTrigger + res + } else { + val normal = translateNormal(fa, p1, p2) + val prime = translatePrime(fa, p1, p2) + And(Implies(p1, normal)(e.pos, errT = fwTs(e, e)), Implies(p2, prime)(e.pos, errT = fwTs(e, e)))(e.pos, errT = fwTs(e, e)) + } + } + case l: SIFLowEventExp => + val act1 = ctx.ctrlVars.activeExecNormal(Some(p1)) + val act2 = ctx.ctrlVars.activeExecPrime(Some(p2)) + val dynCheckInfo = l.info.getUniqueInfo[SIFDynCheckInfo] + dynCheckInfo match { + case None => EqCmp(act1, act2)(e.pos, errT = fwTs(e, e)) + case Some(dci) => And(EqCmp(act1, act2)(e.pos, errT = fwTs(e, e)), Implies(act1, + EqCmp(translateNormal(dci.dynCheck, p1, p2), + translatePrime(dci.dynCheck, p1, p2))())())(e.pos, errT = fwTs(e, e)) + } + case l: SIFLowExitExp => + val act1 = ctx.ctrlVars.activeExecNoContNormal(None) + val act2 = ctx.ctrlVars.activeExecNoContPrime(None) + Implies(And(relCtx.p1, relCtx.p2)(), EqCmp(act1, act2)(e.pos, errT = fwTs(e, e)))(e.pos, errT = fwTs(e, e)) + case l@SIFLowExp(_, _, _) => + val comparison = translateSIFLowExpComparison(l, relCtx.p1, relCtx.p2) + val dynCheckInfo = l.info.getUniqueInfo[SIFDynCheckInfo] + dynCheckInfo match { + case None => bothExecutions(comparison, e.pos) + case Some(dci) => + val inhalePart = bothExecutions(Implies( + EqCmp(translateNormal(dci.dynCheck, relCtx.p1, relCtx.p2), translatePrime(dci.dynCheck, relCtx.p1, relCtx.p2))(), comparison + )(), e.pos) + if (dci.onlyDynVersion) { + inhalePart + } else { + InhaleExhaleExp(inhalePart, bothExecutions(comparison, e.pos) + )(l.pos, l.info, errT = fwTs(l, l)) + } + } + // for the domain method low, used e.g. for list resource + case f@DomainFuncApp("Low", args, _) => translateSIFAss( + SIFLowExp(args.head, None)(f.pos, f.info, f.errT), ctx, relAssertCtx) + case pap@PredicateAccessPredicate(pred, _) => + val (lowFunc, lhs) = getPredicateLowFuncExp(pred.predicateName, ctx) + lowFunc match { + case Some(f: Function) => + val lowFuncApp = Implies(lhs, + FuncApp(f, pred.args ++ pred.args.map(a => translatePrime(a, p1, p2)))(pap.pos, pap.info, pap.errT) + )() + val dynCheckInfo = pap.info.getUniqueInfo[SIFDynCheckInfo] + val lowPart: Exp = dynCheckInfo match { + case Some(dfi) => + val inhalePart = Implies( + EqCmp(translateNormal(dfi.dynCheck, p1, p2), translatePrime(dfi.dynCheck, p1, p2))(), + lowFuncApp + )(e.pos, e.info, e.errT) + if (dfi.onlyDynVersion) inhalePart + else InhaleExhaleExp(inhalePart, lowFuncApp)(e.pos, e.info, e.errT) + case None => lowFuncApp + } + And(translateAssDefault(pap, p1, p2), lowPart)(e.pos, errT = fwTs(e, e)) + case None => translateAssDefault(pap, p1, p2) + } + case o@Old(oldExp) => Old(translateSIFAss(oldExp, ctx, relAssertCtx))(o.pos, o.info, o.errT) + case FuncApp(name, _) if predAllLowFuncs.values.exists(v => v.isDefined && v.get.name == name) => + bothExecutions(e) + case Unfolding(predAcc, body) if !isUnary(body) => bothExecutions(Unfolding( + translateNormal(predAcc, relCtx.p1, relCtx.p2), + Unfolding(translatePrime(predAcc, relCtx.p1, relCtx.p2), + translateSIFAss(body, ctx, relAssertCtx))(e.pos, e.info, e.errT))(e.pos, e.info, e.errT), + e.pos, e.info, e.errT) + case _: SIFTerminatesExp => TrueLit()() + case _ => translateAssDefault(e, p1, p2) + } + } + + def translatePrime[T <: Exp](e: T, p1: Exp, p2: Exp) : T = { + e.transform{ + case d: LocalVarDecl if primedNames.contains(d.name) => + d.copy(name = primedNames(d.name))(d.pos, d.info, d.errT) + case l: LocalVar if primedNames.contains(l.name) => + l.copy(name = primedNames(l.name))(l.pos, l.info, l.errT) + case l: LocalVar if !primedNames.contains(l.name) => l + case FieldAccess(rcv, field) => + FieldAccess(translatePrime(rcv, p1, p2), newFields.find(f => f.name == primedNames(field.name)).get)(e.pos) + case f@FuncApp(name, _) if Config.primedFuncAppReplacements.keySet.contains(name) => + Config.primedFuncAppReplacements(name)(f, p1, p2) + case f@FuncApp(name, args) if primedNames.contains(name) => FuncApp(primedNames(name), + args.map(a => translatePrime(a, p1, p2)))(f.pos, f.info, f.typ, f.errT) + case df@DomainFuncApp(name, args, typVarMap) if primedNames.contains(name) => + DomainFuncApp( + primedNames(name), args.map(a => translatePrime(a, p1, p2)), typVarMap)( + df.pos, df.info, df.typ, df.domainName, df.errT) + case pa@PredicateAccess(args, "MayJoin") => PredicateAccess(args.map(a => translatePrime(a, p1, p2)), "MayJoinP")(pa.pos, pa.info, pa.errT) + case pa@PredicateAccess(args, name) => PredicateAccess(args.map(a => translatePrime(a, p1, p2)), + primedNames(name))(pa.pos, pa.info, pa.errT) + case l: SIFLowExp => Implies(And(p1, p2)(), translateSIFLowExpComparison(l, p1, p2))() + case f@DomainFuncApp("Low", args, _) => TrueLit()() + case f@ForPerm(vars, location, body) => ForPerm(vars, + translateResourceAccess(location), + translatePrime(body, p1, p2))(f.pos, f.info, f.errT) + } + } + + def translateNormal[T <: Exp](e: T, p1: Exp, p2: Exp): T = { + e.transform{ + case l: SIFLowExp => Implies(And(p1, p2)(), translateSIFLowExpComparison(l, p1, p2))() + case f@DomainFuncApp("Low", args, _) => Implies(And(p1, p2)(), translateSIFLowExpComparison(SIFLowExp(args.head)(), p1, p2))() + } + } + + def translateToUnary(e: Option[Exp]): Option[Exp] = { + e match { + case Some(x) => Some(translateToUnary(x)) + case None => None + } + } + + /** Translate an expression getting rid of all the relational parts. */ + def translateToUnary(e: Exp): Exp = { + val transformed = e.transform{ + case _: SIFLowExp => TrueLit()() + case f@DomainFuncApp("Low", args, _) => TrueLit()() + case Implies(_: SIFLowExp, _: SIFLowExp) => TrueLit()() + case i@Implies(lhs, rhs) => Implies(lhs, translateToUnary(rhs))(i.pos, i.info, i.errT) + } + Simplifier.simplify(transformed) + } + + /** Translate only the relational parts of an expression. All unary parts are translated to True. + * @param e The expression to translate. + * @return The translation of the relational parts of `e`. + */ + def translatePredLowFuncBody(e: Exp): Exp = { + val translated = e match { + case l: SIFLowExp => translateSIFLowExpComparison(l, null, null) + case p@PredicateAccessPredicate(loc, _) => + val (lowFName, formalArgs, duplicatedFormalArgs) = predLowFuncInfo(loc.predicateName).get + FuncApp(lowFName, + loc.args ++ loc.args.map(a => translatePrime(a, null, null)))( + p.pos, NoInfo, Bool, p.errT) + case a@And(left, right) => And(translatePredLowFuncBody(left), + translatePredLowFuncBody(right))(a.pos, a.info, a.errT) + case o@Or(left, right) => Or(translatePredLowFuncBody(left), + translatePredLowFuncBody(right))(o.pos, o.info, o.errT) + case i@Implies(left, right) => Implies(And(translateNormal(left, null, null), + translatePrime(left, null, null))(), + translatePredLowFuncBody(right) + )(i.pos, i.info, i.errT) + case _ => TrueLit()() + } + Simplifier.simplify(translated) + } + + def translatePredAllLowFuncBody(e: Exp): Exp = { + val translated = e match { + case FieldAccessPredicate(loc, _) => EqCmp(loc, translatePrime(loc, null, null))() + case p@PredicateAccessPredicate(loc, _) => + if (predAllLowFuncInfo(loc.predicateName).isDefined){ + val (lowFName, formalArgs, duplicatedFormalArgs) = predAllLowFuncInfo(loc.predicateName).get + FuncApp(lowFName, + loc.args ++ loc.args.map(a => translatePrime(a, null, null)))( + p.pos, NoInfo, Bool, p.errT) + }else{ + TrueLit()() + } + + case a@And(left, right) => And(translatePredAllLowFuncBody(left), + translatePredAllLowFuncBody(right))(a.pos, a.info, a.errT) + case o@Or(left, right) => Or(translatePredAllLowFuncBody(left), + translatePredAllLowFuncBody(right))(o.pos, o.info, o.errT) + case i@Implies(left, right) => Implies(And(translateNormal(left, null, null), + translatePrime(left, null, null))(), + translatePredAllLowFuncBody(right) + )(i.pos, i.info, i.errT) + case _ => TrueLit()() + } + Simplifier.simplify(translated) + } + + def translatePredLowFuncOnly(e: Exp, p1: Exp, p2: Exp): Exp = { + val translated: Exp = e match { + case PredicateAccessPredicate(pred, _) => + predLowFuncs(pred.predicateName) match { + case Some(f: Function) => Implies(And(p1, p2)(), + FuncApp(f, pred.args ++ pred.args.map(a => translatePrime(a, p1, p2)))(e.pos, e.info, e.errT) + )() + case None => TrueLit()() + } + case a@And(left, right) => And(translatePredLowFuncOnly(left, p1, p2), + translatePredLowFuncOnly(right, p1, p2))(a.pos, a.info, a.errT) + case o@Or(left, right) => Or(translatePredLowFuncOnly(left, p1, p2), + translatePredLowFuncOnly(right, p1, p2))(o.pos, o.info, o.errT) + case i@Implies(left, right) => Implies(And(translateNormal(left, null, null), + translatePrime(left, null, null))(), + translatePredLowFuncOnly(right, p1, p2) + )(i.pos, i.info, i.errT) + case _ => TrueLit()() + } + Simplifier.simplify(translated) + } + + def translateResourceAccess(ra: ResourceAccess): ResourceAccess = { + ra match { + case FieldAccess(rcv, field) => { + val primedName = primedNames.getOrElse(field.name, field.name) + val newField = newFields.find(f => f.name == primedName).getOrElse(field) + FieldAccess(rcv, newField)(ra.pos, ra.info, ra.errT) + } + case PredicateAccess(args, name) => { + val primedName = primedNames.getOrElse(name, name) + PredicateAccess(args, primedName)(ra.pos, ra.info, ra.errT) + } + case _ => sys.error("Unsupported") + } + } + + def getPredicateLowFunction(predName: String, m: Method): Option[Function] = { + if (allLowMethods.contains(m.name) || preservesLowMethods.contains(m.name)) + predAllLowFuncs(predName) + else + predLowFuncs(predName) + } + + def getPredicateLowFuncExp(predName: String, ctx: TranslationContext): (Option[Function], Exp) = { + val lowFunc = getPredicateLowFunction(predName, ctx.currentMethod) + lazy val act1: Exp = ctx.ctrlVars.activeExecNormal(Some(ctx.p1)) + lazy val act2: Exp = ctx.ctrlVars.activeExecPrime(Some(ctx.p2)) + lazy val isInPreservesLow: Boolean = preservesLowMethods.contains(ctx.currentMethod.name) + lowFunc match { + case Some(f) => + var lhs = And(act1, act2)() + if (isInPreservesLow) { + val allStateLow = translateSIFAss(allVarsAndStateLow(ctx.currentMethod, ctx.currentMethod.formalArgs, + old = !ctx.translatingPrecond, predicateSrc = ctx.currentMethod.pres), ctx) + lhs = And(lhs, allStateLow)() + } + (Some(f), lhs) + case None => (None, TrueLit()()) + } + } + + def simplifyConditions(in: Seq[Exp]): Seq[Exp] = { + val simplified = in.map(e => e.transform{ + case x: Exp if x.isPure => Simplifier.simplify(x) + }) + simplified.filter(e => !e.isInstanceOf[TrueLit]) + } + + def flattenSeqn(in: Seqn): Seqn = { + var newDecls: Seq[Declaration] = in.scopedDecls + val newSS: Seq[Stmt] = in.ss.flatMap({ + case s: Seqn => + val innerFlat = flattenSeqn(s) + newDecls ++= innerFlat.scopedDecls + innerFlat.ss + case x: Stmt => Seq(x) + }) + Seqn(newSS, newDecls)(in.pos, in.info, in.errT) + } + + case class TranslationContext(p1: Exp, p2: Exp, + ctrlVars: MethodControlFlowVars, + currentMethod: Method, + translatingPrecond: Boolean = false + ) {} + + class MethodControlFlowVars(hasRet: Boolean, hasBreak: Boolean, hasCont: Boolean, hasExcept: Boolean, labels: Set[Label]) { + var ret1d, ret2d, break1d, break2d, cont1d, cont2d, except1d, except2d: Option[LocalVarDecl] = None + var ret1r, ret2r, break1r, break2r, cont1r, cont2r, except1r, except2r: Option[LocalVar] = None + val labelRefs1 : ListBuffer[LocalVar] = new ListBuffer[LocalVar]() + val labelDecls1 : ListBuffer[LocalVarDecl] = new ListBuffer[LocalVarDecl]() + val labelRefs2 : ListBuffer[LocalVar] = new ListBuffer[LocalVar]() + val labelDecls2 : ListBuffer[LocalVarDecl] = new ListBuffer[LocalVarDecl]() + val labelNames : mutable.HashMap[String, String] = new mutable.HashMap[String, String]() + + if (hasRet) {val t = getNewBool("ret1"); ret1d = Some(t._1); ret1r = Some(t._2)} + if (hasRet) {val t = getNewBool("ret2"); ret2d = Some(t._1); ret2r = Some(t._2)} + if (hasBreak) {val t = getNewBool("break1"); break1d = Some(t._1); break1r = Some(t._2)} + if (hasBreak) {val t = getNewBool("break2"); break2d = Some(t._1); break2r = Some(t._2)} + if (hasCont) {val t = getNewBool("cont1"); cont1d = Some(t._1); cont1r = Some(t._2)} + if (hasCont) {val t = getNewBool("cont2"); cont2d = Some(t._1); cont2r = Some(t._2)} + if (hasExcept) {val t = getNewBool("except1"); except1d = Some(t._1); except1r = Some(t._2)} + if (hasExcept) {val t = getNewBool("except2"); except2d = Some(t._1); except2r = Some(t._2)} + if (hasRet) primedNames.update(ret1r.get.name, ret2r.get.name) + if (hasBreak) primedNames.update(break1r.get.name, break2r.get.name) + if (hasCont) primedNames.update(cont1r.get.name, cont2r.get.name) + if (hasExcept) primedNames.update(except1r.get.name, except2r.get.name) + for (label <- labels){ + val t1 = getNewBool(label.name + "1") + labelRefs1.append(t1._2) + labelDecls1.append(t1._1) + labelNames.update(label.name, t1._2.name) + val t2 = getNewBool(label.name + "2") + labelRefs2.append(t2._2) + labelDecls2.append(t2._1) + primedNames.update(t1._2.name, t2._2.name) + } + + def declarations(): Seq[LocalVarDecl] = { + Seq(ret1d, ret2d, break1d, break2d, cont1d, cont2d, except1d, except2d) + .filter(v => v.isDefined) + .map(v => v.get) ++ labelDecls1 ++ labelDecls2 + } + + def initAssigns(): Seq[Stmt] = { + (Seq(ret1r, ret2r, break1r, break2r, cont1r, cont2r, except1r, except2r) + .filter(v => v.isDefined) + .map(v => LocalVarAssign(v.get, FalseLit()())())) ++ + (labelRefs1 ++ labelRefs2).map(v => LocalVarAssign(v, FalseLit()())()) + } + + private def conjoinVars(s: Seq[Exp]): Option[Exp] = { + val negations: Seq[Exp] = s.map(x => Not(x)()) + if (negations.nonEmpty) + Some(negations.reduceRight[Exp]((x, y) => And(x, y)())) + else + None + } + + private def activeExecHelper(p: Option[Exp], s: Seq[Exp]): Exp = { + val controls: Option[Exp] = conjoinVars(s) + val expressions: Seq[Exp] = Seq(p, controls).collect({case Some(x) => x}) + expressions match { + case Nil => TrueLit()() + case Seq(head) => head + case _ => expressions.reduceRight[Exp]((x, y) => And(x, y)()) + } + } + + def removeOptions(s: Seq[Option[Exp]]) : Seq[Exp] = { + s.filter(v => v.isDefined).map(v => v.get) + } + + def activeExecNormalExceptLabel(p1: Option[Exp], labelName: String): Exp = { + activeExecHelper(p1, removeOptions(Seq(ret1r, break1r, cont1r, except1r)) ++ labelRefs1.filter(v => !v.name.equals(labelName))) + } + + def activeExecPrimeExceptLabel(p2: Option[Exp], labelNamePrime: String): Exp = { + activeExecHelper(p2, removeOptions(Seq(ret2r, break2r, cont2r, except2r)) ++ labelRefs2.filter(v => !v.name.equals(labelNamePrime))) + } + + def activeExecNormal(p1: Option[Exp]): Exp = { + activeExecHelper(p1, removeOptions(Seq(ret1r, break1r, cont1r, except1r)) ++ labelRefs1) + } + def activeExecPrime(p2: Option[Exp]): Exp = { + activeExecHelper(p2, removeOptions(Seq(ret2r, break2r, cont2r, except2r)) ++ labelRefs2) + } + + def activeExecNoContNormal(p1: Option[Exp]): Exp = { + activeExecHelper(p1, removeOptions(Seq(ret1r, break1r, except1r)) ++ labelRefs1) + } + def activeExecNoContPrime(p2: Option[Exp]): Exp = { + activeExecHelper(p2, removeOptions(Seq(ret2r, break2r, except2r)) ++ labelRefs2) + } + } + + object EmptyControlFlowVars { + def apply(): MethodControlFlowVars = { + new MethodControlFlowVars(false, false, false, false, Set()) + } + } +} + +object SIFExtendedTransformer extends SIFExtendedTransformer + +class SIFTransformer extends ViperTransformer { + override def transform(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = { + Right(BackendVerifier.Task(SIFExtendedTransformer.transform(task.program, false), task.backtrack)) + } +} diff --git a/src/test/resources/regressions/examples/swap.gobra b/src/test/resources/regressions/examples/swap.gobra index 1e9298f73..03209ca68 100644 --- a/src/test/resources/regressions/examples/swap.gobra +++ b/src/test/resources/regressions/examples/swap.gobra @@ -7,21 +7,15 @@ type cell struct{ val int; }; -requires acc(&x.val) && acc(&y.val); -requires x.val == a && y.val == b; -ensures acc(&x.val) && acc(&y.val); -ensures x.val == b && y.val == a; -func swap1(x, y *cell, ghost a, b int) { - x.val, y.val = y.val, x.val; -}; - - -requires acc(&x.val) && acc(&y.val); -ensures acc(&x.val) && acc(&y.val); -ensures x.val == old(y.val) && y.val == old(x.val); -func swap2(x, y *cell) { - x.val, y.val = y.val, x.val; -}; +requires low(x) && low(y) +ensures low(z) +func foo(x, y int) (z int) { + if x < y { + z = 3 + } else { + z = 4 + } +} requires acc(&self.val) && acc(&other.val); ensures acc(&self.val) && acc(&other.val); @@ -35,17 +29,8 @@ func client() { x@ := cell{42}; y@ := cell{17}; - swap1(&x, &y, 42, 17); - assert x == cell{17} && y.val == 42; - - swap2(&x, &y); - assert x == cell{42} && y == cell{17}; - (&x).swap3(&y); assert x == cell{17} && y == cell{42}; - - //:: ExpectedOutput(assert_error:assertion_error) - assert false; };