diff --git a/ast/command/mapping.go b/ast/command/mapping.go index d5c1a82d..7f9d1443 100644 --- a/ast/command/mapping.go +++ b/ast/command/mapping.go @@ -39,6 +39,7 @@ func init() { UserCmd: User, VolumeCmd: Volume, WorkdirCmd: Workdir, + FunctionCmd: Function, } } diff --git a/ast/command/names.go b/ast/command/names.go index 76a02805..9dae63dc 100644 --- a/ast/command/names.go +++ b/ast/command/names.go @@ -7,6 +7,7 @@ const ( Cache = "CACHE" Cmd = "CMD" Command = "COMMAND" + Function = "FUNCTION" Copy = "COPY" Do = "DO" Docker = "DOCKER" diff --git a/ast/command/types.go b/ast/command/types.go index aec1728e..6ea2e3e0 100644 --- a/ast/command/types.go +++ b/ast/command/types.go @@ -39,4 +39,5 @@ const ( UserCmd // "USER" VolumeCmd // "VOLUME" WorkdirCmd // "WORKDIR" + FunctionCmd // "FUNCTION" ) diff --git a/ast/listener.go b/ast/listener.go index 31fdacff..3c5403ae 100644 --- a/ast/listener.go +++ b/ast/listener.go @@ -30,12 +30,12 @@ type block struct { type listener struct { *parser.BaseEarthParserListener - tokStream *antlr.CommonTokenStream - ef *spec.Earthfile - target *spec.Target - userCommand *spec.UserCommand - blocks []*block - command *spec.Command + tokStream *antlr.CommonTokenStream + ef *spec.Earthfile + target *spec.Target + function *spec.Function + blocks []*block + command *spec.Command stmtWords []string execMode bool @@ -154,9 +154,9 @@ func (l *listener) ExitTarget(c *parser.TargetContext) { // User command --------------------------------------------------------------- func (l *listener) EnterUserCommand(c *parser.UserCommandContext) { - l.userCommand = new(spec.UserCommand) + l.function = new(spec.Function) if l.enableSourceMap { - l.userCommand.SourceLocation = &spec.SourceLocation{ + l.function.SourceLocation = &spec.SourceLocation{ File: l.filePath, StartLine: c.GetStart().GetLine(), StartColumn: c.GetStart().GetColumn(), @@ -168,13 +168,39 @@ func (l *listener) EnterUserCommand(c *parser.UserCommandContext) { } func (l *listener) EnterUserCommandHeader(c *parser.UserCommandHeaderContext) { - l.userCommand.Name = strings.TrimSuffix(c.GetText(), ":") + l.function.Name = strings.TrimSuffix(c.GetText(), ":") } func (l *listener) ExitUserCommand(c *parser.UserCommandContext) { - l.userCommand.Recipe = l.popBlock() - l.ef.UserCommands = append(l.ef.UserCommands, *l.userCommand) - l.userCommand = nil + l.function.Recipe = l.popBlock() + l.ef.Functions = append(l.ef.Functions, *l.function) + l.function = nil +} + +// Function --------------------------------------------------------------- + +func (l *listener) EnterFunction(c *parser.FunctionContext) { + l.function = new(spec.Function) + if l.enableSourceMap { + l.function.SourceLocation = &spec.SourceLocation{ + File: l.filePath, + StartLine: c.GetStart().GetLine(), + StartColumn: c.GetStart().GetColumn(), + EndLine: c.GetStop().GetLine(), + EndColumn: c.GetStop().GetColumn(), + } + } + l.pushNewBlock() +} + +func (l *listener) EnterFunctionHeader(c *parser.FunctionHeaderContext) { + l.function.Name = strings.TrimSuffix(c.GetText(), ":") +} + +func (l *listener) ExitFunction(c *parser.FunctionContext) { + l.function.Recipe = l.popBlock() + l.ef.Functions = append(l.ef.Functions, *l.function) + l.function = nil } // Statement ------------------------------------------------------------------ @@ -329,6 +355,10 @@ func (l *listener) EnterUserCommandStmt(c *parser.UserCommandStmtContext) { l.command.Name = "COMMAND" } +func (l *listener) EnterFunctionStmt(c *parser.FunctionStmtContext) { + l.command.Name = "FUNCTION" +} + func (l *listener) EnterDoStmt(c *parser.DoStmtContext) { l.command.Name = "DO" } diff --git a/ast/parser/EarthLexer.g4 b/ast/parser/EarthLexer.g4 index 56fa8769..f94d8bfa 100644 --- a/ast/parser/EarthLexer.g4 +++ b/ast/parser/EarthLexer.g4 @@ -12,6 +12,7 @@ channels { Target: [a-z] ([a-zA-Z0-9.] | '-')* ':' -> pushMode(RECIPE); UserCommand: [A-Z] ([A-Z0-9._])* ':' -> pushMode(RECIPE); +Function: [A-Z] ([A-Z0-9._])* ':' -> pushMode(RECIPE); FROM: 'FROM' -> pushMode(COMMAND_ARGS); FROM_DOCKERFILE: 'FROM DOCKERFILE' -> pushMode(COMMAND_ARGS); @@ -40,6 +41,7 @@ HEALTHCHECK: 'HEALTHCHECK' -> pushMode(COMMAND_ARGS); SHELL: 'SHELL' -> pushMode(COMMAND_ARGS); DO: 'DO' -> pushMode(COMMAND_ARGS); COMMAND: 'COMMAND' -> pushMode(COMMAND_ARGS); +FUNCTION: 'FUNCTION' -> pushMode(COMMAND_ARGS); IMPORT: 'IMPORT' -> pushMode(COMMAND_ARGS); VERSION: 'VERSION' -> pushMode(COMMAND_ARGS); CACHE: 'CACHE' -> pushMode(COMMAND_ARGS); @@ -72,6 +74,7 @@ mode RECIPE; Target_R: Target -> type(Target); UserCommand_R: UserCommand -> type(UserCommand); +Function_R: Function -> type(Function); FROM_R: FROM -> type(FROM), pushMode(COMMAND_ARGS); FROM_DOCKERFILE_R: FROM_DOCKERFILE -> type(FROM_DOCKERFILE), pushMode(COMMAND_ARGS); @@ -100,6 +103,7 @@ HEALTHCHECK_R: HEALTHCHECK -> type(HEALTHCHECK), pushMode(COMMAND_ARGS); SHELL_R: SHELL -> type(SHELL), pushMode(COMMAND_ARGS); DO_R: DO -> type(DO), pushMode(COMMAND_ARGS); COMMAND_R: COMMAND -> type(COMMAND), pushMode(COMMAND_ARGS); +FUNCTION_R: FUNCTION -> type(FUNCTION), pushMode(COMMAND_ARGS); IMPORT_R: IMPORT -> type(IMPORT), pushMode(COMMAND_ARGS); CACHE_R: CACHE -> type(CACHE), pushMode(COMMAND_ARGS); HOST_R: HOST -> type(HOST), pushMode(COMMAND_ARGS); @@ -148,6 +152,7 @@ HEALTHCHECK_B: HEALTHCHECK -> type(HEALTHCHECK), pushMode(COMMAND_ARGS); SHELL_B: SHELL -> type(SHELL), pushMode(COMMAND_ARGS); DO_B: DO -> type(DO), pushMode(COMMAND_ARGS); COMMAND_B: COMMAND -> type(COMMAND), pushMode(COMMAND_ARGS); +FUNCTION_B: FUNCTION -> type(FUNCTION), pushMode(COMMAND_ARGS); IMPORT_B: IMPORT -> type(IMPORT), pushMode(COMMAND_ARGS); CACHE_B: CACHE -> type(CACHE), pushMode(COMMAND_ARGS); HOST_B: HOST -> type(HOST), pushMode(COMMAND_ARGS); diff --git a/ast/parser/EarthParser.g4 b/ast/parser/EarthParser.g4 index be96f6fd..0474ff92 100644 --- a/ast/parser/EarthParser.g4 +++ b/ast/parser/EarthParser.g4 @@ -12,6 +12,8 @@ target: targetHeader NL+ (INDENT NL* stmts? NL+ DEDENT)?; targetHeader: Target; userCommand: userCommandHeader NL+ (INDENT NL* stmts NL+ DEDENT)?; userCommandHeader: UserCommand; +function: functionHeader NL+ (INDENT NL* stmts NL+ DEDENT)?; +functionHeader: Function; stmts: stmt (NL+ stmt)*; @@ -49,6 +51,7 @@ commandStmt: | healthcheckStmt | shellStmt | userCommandStmt + | functionStmt | doStmt | importStmt | cacheStmt @@ -163,6 +166,7 @@ onbuildStmt: ONBUILD stmtWords?; healthcheckStmt: HEALTHCHECK stmtWords?; shellStmt: SHELL stmtWords?; userCommandStmt: COMMAND stmtWords?; +functionStmt: FUNCTION stmtWords?; doStmt: DO stmtWords?; importStmt: IMPORT stmtWords?; cacheStmt: CACHE stmtWords?; diff --git a/ast/parser/earth_lexer.go b/ast/parser/earth_lexer.go index 6b52545c..1bed7505 100644 --- a/ast/parser/earth_lexer.go +++ b/ast/parser/earth_lexer.go @@ -45,55 +45,55 @@ func earthlexerLexerInit() { "COMMAND_ARGS_KEY_VALUE_ASSIGNMENT", "COMMAND_ARGS_KEY_VALUE_LABEL", } staticData.literalNames = []string{ - "", "", "", "", "", "'FROM'", "'FROM DOCKERFILE'", "'LOCALLY'", "'COPY'", - "'SAVE ARTIFACT'", "'SAVE IMAGE'", "'RUN'", "'EXPOSE'", "'VOLUME'", + "", "", "", "", "", "", "'FROM'", "'FROM DOCKERFILE'", "'LOCALLY'", + "'COPY'", "'SAVE ARTIFACT'", "'SAVE IMAGE'", "'RUN'", "'EXPOSE'", "'VOLUME'", "'ENV'", "'ARG'", "'SET'", "'LET'", "'LABEL'", "'BUILD'", "'WORKDIR'", "'USER'", "'CMD'", "'ENTRYPOINT'", "'GIT CLONE'", "'ADD'", "'STOPSIGNAL'", - "'ONBUILD'", "'HEALTHCHECK'", "'SHELL'", "'DO'", "'COMMAND'", "'IMPORT'", - "'VERSION'", "'CACHE'", "'HOST'", "'PROJECT'", "'PIPELINE'", "'TRIGGER'", - "'WITH'", "", "", "", "", "", "", "", "", "'ELSE'", "'ELSE IF'", "'CATCH'", - "'FINALLY'", "'END'", + "'ONBUILD'", "'HEALTHCHECK'", "'SHELL'", "'DO'", "'COMMAND'", "'FUNCTION'", + "'IMPORT'", "'VERSION'", "'CACHE'", "'HOST'", "'PROJECT'", "'PIPELINE'", + "'TRIGGER'", "'WITH'", "", "", "", "", "", "", "", "", "'ELSE'", "'ELSE IF'", + "'CATCH'", "'FINALLY'", "'END'", } staticData.symbolicNames = []string{ - "", "INDENT", "DEDENT", "Target", "UserCommand", "FROM", "FROM_DOCKERFILE", - "LOCALLY", "COPY", "SAVE_ARTIFACT", "SAVE_IMAGE", "RUN", "EXPOSE", "VOLUME", - "ENV", "ARG", "SET", "LET", "LABEL", "BUILD", "WORKDIR", "USER", "CMD", - "ENTRYPOINT", "GIT_CLONE", "ADD", "STOPSIGNAL", "ONBUILD", "HEALTHCHECK", - "SHELL", "DO", "COMMAND", "IMPORT", "VERSION", "CACHE", "HOST", "PROJECT", - "PIPELINE", "TRIGGER", "WITH", "DOCKER", "IF", "TRY", "FOR", "WAIT", - "NL", "WS", "COMMENT", "ELSE", "ELSE_IF", "CATCH", "FINALLY", "END", - "Atom", "EQUALS", + "", "INDENT", "DEDENT", "Target", "UserCommand", "Function", "FROM", + "FROM_DOCKERFILE", "LOCALLY", "COPY", "SAVE_ARTIFACT", "SAVE_IMAGE", + "RUN", "EXPOSE", "VOLUME", "ENV", "ARG", "SET", "LET", "LABEL", "BUILD", + "WORKDIR", "USER", "CMD", "ENTRYPOINT", "GIT_CLONE", "ADD", "STOPSIGNAL", + "ONBUILD", "HEALTHCHECK", "SHELL", "DO", "COMMAND", "FUNCTION", "IMPORT", + "VERSION", "CACHE", "HOST", "PROJECT", "PIPELINE", "TRIGGER", "WITH", + "DOCKER", "IF", "TRY", "FOR", "WAIT", "NL", "WS", "COMMENT", "ELSE", + "ELSE_IF", "CATCH", "FINALLY", "END", "Atom", "EQUALS", } staticData.ruleNames = []string{ - "Target", "UserCommand", "FROM", "FROM_DOCKERFILE", "LOCALLY", "COPY", - "SAVE_ARTIFACT", "SAVE_IMAGE", "RUN", "EXPOSE", "VOLUME", "ENV", "ARG", - "SET", "LET", "LABEL", "BUILD", "WORKDIR", "USER", "CMD", "ENTRYPOINT", + "Target", "UserCommand", "Function", "FROM", "FROM_DOCKERFILE", "LOCALLY", + "COPY", "SAVE_ARTIFACT", "SAVE_IMAGE", "RUN", "EXPOSE", "VOLUME", "ENV", + "ARG", "SET", "LET", "LABEL", "BUILD", "WORKDIR", "USER", "CMD", "ENTRYPOINT", "GIT_CLONE", "ADD", "STOPSIGNAL", "ONBUILD", "HEALTHCHECK", "SHELL", - "DO", "COMMAND", "IMPORT", "VERSION", "CACHE", "HOST", "PROJECT", "PIPELINE", - "TRIGGER", "WITH", "DOCKER", "IF", "TRY", "FOR", "WAIT", "NL", "WS", - "COMMENT", "CRLF", "NL_NOLC", "LC", "Target_R", "UserCommand_R", "FROM_R", - "FROM_DOCKERFILE_R", "LOCALLY_R", "COPY_R", "SAVE_ARTIFACT_R", "SAVE_IMAGE_R", - "RUN_R", "EXPOSE_R", "VOLUME_R", "ENV_R", "ARG_R", "SET_R", "LET_R", - "LABEL_R", "BUILD_R", "WORKDIR_R", "USER_R", "CMD_R", "ENTRYPOINT_R", - "GIT_CLONE_R", "ADD_R", "STOPSIGNAL_R", "ONBUILD_R", "HEALTHCHECK_R", - "SHELL_R", "DO_R", "COMMAND_R", "IMPORT_R", "CACHE_R", "HOST_R", "PIPELINE_R", - "TRIGGER_R", "WITH_R", "DOCKER_R", "IF_R", "TRY_R", "FOR_R", "WAIT_R", - "NL_R", "WS_R", "COMMENT_R", "FROM_B", "FROM_DOCKERFILE_B", "LOCALLY_B", - "COPY_B", "SAVE_ARTIFACT_B", "SAVE_IMAGE_B", "RUN_B", "EXPOSE_B", "VOLUME_B", - "ENV_B", "ARG_B", "SET_B", "LET_B", "LABEL_B", "BUILD_B", "WORKDIR_B", - "USER_B", "CMD_B", "ENTRYPOINT_B", "GIT_CLONE_B", "ADD_B", "STOPSIGNAL_B", - "ONBUILD_B", "HEALTHCHECK_B", "SHELL_B", "DO_B", "COMMAND_B", "IMPORT_B", - "CACHE_B", "HOST_B", "WITH_B", "DOCKER_B", "IF_B", "ELSE", "ELSE_IF", - "TRY_B", "CATCH", "FINALLY", "FOR_B", "WAIT_B", "END", "NL_B", "WS_B", - "COMMENT_B", "Atom", "QuotedAtomPart", "ShellAtomPart", "RegularAtomPart", - "EscapedAtomPart", "NL_C", "WS_C", "COMMENT_C", "EQUALS", "Atom_CAKV", - "RegularAtomPart_CAKV", "NL_CAKV", "WS_CAKV", "COMMENT_CAKV", "Atom_CAKVA", - "NL_CAKVA", "WS_CAKVA", "COMMENT_CAKVA", "EQUALS_L", "Atom_CAKVL", "NL_CAKVL", - "WS_CAKVL", "COMMENT_CAKVL", + "DO", "COMMAND", "FUNCTION", "IMPORT", "VERSION", "CACHE", "HOST", "PROJECT", + "PIPELINE", "TRIGGER", "WITH", "DOCKER", "IF", "TRY", "FOR", "WAIT", + "NL", "WS", "COMMENT", "CRLF", "NL_NOLC", "LC", "Target_R", "UserCommand_R", + "Function_R", "FROM_R", "FROM_DOCKERFILE_R", "LOCALLY_R", "COPY_R", + "SAVE_ARTIFACT_R", "SAVE_IMAGE_R", "RUN_R", "EXPOSE_R", "VOLUME_R", + "ENV_R", "ARG_R", "SET_R", "LET_R", "LABEL_R", "BUILD_R", "WORKDIR_R", + "USER_R", "CMD_R", "ENTRYPOINT_R", "GIT_CLONE_R", "ADD_R", "STOPSIGNAL_R", + "ONBUILD_R", "HEALTHCHECK_R", "SHELL_R", "DO_R", "COMMAND_R", "FUNCTION_R", + "IMPORT_R", "CACHE_R", "HOST_R", "PIPELINE_R", "TRIGGER_R", "WITH_R", + "DOCKER_R", "IF_R", "TRY_R", "FOR_R", "WAIT_R", "NL_R", "WS_R", "COMMENT_R", + "FROM_B", "FROM_DOCKERFILE_B", "LOCALLY_B", "COPY_B", "SAVE_ARTIFACT_B", + "SAVE_IMAGE_B", "RUN_B", "EXPOSE_B", "VOLUME_B", "ENV_B", "ARG_B", "SET_B", + "LET_B", "LABEL_B", "BUILD_B", "WORKDIR_B", "USER_B", "CMD_B", "ENTRYPOINT_B", + "GIT_CLONE_B", "ADD_B", "STOPSIGNAL_B", "ONBUILD_B", "HEALTHCHECK_B", + "SHELL_B", "DO_B", "COMMAND_B", "FUNCTION_B", "IMPORT_B", "CACHE_B", + "HOST_B", "WITH_B", "DOCKER_B", "IF_B", "ELSE", "ELSE_IF", "TRY_B", + "CATCH", "FINALLY", "FOR_B", "WAIT_B", "END", "NL_B", "WS_B", "COMMENT_B", + "Atom", "QuotedAtomPart", "ShellAtomPart", "RegularAtomPart", "EscapedAtomPart", + "NL_C", "WS_C", "COMMENT_C", "EQUALS", "Atom_CAKV", "RegularAtomPart_CAKV", + "NL_CAKV", "WS_CAKV", "COMMENT_CAKV", "Atom_CAKVA", "NL_CAKVA", "WS_CAKVA", + "COMMENT_CAKVA", "EQUALS_L", "Atom_CAKVL", "NL_CAKVL", "WS_CAKVL", "COMMENT_CAKVL", } staticData.predictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 0, 54, 1354, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, + 4, 0, 56, 1400, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, @@ -125,117 +125,122 @@ func earthlexerLexerInit() { 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, - 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 1, 0, 1, 0, 5, 0, 326, 8, - 0, 10, 0, 12, 0, 329, 9, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 5, 1, 337, - 8, 1, 10, 1, 12, 1, 340, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, - 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, - 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, - 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, - 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, - 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, - 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, - 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, - 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, - 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, - 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, - 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, - 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, - 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, - 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, - 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, - 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, - 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, - 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, - 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, - 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, - 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, - 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, - 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, - 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, + 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, + 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 1, 0, 1, 0, 5, 0, + 336, 8, 0, 10, 0, 12, 0, 339, 9, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, + 5, 1, 347, 8, 1, 10, 1, 12, 1, 350, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 2, 5, 2, 358, 8, 2, 10, 2, 12, 2, 361, 9, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, + 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, + 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, + 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, + 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, + 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, + 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, + 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, + 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, + 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, + 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, + 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, + 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, + 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, + 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, + 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, + 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, + 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, + 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, + 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, + 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, + 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, + 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, + 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, + 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, - 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, - 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, - 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, + 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, + 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, + 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, - 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, - 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, - 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 5, 42, 704, - 8, 42, 10, 42, 12, 42, 707, 9, 42, 1, 42, 1, 42, 3, 42, 711, 8, 42, 1, - 43, 1, 43, 1, 43, 5, 43, 716, 8, 43, 10, 43, 12, 43, 719, 9, 43, 1, 43, - 1, 43, 1, 44, 5, 44, 724, 8, 44, 10, 44, 12, 44, 727, 9, 44, 1, 44, 1, - 44, 5, 44, 731, 8, 44, 10, 44, 12, 44, 734, 9, 44, 1, 44, 1, 44, 1, 45, - 1, 45, 1, 45, 3, 45, 741, 8, 45, 1, 46, 5, 46, 744, 8, 46, 10, 46, 12, - 46, 747, 9, 46, 1, 46, 1, 46, 5, 46, 751, 8, 46, 10, 46, 12, 46, 754, 9, - 46, 1, 46, 3, 46, 757, 8, 46, 1, 47, 1, 47, 4, 47, 761, 8, 47, 11, 47, - 12, 47, 762, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, - 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, - 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, - 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, - 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, - 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, - 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, - 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, - 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, - 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, - 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, - 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, - 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, - 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, - 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, - 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, - 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, - 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, - 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, - 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, - 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, - 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, - 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, - 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, - 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, - 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, - 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, - 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, - 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, - 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, - 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, - 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, - 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, - 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, - 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, - 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, - 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, - 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, - 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, - 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, - 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, - 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, - 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, - 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, - 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, - 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, - 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 4, - 135, 1223, 8, 135, 11, 135, 12, 135, 1224, 1, 136, 1, 136, 1, 136, 1, 136, - 1, 136, 5, 136, 1232, 8, 136, 10, 136, 12, 136, 1235, 9, 136, 1, 136, 1, - 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 4, 137, 1246, - 8, 137, 11, 137, 12, 137, 1247, 1, 137, 1, 137, 1, 138, 1, 138, 3, 138, - 1254, 8, 138, 1, 139, 1, 139, 1, 139, 1, 139, 5, 139, 1260, 8, 139, 10, - 139, 12, 139, 1263, 9, 139, 3, 139, 1265, 8, 139, 1, 140, 1, 140, 1, 140, - 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, - 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, - 1, 144, 4, 144, 1289, 8, 144, 11, 144, 12, 144, 1290, 1, 144, 1, 144, 1, - 145, 1, 145, 3, 145, 1297, 8, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, - 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, - 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, - 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, - 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, - 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, - 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 0, 0, 158, 7, 3, 9, 4, - 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, + 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, + 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, + 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, + 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, + 43, 1, 43, 1, 44, 5, 44, 736, 8, 44, 10, 44, 12, 44, 739, 9, 44, 1, 44, + 1, 44, 3, 44, 743, 8, 44, 1, 45, 1, 45, 1, 45, 5, 45, 748, 8, 45, 10, 45, + 12, 45, 751, 9, 45, 1, 45, 1, 45, 1, 46, 5, 46, 756, 8, 46, 10, 46, 12, + 46, 759, 9, 46, 1, 46, 1, 46, 5, 46, 763, 8, 46, 10, 46, 12, 46, 766, 9, + 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 3, 47, 773, 8, 47, 1, 48, 5, 48, + 776, 8, 48, 10, 48, 12, 48, 779, 9, 48, 1, 48, 1, 48, 5, 48, 783, 8, 48, + 10, 48, 12, 48, 786, 9, 48, 1, 48, 3, 48, 789, 8, 48, 1, 49, 1, 49, 4, + 49, 793, 8, 49, 11, 49, 12, 49, 794, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, + 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, + 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, + 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, + 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, + 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, + 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, + 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, + 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, + 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, + 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, + 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, + 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, + 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, + 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, + 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, + 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, + 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, + 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, + 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, + 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, + 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, + 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, + 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, + 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, + 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, + 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, + 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, + 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, + 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, + 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, + 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, + 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, + 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, + 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, + 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, + 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, + 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, + 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, + 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, + 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, + 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, + 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, + 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, + 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, + 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, + 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, + 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, + 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, + 4, 140, 1269, 8, 140, 11, 140, 12, 140, 1270, 1, 141, 1, 141, 1, 141, 1, + 141, 1, 141, 5, 141, 1278, 8, 141, 10, 141, 12, 141, 1281, 9, 141, 1, 141, + 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 4, 142, + 1292, 8, 142, 11, 142, 12, 142, 1293, 1, 142, 1, 142, 1, 143, 1, 143, 3, + 143, 1300, 8, 143, 1, 144, 1, 144, 1, 144, 1, 144, 5, 144, 1306, 8, 144, + 10, 144, 12, 144, 1309, 9, 144, 3, 144, 1311, 8, 144, 1, 145, 1, 145, 1, + 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, + 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, + 149, 1, 149, 4, 149, 1335, 8, 149, 11, 149, 12, 149, 1336, 1, 149, 1, 149, + 1, 150, 1, 150, 3, 150, 1343, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, + 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, + 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, + 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, + 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, + 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, + 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 0, 0, 163, 7, 3, 9, + 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, - 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 0, 99, 0, 101, + 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 0, 103, 0, 105, 0, 107, 0, 109, 0, 111, 0, 113, 0, 115, 0, 117, 0, 119, 0, 121, 0, 123, 0, 125, 0, 127, 0, 129, 0, 131, 0, 133, 0, 135, 0, 137, 0, 139, 0, 141, 0, 143, 0, 145, 0, 147, 0, 149, 0, 151, 0, 153, 0, 155, @@ -244,458 +249,474 @@ func earthlexerLexerInit() { 0, 193, 0, 195, 0, 197, 0, 199, 0, 201, 0, 203, 0, 205, 0, 207, 0, 209, 0, 211, 0, 213, 0, 215, 0, 217, 0, 219, 0, 221, 0, 223, 0, 225, 0, 227, 0, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, - 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 48, 257, 49, 259, 0, 261, 50, 263, - 51, 265, 0, 267, 0, 269, 52, 271, 0, 273, 0, 275, 0, 277, 53, 279, 0, 281, - 0, 283, 0, 285, 0, 287, 0, 289, 0, 291, 0, 293, 54, 295, 0, 297, 0, 299, - 0, 301, 0, 303, 0, 305, 0, 307, 0, 309, 0, 311, 0, 313, 0, 315, 0, 317, - 0, 319, 0, 321, 0, 7, 0, 1, 2, 3, 4, 5, 6, 10, 1, 0, 97, 122, 4, 0, 45, - 46, 48, 57, 65, 90, 97, 122, 1, 0, 65, 90, 4, 0, 46, 46, 48, 57, 65, 90, - 95, 95, 2, 0, 9, 9, 32, 32, 2, 0, 10, 10, 13, 13, 2, 0, 34, 34, 92, 92, - 6, 0, 9, 10, 13, 13, 32, 32, 34, 34, 41, 41, 92, 92, 5, 0, 9, 10, 13, 13, - 32, 32, 34, 34, 92, 92, 6, 0, 9, 10, 13, 13, 32, 32, 34, 34, 61, 61, 92, - 92, 1369, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, - 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, - 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, - 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, - 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, - 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, - 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, - 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, - 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, - 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, - 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, - 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 1, 103, - 1, 0, 0, 0, 1, 105, 1, 0, 0, 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, - 1, 111, 1, 0, 0, 0, 1, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, - 0, 0, 0, 1, 119, 1, 0, 0, 0, 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, - 125, 1, 0, 0, 0, 1, 127, 1, 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, - 0, 0, 1, 133, 1, 0, 0, 0, 1, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, - 1, 0, 0, 0, 1, 141, 1, 0, 0, 0, 1, 143, 1, 0, 0, 0, 1, 145, 1, 0, 0, 0, - 1, 147, 1, 0, 0, 0, 1, 149, 1, 0, 0, 0, 1, 151, 1, 0, 0, 0, 1, 153, 1, - 0, 0, 0, 1, 155, 1, 0, 0, 0, 1, 157, 1, 0, 0, 0, 1, 159, 1, 0, 0, 0, 1, - 161, 1, 0, 0, 0, 1, 163, 1, 0, 0, 0, 1, 165, 1, 0, 0, 0, 1, 167, 1, 0, - 0, 0, 1, 169, 1, 0, 0, 0, 1, 171, 1, 0, 0, 0, 1, 173, 1, 0, 0, 0, 1, 175, - 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 1, 179, 1, 0, 0, 0, 1, 181, 1, 0, 0, 0, - 1, 183, 1, 0, 0, 0, 1, 185, 1, 0, 0, 0, 1, 187, 1, 0, 0, 0, 2, 189, 1, - 0, 0, 0, 2, 191, 1, 0, 0, 0, 2, 193, 1, 0, 0, 0, 2, 195, 1, 0, 0, 0, 2, - 197, 1, 0, 0, 0, 2, 199, 1, 0, 0, 0, 2, 201, 1, 0, 0, 0, 2, 203, 1, 0, - 0, 0, 2, 205, 1, 0, 0, 0, 2, 207, 1, 0, 0, 0, 2, 209, 1, 0, 0, 0, 2, 211, - 1, 0, 0, 0, 2, 213, 1, 0, 0, 0, 2, 215, 1, 0, 0, 0, 2, 217, 1, 0, 0, 0, - 2, 219, 1, 0, 0, 0, 2, 221, 1, 0, 0, 0, 2, 223, 1, 0, 0, 0, 2, 225, 1, - 0, 0, 0, 2, 227, 1, 0, 0, 0, 2, 229, 1, 0, 0, 0, 2, 231, 1, 0, 0, 0, 2, - 233, 1, 0, 0, 0, 2, 235, 1, 0, 0, 0, 2, 237, 1, 0, 0, 0, 2, 239, 1, 0, - 0, 0, 2, 241, 1, 0, 0, 0, 2, 243, 1, 0, 0, 0, 2, 245, 1, 0, 0, 0, 2, 247, - 1, 0, 0, 0, 2, 249, 1, 0, 0, 0, 2, 251, 1, 0, 0, 0, 2, 253, 1, 0, 0, 0, - 2, 255, 1, 0, 0, 0, 2, 257, 1, 0, 0, 0, 2, 259, 1, 0, 0, 0, 2, 261, 1, - 0, 0, 0, 2, 263, 1, 0, 0, 0, 2, 265, 1, 0, 0, 0, 2, 267, 1, 0, 0, 0, 2, - 269, 1, 0, 0, 0, 2, 271, 1, 0, 0, 0, 2, 273, 1, 0, 0, 0, 2, 275, 1, 0, - 0, 0, 3, 277, 1, 0, 0, 0, 3, 287, 1, 0, 0, 0, 3, 289, 1, 0, 0, 0, 3, 291, - 1, 0, 0, 0, 4, 293, 1, 0, 0, 0, 4, 295, 1, 0, 0, 0, 4, 299, 1, 0, 0, 0, - 4, 301, 1, 0, 0, 0, 4, 303, 1, 0, 0, 0, 5, 305, 1, 0, 0, 0, 5, 307, 1, - 0, 0, 0, 5, 309, 1, 0, 0, 0, 5, 311, 1, 0, 0, 0, 6, 313, 1, 0, 0, 0, 6, - 315, 1, 0, 0, 0, 6, 317, 1, 0, 0, 0, 6, 319, 1, 0, 0, 0, 6, 321, 1, 0, - 0, 0, 7, 323, 1, 0, 0, 0, 9, 334, 1, 0, 0, 0, 11, 345, 1, 0, 0, 0, 13, - 352, 1, 0, 0, 0, 15, 370, 1, 0, 0, 0, 17, 380, 1, 0, 0, 0, 19, 387, 1, - 0, 0, 0, 21, 403, 1, 0, 0, 0, 23, 416, 1, 0, 0, 0, 25, 422, 1, 0, 0, 0, - 27, 431, 1, 0, 0, 0, 29, 440, 1, 0, 0, 0, 31, 446, 1, 0, 0, 0, 33, 452, - 1, 0, 0, 0, 35, 458, 1, 0, 0, 0, 37, 464, 1, 0, 0, 0, 39, 472, 1, 0, 0, - 0, 41, 480, 1, 0, 0, 0, 43, 490, 1, 0, 0, 0, 45, 497, 1, 0, 0, 0, 47, 503, - 1, 0, 0, 0, 49, 516, 1, 0, 0, 0, 51, 528, 1, 0, 0, 0, 53, 534, 1, 0, 0, - 0, 55, 547, 1, 0, 0, 0, 57, 557, 1, 0, 0, 0, 59, 571, 1, 0, 0, 0, 61, 579, - 1, 0, 0, 0, 63, 584, 1, 0, 0, 0, 65, 594, 1, 0, 0, 0, 67, 603, 1, 0, 0, - 0, 69, 613, 1, 0, 0, 0, 71, 621, 1, 0, 0, 0, 73, 628, 1, 0, 0, 0, 75, 638, - 1, 0, 0, 0, 77, 649, 1, 0, 0, 0, 79, 659, 1, 0, 0, 0, 81, 664, 1, 0, 0, - 0, 83, 674, 1, 0, 0, 0, 85, 680, 1, 0, 0, 0, 87, 687, 1, 0, 0, 0, 89, 694, - 1, 0, 0, 0, 91, 705, 1, 0, 0, 0, 93, 712, 1, 0, 0, 0, 95, 725, 1, 0, 0, - 0, 97, 740, 1, 0, 0, 0, 99, 756, 1, 0, 0, 0, 101, 758, 1, 0, 0, 0, 103, - 764, 1, 0, 0, 0, 105, 768, 1, 0, 0, 0, 107, 772, 1, 0, 0, 0, 109, 777, - 1, 0, 0, 0, 111, 782, 1, 0, 0, 0, 113, 787, 1, 0, 0, 0, 115, 792, 1, 0, - 0, 0, 117, 797, 1, 0, 0, 0, 119, 802, 1, 0, 0, 0, 121, 807, 1, 0, 0, 0, - 123, 812, 1, 0, 0, 0, 125, 817, 1, 0, 0, 0, 127, 822, 1, 0, 0, 0, 129, - 827, 1, 0, 0, 0, 131, 832, 1, 0, 0, 0, 133, 837, 1, 0, 0, 0, 135, 842, - 1, 0, 0, 0, 137, 847, 1, 0, 0, 0, 139, 852, 1, 0, 0, 0, 141, 857, 1, 0, - 0, 0, 143, 862, 1, 0, 0, 0, 145, 867, 1, 0, 0, 0, 147, 872, 1, 0, 0, 0, - 149, 877, 1, 0, 0, 0, 151, 882, 1, 0, 0, 0, 153, 887, 1, 0, 0, 0, 155, - 892, 1, 0, 0, 0, 157, 897, 1, 0, 0, 0, 159, 902, 1, 0, 0, 0, 161, 907, - 1, 0, 0, 0, 163, 912, 1, 0, 0, 0, 165, 917, 1, 0, 0, 0, 167, 922, 1, 0, - 0, 0, 169, 927, 1, 0, 0, 0, 171, 932, 1, 0, 0, 0, 173, 936, 1, 0, 0, 0, - 175, 942, 1, 0, 0, 0, 177, 948, 1, 0, 0, 0, 179, 954, 1, 0, 0, 0, 181, - 960, 1, 0, 0, 0, 183, 966, 1, 0, 0, 0, 185, 970, 1, 0, 0, 0, 187, 975, - 1, 0, 0, 0, 189, 980, 1, 0, 0, 0, 191, 985, 1, 0, 0, 0, 193, 990, 1, 0, - 0, 0, 195, 995, 1, 0, 0, 0, 197, 1000, 1, 0, 0, 0, 199, 1005, 1, 0, 0, - 0, 201, 1010, 1, 0, 0, 0, 203, 1015, 1, 0, 0, 0, 205, 1020, 1, 0, 0, 0, - 207, 1025, 1, 0, 0, 0, 209, 1030, 1, 0, 0, 0, 211, 1035, 1, 0, 0, 0, 213, - 1040, 1, 0, 0, 0, 215, 1045, 1, 0, 0, 0, 217, 1050, 1, 0, 0, 0, 219, 1055, - 1, 0, 0, 0, 221, 1060, 1, 0, 0, 0, 223, 1065, 1, 0, 0, 0, 225, 1070, 1, - 0, 0, 0, 227, 1075, 1, 0, 0, 0, 229, 1080, 1, 0, 0, 0, 231, 1085, 1, 0, - 0, 0, 233, 1090, 1, 0, 0, 0, 235, 1095, 1, 0, 0, 0, 237, 1100, 1, 0, 0, - 0, 239, 1105, 1, 0, 0, 0, 241, 1110, 1, 0, 0, 0, 243, 1115, 1, 0, 0, 0, - 245, 1120, 1, 0, 0, 0, 247, 1125, 1, 0, 0, 0, 249, 1130, 1, 0, 0, 0, 251, - 1134, 1, 0, 0, 0, 253, 1140, 1, 0, 0, 0, 255, 1146, 1, 0, 0, 0, 257, 1153, - 1, 0, 0, 0, 259, 1163, 1, 0, 0, 0, 261, 1169, 1, 0, 0, 0, 263, 1177, 1, - 0, 0, 0, 265, 1187, 1, 0, 0, 0, 267, 1193, 1, 0, 0, 0, 269, 1198, 1, 0, - 0, 0, 271, 1205, 1, 0, 0, 0, 273, 1209, 1, 0, 0, 0, 275, 1214, 1, 0, 0, - 0, 277, 1222, 1, 0, 0, 0, 279, 1226, 1, 0, 0, 0, 281, 1238, 1, 0, 0, 0, - 283, 1253, 1, 0, 0, 0, 285, 1264, 1, 0, 0, 0, 287, 1266, 1, 0, 0, 0, 289, - 1271, 1, 0, 0, 0, 291, 1276, 1, 0, 0, 0, 293, 1281, 1, 0, 0, 0, 295, 1288, - 1, 0, 0, 0, 297, 1296, 1, 0, 0, 0, 299, 1298, 1, 0, 0, 0, 301, 1303, 1, - 0, 0, 0, 303, 1308, 1, 0, 0, 0, 305, 1313, 1, 0, 0, 0, 307, 1317, 1, 0, - 0, 0, 309, 1322, 1, 0, 0, 0, 311, 1326, 1, 0, 0, 0, 313, 1331, 1, 0, 0, - 0, 315, 1335, 1, 0, 0, 0, 317, 1339, 1, 0, 0, 0, 319, 1344, 1, 0, 0, 0, - 321, 1349, 1, 0, 0, 0, 323, 327, 7, 0, 0, 0, 324, 326, 7, 1, 0, 0, 325, - 324, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, - 1, 0, 0, 0, 328, 330, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 331, 5, 58, - 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 6, 0, 0, 0, 333, 8, 1, 0, 0, 0, 334, - 338, 7, 2, 0, 0, 335, 337, 7, 3, 0, 0, 336, 335, 1, 0, 0, 0, 337, 340, - 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 1, 0, - 0, 0, 340, 338, 1, 0, 0, 0, 341, 342, 5, 58, 0, 0, 342, 343, 1, 0, 0, 0, - 343, 344, 6, 1, 0, 0, 344, 10, 1, 0, 0, 0, 345, 346, 5, 70, 0, 0, 346, - 347, 5, 82, 0, 0, 347, 348, 5, 79, 0, 0, 348, 349, 5, 77, 0, 0, 349, 350, - 1, 0, 0, 0, 350, 351, 6, 2, 1, 0, 351, 12, 1, 0, 0, 0, 352, 353, 5, 70, - 0, 0, 353, 354, 5, 82, 0, 0, 354, 355, 5, 79, 0, 0, 355, 356, 5, 77, 0, - 0, 356, 357, 5, 32, 0, 0, 357, 358, 5, 68, 0, 0, 358, 359, 5, 79, 0, 0, - 359, 360, 5, 67, 0, 0, 360, 361, 5, 75, 0, 0, 361, 362, 5, 69, 0, 0, 362, - 363, 5, 82, 0, 0, 363, 364, 5, 70, 0, 0, 364, 365, 5, 73, 0, 0, 365, 366, - 5, 76, 0, 0, 366, 367, 5, 69, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 6, - 3, 1, 0, 369, 14, 1, 0, 0, 0, 370, 371, 5, 76, 0, 0, 371, 372, 5, 79, 0, - 0, 372, 373, 5, 67, 0, 0, 373, 374, 5, 65, 0, 0, 374, 375, 5, 76, 0, 0, - 375, 376, 5, 76, 0, 0, 376, 377, 5, 89, 0, 0, 377, 378, 1, 0, 0, 0, 378, - 379, 6, 4, 1, 0, 379, 16, 1, 0, 0, 0, 380, 381, 5, 67, 0, 0, 381, 382, - 5, 79, 0, 0, 382, 383, 5, 80, 0, 0, 383, 384, 5, 89, 0, 0, 384, 385, 1, - 0, 0, 0, 385, 386, 6, 5, 1, 0, 386, 18, 1, 0, 0, 0, 387, 388, 5, 83, 0, - 0, 388, 389, 5, 65, 0, 0, 389, 390, 5, 86, 0, 0, 390, 391, 5, 69, 0, 0, - 391, 392, 5, 32, 0, 0, 392, 393, 5, 65, 0, 0, 393, 394, 5, 82, 0, 0, 394, - 395, 5, 84, 0, 0, 395, 396, 5, 73, 0, 0, 396, 397, 5, 70, 0, 0, 397, 398, - 5, 65, 0, 0, 398, 399, 5, 67, 0, 0, 399, 400, 5, 84, 0, 0, 400, 401, 1, - 0, 0, 0, 401, 402, 6, 6, 1, 0, 402, 20, 1, 0, 0, 0, 403, 404, 5, 83, 0, - 0, 404, 405, 5, 65, 0, 0, 405, 406, 5, 86, 0, 0, 406, 407, 5, 69, 0, 0, - 407, 408, 5, 32, 0, 0, 408, 409, 5, 73, 0, 0, 409, 410, 5, 77, 0, 0, 410, - 411, 5, 65, 0, 0, 411, 412, 5, 71, 0, 0, 412, 413, 5, 69, 0, 0, 413, 414, - 1, 0, 0, 0, 414, 415, 6, 7, 1, 0, 415, 22, 1, 0, 0, 0, 416, 417, 5, 82, - 0, 0, 417, 418, 5, 85, 0, 0, 418, 419, 5, 78, 0, 0, 419, 420, 1, 0, 0, - 0, 420, 421, 6, 8, 1, 0, 421, 24, 1, 0, 0, 0, 422, 423, 5, 69, 0, 0, 423, - 424, 5, 88, 0, 0, 424, 425, 5, 80, 0, 0, 425, 426, 5, 79, 0, 0, 426, 427, - 5, 83, 0, 0, 427, 428, 5, 69, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 6, - 9, 1, 0, 430, 26, 1, 0, 0, 0, 431, 432, 5, 86, 0, 0, 432, 433, 5, 79, 0, - 0, 433, 434, 5, 76, 0, 0, 434, 435, 5, 85, 0, 0, 435, 436, 5, 77, 0, 0, - 436, 437, 5, 69, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 6, 10, 1, 0, 439, - 28, 1, 0, 0, 0, 440, 441, 5, 69, 0, 0, 441, 442, 5, 78, 0, 0, 442, 443, - 5, 86, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 6, 11, 2, 0, 445, 30, 1, 0, - 0, 0, 446, 447, 5, 65, 0, 0, 447, 448, 5, 82, 0, 0, 448, 449, 5, 71, 0, - 0, 449, 450, 1, 0, 0, 0, 450, 451, 6, 12, 2, 0, 451, 32, 1, 0, 0, 0, 452, - 453, 5, 83, 0, 0, 453, 454, 5, 69, 0, 0, 454, 455, 5, 84, 0, 0, 455, 456, - 1, 0, 0, 0, 456, 457, 6, 13, 2, 0, 457, 34, 1, 0, 0, 0, 458, 459, 5, 76, - 0, 0, 459, 460, 5, 69, 0, 0, 460, 461, 5, 84, 0, 0, 461, 462, 1, 0, 0, - 0, 462, 463, 6, 14, 2, 0, 463, 36, 1, 0, 0, 0, 464, 465, 5, 76, 0, 0, 465, - 466, 5, 65, 0, 0, 466, 467, 5, 66, 0, 0, 467, 468, 5, 69, 0, 0, 468, 469, - 5, 76, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 6, 15, 3, 0, 471, 38, 1, 0, - 0, 0, 472, 473, 5, 66, 0, 0, 473, 474, 5, 85, 0, 0, 474, 475, 5, 73, 0, - 0, 475, 476, 5, 76, 0, 0, 476, 477, 5, 68, 0, 0, 477, 478, 1, 0, 0, 0, - 478, 479, 6, 16, 1, 0, 479, 40, 1, 0, 0, 0, 480, 481, 5, 87, 0, 0, 481, - 482, 5, 79, 0, 0, 482, 483, 5, 82, 0, 0, 483, 484, 5, 75, 0, 0, 484, 485, - 5, 68, 0, 0, 485, 486, 5, 73, 0, 0, 486, 487, 5, 82, 0, 0, 487, 488, 1, - 0, 0, 0, 488, 489, 6, 17, 1, 0, 489, 42, 1, 0, 0, 0, 490, 491, 5, 85, 0, - 0, 491, 492, 5, 83, 0, 0, 492, 493, 5, 69, 0, 0, 493, 494, 5, 82, 0, 0, - 494, 495, 1, 0, 0, 0, 495, 496, 6, 18, 1, 0, 496, 44, 1, 0, 0, 0, 497, - 498, 5, 67, 0, 0, 498, 499, 5, 77, 0, 0, 499, 500, 5, 68, 0, 0, 500, 501, - 1, 0, 0, 0, 501, 502, 6, 19, 1, 0, 502, 46, 1, 0, 0, 0, 503, 504, 5, 69, - 0, 0, 504, 505, 5, 78, 0, 0, 505, 506, 5, 84, 0, 0, 506, 507, 5, 82, 0, - 0, 507, 508, 5, 89, 0, 0, 508, 509, 5, 80, 0, 0, 509, 510, 5, 79, 0, 0, - 510, 511, 5, 73, 0, 0, 511, 512, 5, 78, 0, 0, 512, 513, 5, 84, 0, 0, 513, - 514, 1, 0, 0, 0, 514, 515, 6, 20, 1, 0, 515, 48, 1, 0, 0, 0, 516, 517, - 5, 71, 0, 0, 517, 518, 5, 73, 0, 0, 518, 519, 5, 84, 0, 0, 519, 520, 5, - 32, 0, 0, 520, 521, 5, 67, 0, 0, 521, 522, 5, 76, 0, 0, 522, 523, 5, 79, - 0, 0, 523, 524, 5, 78, 0, 0, 524, 525, 5, 69, 0, 0, 525, 526, 1, 0, 0, - 0, 526, 527, 6, 21, 1, 0, 527, 50, 1, 0, 0, 0, 528, 529, 5, 65, 0, 0, 529, - 530, 5, 68, 0, 0, 530, 531, 5, 68, 0, 0, 531, 532, 1, 0, 0, 0, 532, 533, - 6, 22, 1, 0, 533, 52, 1, 0, 0, 0, 534, 535, 5, 83, 0, 0, 535, 536, 5, 84, - 0, 0, 536, 537, 5, 79, 0, 0, 537, 538, 5, 80, 0, 0, 538, 539, 5, 83, 0, - 0, 539, 540, 5, 73, 0, 0, 540, 541, 5, 71, 0, 0, 541, 542, 5, 78, 0, 0, - 542, 543, 5, 65, 0, 0, 543, 544, 5, 76, 0, 0, 544, 545, 1, 0, 0, 0, 545, - 546, 6, 23, 1, 0, 546, 54, 1, 0, 0, 0, 547, 548, 5, 79, 0, 0, 548, 549, - 5, 78, 0, 0, 549, 550, 5, 66, 0, 0, 550, 551, 5, 85, 0, 0, 551, 552, 5, - 73, 0, 0, 552, 553, 5, 76, 0, 0, 553, 554, 5, 68, 0, 0, 554, 555, 1, 0, - 0, 0, 555, 556, 6, 24, 1, 0, 556, 56, 1, 0, 0, 0, 557, 558, 5, 72, 0, 0, - 558, 559, 5, 69, 0, 0, 559, 560, 5, 65, 0, 0, 560, 561, 5, 76, 0, 0, 561, - 562, 5, 84, 0, 0, 562, 563, 5, 72, 0, 0, 563, 564, 5, 67, 0, 0, 564, 565, - 5, 72, 0, 0, 565, 566, 5, 69, 0, 0, 566, 567, 5, 67, 0, 0, 567, 568, 5, - 75, 0, 0, 568, 569, 1, 0, 0, 0, 569, 570, 6, 25, 1, 0, 570, 58, 1, 0, 0, - 0, 571, 572, 5, 83, 0, 0, 572, 573, 5, 72, 0, 0, 573, 574, 5, 69, 0, 0, - 574, 575, 5, 76, 0, 0, 575, 576, 5, 76, 0, 0, 576, 577, 1, 0, 0, 0, 577, - 578, 6, 26, 1, 0, 578, 60, 1, 0, 0, 0, 579, 580, 5, 68, 0, 0, 580, 581, - 5, 79, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 6, 27, 1, 0, 583, 62, 1, 0, - 0, 0, 584, 585, 5, 67, 0, 0, 585, 586, 5, 79, 0, 0, 586, 587, 5, 77, 0, - 0, 587, 588, 5, 77, 0, 0, 588, 589, 5, 65, 0, 0, 589, 590, 5, 78, 0, 0, - 590, 591, 5, 68, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 6, 28, 1, 0, 593, - 64, 1, 0, 0, 0, 594, 595, 5, 73, 0, 0, 595, 596, 5, 77, 0, 0, 596, 597, - 5, 80, 0, 0, 597, 598, 5, 79, 0, 0, 598, 599, 5, 82, 0, 0, 599, 600, 5, - 84, 0, 0, 600, 601, 1, 0, 0, 0, 601, 602, 6, 29, 1, 0, 602, 66, 1, 0, 0, - 0, 603, 604, 5, 86, 0, 0, 604, 605, 5, 69, 0, 0, 605, 606, 5, 82, 0, 0, - 606, 607, 5, 83, 0, 0, 607, 608, 5, 73, 0, 0, 608, 609, 5, 79, 0, 0, 609, - 610, 5, 78, 0, 0, 610, 611, 1, 0, 0, 0, 611, 612, 6, 30, 1, 0, 612, 68, - 1, 0, 0, 0, 613, 614, 5, 67, 0, 0, 614, 615, 5, 65, 0, 0, 615, 616, 5, - 67, 0, 0, 616, 617, 5, 72, 0, 0, 617, 618, 5, 69, 0, 0, 618, 619, 1, 0, - 0, 0, 619, 620, 6, 31, 1, 0, 620, 70, 1, 0, 0, 0, 621, 622, 5, 72, 0, 0, - 622, 623, 5, 79, 0, 0, 623, 624, 5, 83, 0, 0, 624, 625, 5, 84, 0, 0, 625, - 626, 1, 0, 0, 0, 626, 627, 6, 32, 1, 0, 627, 72, 1, 0, 0, 0, 628, 629, - 5, 80, 0, 0, 629, 630, 5, 82, 0, 0, 630, 631, 5, 79, 0, 0, 631, 632, 5, - 74, 0, 0, 632, 633, 5, 69, 0, 0, 633, 634, 5, 67, 0, 0, 634, 635, 5, 84, - 0, 0, 635, 636, 1, 0, 0, 0, 636, 637, 6, 33, 1, 0, 637, 74, 1, 0, 0, 0, - 638, 639, 5, 80, 0, 0, 639, 640, 5, 73, 0, 0, 640, 641, 5, 80, 0, 0, 641, - 642, 5, 69, 0, 0, 642, 643, 5, 76, 0, 0, 643, 644, 5, 73, 0, 0, 644, 645, - 5, 78, 0, 0, 645, 646, 5, 69, 0, 0, 646, 647, 1, 0, 0, 0, 647, 648, 6, - 34, 1, 0, 648, 76, 1, 0, 0, 0, 649, 650, 5, 84, 0, 0, 650, 651, 5, 82, - 0, 0, 651, 652, 5, 73, 0, 0, 652, 653, 5, 71, 0, 0, 653, 654, 5, 71, 0, - 0, 654, 655, 5, 69, 0, 0, 655, 656, 5, 82, 0, 0, 656, 657, 1, 0, 0, 0, - 657, 658, 6, 35, 1, 0, 658, 78, 1, 0, 0, 0, 659, 660, 5, 87, 0, 0, 660, - 661, 5, 73, 0, 0, 661, 662, 5, 84, 0, 0, 662, 663, 5, 72, 0, 0, 663, 80, - 1, 0, 0, 0, 664, 665, 5, 68, 0, 0, 665, 666, 5, 79, 0, 0, 666, 667, 5, - 67, 0, 0, 667, 668, 5, 75, 0, 0, 668, 669, 5, 69, 0, 0, 669, 670, 5, 82, - 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 6, 37, 4, 0, 672, 673, 6, 37, 1, - 0, 673, 82, 1, 0, 0, 0, 674, 675, 5, 73, 0, 0, 675, 676, 5, 70, 0, 0, 676, - 677, 1, 0, 0, 0, 677, 678, 6, 38, 4, 0, 678, 679, 6, 38, 1, 0, 679, 84, - 1, 0, 0, 0, 680, 681, 5, 84, 0, 0, 681, 682, 5, 82, 0, 0, 682, 683, 5, - 89, 0, 0, 683, 684, 1, 0, 0, 0, 684, 685, 6, 39, 4, 0, 685, 686, 6, 39, - 1, 0, 686, 86, 1, 0, 0, 0, 687, 688, 5, 70, 0, 0, 688, 689, 5, 79, 0, 0, - 689, 690, 5, 82, 0, 0, 690, 691, 1, 0, 0, 0, 691, 692, 6, 40, 4, 0, 692, - 693, 6, 40, 1, 0, 693, 88, 1, 0, 0, 0, 694, 695, 5, 87, 0, 0, 695, 696, - 5, 65, 0, 0, 696, 697, 5, 73, 0, 0, 697, 698, 5, 84, 0, 0, 698, 699, 1, - 0, 0, 0, 699, 700, 6, 41, 4, 0, 700, 701, 6, 41, 1, 0, 701, 90, 1, 0, 0, - 0, 702, 704, 7, 4, 0, 0, 703, 702, 1, 0, 0, 0, 704, 707, 1, 0, 0, 0, 705, - 703, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 710, 1, 0, 0, 0, 707, 705, - 1, 0, 0, 0, 708, 711, 5, 0, 0, 1, 709, 711, 3, 97, 45, 0, 710, 708, 1, - 0, 0, 0, 710, 709, 1, 0, 0, 0, 711, 92, 1, 0, 0, 0, 712, 717, 7, 4, 0, - 0, 713, 716, 7, 4, 0, 0, 714, 716, 3, 101, 47, 0, 715, 713, 1, 0, 0, 0, - 715, 714, 1, 0, 0, 0, 716, 719, 1, 0, 0, 0, 717, 715, 1, 0, 0, 0, 717, - 718, 1, 0, 0, 0, 718, 720, 1, 0, 0, 0, 719, 717, 1, 0, 0, 0, 720, 721, - 6, 43, 5, 0, 721, 94, 1, 0, 0, 0, 722, 724, 7, 4, 0, 0, 723, 722, 1, 0, - 0, 0, 724, 727, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, - 726, 728, 1, 0, 0, 0, 727, 725, 1, 0, 0, 0, 728, 732, 5, 35, 0, 0, 729, - 731, 8, 5, 0, 0, 730, 729, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, - 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 735, 1, 0, 0, 0, 734, 732, 1, 0, - 0, 0, 735, 736, 6, 44, 6, 0, 736, 96, 1, 0, 0, 0, 737, 741, 7, 5, 0, 0, - 738, 739, 5, 13, 0, 0, 739, 741, 5, 10, 0, 0, 740, 737, 1, 0, 0, 0, 740, - 738, 1, 0, 0, 0, 741, 98, 1, 0, 0, 0, 742, 744, 7, 4, 0, 0, 743, 742, 1, - 0, 0, 0, 744, 747, 1, 0, 0, 0, 745, 743, 1, 0, 0, 0, 745, 746, 1, 0, 0, - 0, 746, 748, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 748, 757, 3, 97, 45, 0, - 749, 751, 7, 4, 0, 0, 750, 749, 1, 0, 0, 0, 751, 754, 1, 0, 0, 0, 752, - 750, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 755, 1, 0, 0, 0, 754, 752, - 1, 0, 0, 0, 755, 757, 3, 95, 44, 0, 756, 745, 1, 0, 0, 0, 756, 752, 1, - 0, 0, 0, 757, 100, 1, 0, 0, 0, 758, 760, 5, 92, 0, 0, 759, 761, 3, 99, - 46, 0, 760, 759, 1, 0, 0, 0, 761, 762, 1, 0, 0, 0, 762, 760, 1, 0, 0, 0, - 762, 763, 1, 0, 0, 0, 763, 102, 1, 0, 0, 0, 764, 765, 3, 7, 0, 0, 765, - 766, 1, 0, 0, 0, 766, 767, 6, 48, 7, 0, 767, 104, 1, 0, 0, 0, 768, 769, - 3, 9, 1, 0, 769, 770, 1, 0, 0, 0, 770, 771, 6, 49, 8, 0, 771, 106, 1, 0, - 0, 0, 772, 773, 3, 11, 2, 0, 773, 774, 1, 0, 0, 0, 774, 775, 6, 50, 9, - 0, 775, 776, 6, 50, 1, 0, 776, 108, 1, 0, 0, 0, 777, 778, 3, 13, 3, 0, - 778, 779, 1, 0, 0, 0, 779, 780, 6, 51, 10, 0, 780, 781, 6, 51, 1, 0, 781, - 110, 1, 0, 0, 0, 782, 783, 3, 15, 4, 0, 783, 784, 1, 0, 0, 0, 784, 785, - 6, 52, 11, 0, 785, 786, 6, 52, 1, 0, 786, 112, 1, 0, 0, 0, 787, 788, 3, - 17, 5, 0, 788, 789, 1, 0, 0, 0, 789, 790, 6, 53, 12, 0, 790, 791, 6, 53, - 1, 0, 791, 114, 1, 0, 0, 0, 792, 793, 3, 19, 6, 0, 793, 794, 1, 0, 0, 0, - 794, 795, 6, 54, 13, 0, 795, 796, 6, 54, 1, 0, 796, 116, 1, 0, 0, 0, 797, - 798, 3, 21, 7, 0, 798, 799, 1, 0, 0, 0, 799, 800, 6, 55, 14, 0, 800, 801, - 6, 55, 1, 0, 801, 118, 1, 0, 0, 0, 802, 803, 3, 23, 8, 0, 803, 804, 1, - 0, 0, 0, 804, 805, 6, 56, 15, 0, 805, 806, 6, 56, 1, 0, 806, 120, 1, 0, - 0, 0, 807, 808, 3, 25, 9, 0, 808, 809, 1, 0, 0, 0, 809, 810, 6, 57, 16, - 0, 810, 811, 6, 57, 1, 0, 811, 122, 1, 0, 0, 0, 812, 813, 3, 27, 10, 0, - 813, 814, 1, 0, 0, 0, 814, 815, 6, 58, 17, 0, 815, 816, 6, 58, 1, 0, 816, - 124, 1, 0, 0, 0, 817, 818, 3, 29, 11, 0, 818, 819, 1, 0, 0, 0, 819, 820, - 6, 59, 18, 0, 820, 821, 6, 59, 2, 0, 821, 126, 1, 0, 0, 0, 822, 823, 3, - 31, 12, 0, 823, 824, 1, 0, 0, 0, 824, 825, 6, 60, 19, 0, 825, 826, 6, 60, - 2, 0, 826, 128, 1, 0, 0, 0, 827, 828, 3, 33, 13, 0, 828, 829, 1, 0, 0, - 0, 829, 830, 6, 61, 20, 0, 830, 831, 6, 61, 2, 0, 831, 130, 1, 0, 0, 0, - 832, 833, 3, 35, 14, 0, 833, 834, 1, 0, 0, 0, 834, 835, 6, 62, 21, 0, 835, - 836, 6, 62, 2, 0, 836, 132, 1, 0, 0, 0, 837, 838, 3, 37, 15, 0, 838, 839, - 1, 0, 0, 0, 839, 840, 6, 63, 22, 0, 840, 841, 6, 63, 3, 0, 841, 134, 1, - 0, 0, 0, 842, 843, 3, 39, 16, 0, 843, 844, 1, 0, 0, 0, 844, 845, 6, 64, - 23, 0, 845, 846, 6, 64, 1, 0, 846, 136, 1, 0, 0, 0, 847, 848, 3, 41, 17, - 0, 848, 849, 1, 0, 0, 0, 849, 850, 6, 65, 24, 0, 850, 851, 6, 65, 1, 0, - 851, 138, 1, 0, 0, 0, 852, 853, 3, 43, 18, 0, 853, 854, 1, 0, 0, 0, 854, - 855, 6, 66, 25, 0, 855, 856, 6, 66, 1, 0, 856, 140, 1, 0, 0, 0, 857, 858, - 3, 45, 19, 0, 858, 859, 1, 0, 0, 0, 859, 860, 6, 67, 26, 0, 860, 861, 6, - 67, 1, 0, 861, 142, 1, 0, 0, 0, 862, 863, 3, 47, 20, 0, 863, 864, 1, 0, - 0, 0, 864, 865, 6, 68, 27, 0, 865, 866, 6, 68, 1, 0, 866, 144, 1, 0, 0, - 0, 867, 868, 3, 49, 21, 0, 868, 869, 1, 0, 0, 0, 869, 870, 6, 69, 28, 0, - 870, 871, 6, 69, 1, 0, 871, 146, 1, 0, 0, 0, 872, 873, 3, 51, 22, 0, 873, - 874, 1, 0, 0, 0, 874, 875, 6, 70, 29, 0, 875, 876, 6, 70, 1, 0, 876, 148, - 1, 0, 0, 0, 877, 878, 3, 53, 23, 0, 878, 879, 1, 0, 0, 0, 879, 880, 6, - 71, 30, 0, 880, 881, 6, 71, 1, 0, 881, 150, 1, 0, 0, 0, 882, 883, 3, 55, - 24, 0, 883, 884, 1, 0, 0, 0, 884, 885, 6, 72, 31, 0, 885, 886, 6, 72, 1, - 0, 886, 152, 1, 0, 0, 0, 887, 888, 3, 57, 25, 0, 888, 889, 1, 0, 0, 0, - 889, 890, 6, 73, 32, 0, 890, 891, 6, 73, 1, 0, 891, 154, 1, 0, 0, 0, 892, - 893, 3, 59, 26, 0, 893, 894, 1, 0, 0, 0, 894, 895, 6, 74, 33, 0, 895, 896, - 6, 74, 1, 0, 896, 156, 1, 0, 0, 0, 897, 898, 3, 61, 27, 0, 898, 899, 1, - 0, 0, 0, 899, 900, 6, 75, 34, 0, 900, 901, 6, 75, 1, 0, 901, 158, 1, 0, - 0, 0, 902, 903, 3, 63, 28, 0, 903, 904, 1, 0, 0, 0, 904, 905, 6, 76, 35, - 0, 905, 906, 6, 76, 1, 0, 906, 160, 1, 0, 0, 0, 907, 908, 3, 65, 29, 0, - 908, 909, 1, 0, 0, 0, 909, 910, 6, 77, 36, 0, 910, 911, 6, 77, 1, 0, 911, - 162, 1, 0, 0, 0, 912, 913, 3, 69, 31, 0, 913, 914, 1, 0, 0, 0, 914, 915, - 6, 78, 37, 0, 915, 916, 6, 78, 1, 0, 916, 164, 1, 0, 0, 0, 917, 918, 3, - 71, 32, 0, 918, 919, 1, 0, 0, 0, 919, 920, 6, 79, 38, 0, 920, 921, 6, 79, - 1, 0, 921, 166, 1, 0, 0, 0, 922, 923, 3, 75, 34, 0, 923, 924, 1, 0, 0, - 0, 924, 925, 6, 80, 39, 0, 925, 926, 6, 80, 1, 0, 926, 168, 1, 0, 0, 0, - 927, 928, 3, 77, 35, 0, 928, 929, 1, 0, 0, 0, 929, 930, 6, 81, 40, 0, 930, - 931, 6, 81, 1, 0, 931, 170, 1, 0, 0, 0, 932, 933, 3, 79, 36, 0, 933, 934, - 1, 0, 0, 0, 934, 935, 6, 82, 41, 0, 935, 172, 1, 0, 0, 0, 936, 937, 3, - 81, 37, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 83, 42, 0, 939, 940, 6, 83, - 4, 0, 940, 941, 6, 83, 1, 0, 941, 174, 1, 0, 0, 0, 942, 943, 3, 83, 38, - 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 84, 43, 0, 945, 946, 6, 84, 4, 0, - 946, 947, 6, 84, 1, 0, 947, 176, 1, 0, 0, 0, 948, 949, 3, 85, 39, 0, 949, - 950, 1, 0, 0, 0, 950, 951, 6, 85, 44, 0, 951, 952, 6, 85, 4, 0, 952, 953, - 6, 85, 1, 0, 953, 178, 1, 0, 0, 0, 954, 955, 3, 87, 40, 0, 955, 956, 1, - 0, 0, 0, 956, 957, 6, 86, 45, 0, 957, 958, 6, 86, 4, 0, 958, 959, 6, 86, - 1, 0, 959, 180, 1, 0, 0, 0, 960, 961, 3, 89, 41, 0, 961, 962, 1, 0, 0, - 0, 962, 963, 6, 87, 46, 0, 963, 964, 6, 87, 4, 0, 964, 965, 6, 87, 1, 0, - 965, 182, 1, 0, 0, 0, 966, 967, 3, 91, 42, 0, 967, 968, 1, 0, 0, 0, 968, - 969, 6, 88, 47, 0, 969, 184, 1, 0, 0, 0, 970, 971, 3, 93, 43, 0, 971, 972, - 1, 0, 0, 0, 972, 973, 6, 89, 48, 0, 973, 974, 6, 89, 5, 0, 974, 186, 1, - 0, 0, 0, 975, 976, 3, 95, 44, 0, 976, 977, 1, 0, 0, 0, 977, 978, 6, 90, - 49, 0, 978, 979, 6, 90, 6, 0, 979, 188, 1, 0, 0, 0, 980, 981, 3, 11, 2, - 0, 981, 982, 1, 0, 0, 0, 982, 983, 6, 91, 9, 0, 983, 984, 6, 91, 1, 0, - 984, 190, 1, 0, 0, 0, 985, 986, 3, 13, 3, 0, 986, 987, 1, 0, 0, 0, 987, - 988, 6, 92, 10, 0, 988, 989, 6, 92, 1, 0, 989, 192, 1, 0, 0, 0, 990, 991, - 3, 15, 4, 0, 991, 992, 1, 0, 0, 0, 992, 993, 6, 93, 11, 0, 993, 994, 6, - 93, 1, 0, 994, 194, 1, 0, 0, 0, 995, 996, 3, 17, 5, 0, 996, 997, 1, 0, - 0, 0, 997, 998, 6, 94, 12, 0, 998, 999, 6, 94, 1, 0, 999, 196, 1, 0, 0, - 0, 1000, 1001, 3, 19, 6, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 6, 95, - 13, 0, 1003, 1004, 6, 95, 1, 0, 1004, 198, 1, 0, 0, 0, 1005, 1006, 3, 21, - 7, 0, 1006, 1007, 1, 0, 0, 0, 1007, 1008, 6, 96, 14, 0, 1008, 1009, 6, - 96, 1, 0, 1009, 200, 1, 0, 0, 0, 1010, 1011, 3, 23, 8, 0, 1011, 1012, 1, - 0, 0, 0, 1012, 1013, 6, 97, 15, 0, 1013, 1014, 6, 97, 1, 0, 1014, 202, - 1, 0, 0, 0, 1015, 1016, 3, 25, 9, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1018, - 6, 98, 16, 0, 1018, 1019, 6, 98, 1, 0, 1019, 204, 1, 0, 0, 0, 1020, 1021, - 3, 27, 10, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1023, 6, 99, 17, 0, 1023, 1024, - 6, 99, 1, 0, 1024, 206, 1, 0, 0, 0, 1025, 1026, 3, 29, 11, 0, 1026, 1027, - 1, 0, 0, 0, 1027, 1028, 6, 100, 18, 0, 1028, 1029, 6, 100, 2, 0, 1029, - 208, 1, 0, 0, 0, 1030, 1031, 3, 31, 12, 0, 1031, 1032, 1, 0, 0, 0, 1032, - 1033, 6, 101, 19, 0, 1033, 1034, 6, 101, 2, 0, 1034, 210, 1, 0, 0, 0, 1035, - 1036, 3, 33, 13, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 6, 102, 20, 0, - 1038, 1039, 6, 102, 2, 0, 1039, 212, 1, 0, 0, 0, 1040, 1041, 3, 35, 14, - 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 6, 103, 21, 0, 1043, 1044, 6, 103, - 2, 0, 1044, 214, 1, 0, 0, 0, 1045, 1046, 3, 37, 15, 0, 1046, 1047, 1, 0, - 0, 0, 1047, 1048, 6, 104, 22, 0, 1048, 1049, 6, 104, 3, 0, 1049, 216, 1, - 0, 0, 0, 1050, 1051, 3, 39, 16, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, - 6, 105, 23, 0, 1053, 1054, 6, 105, 1, 0, 1054, 218, 1, 0, 0, 0, 1055, 1056, - 3, 41, 17, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1058, 6, 106, 24, 0, 1058, - 1059, 6, 106, 1, 0, 1059, 220, 1, 0, 0, 0, 1060, 1061, 3, 43, 18, 0, 1061, - 1062, 1, 0, 0, 0, 1062, 1063, 6, 107, 25, 0, 1063, 1064, 6, 107, 1, 0, - 1064, 222, 1, 0, 0, 0, 1065, 1066, 3, 45, 19, 0, 1066, 1067, 1, 0, 0, 0, - 1067, 1068, 6, 108, 26, 0, 1068, 1069, 6, 108, 1, 0, 1069, 224, 1, 0, 0, - 0, 1070, 1071, 3, 47, 20, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 6, 109, - 27, 0, 1073, 1074, 6, 109, 1, 0, 1074, 226, 1, 0, 0, 0, 1075, 1076, 3, - 49, 21, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1078, 6, 110, 28, 0, 1078, 1079, - 6, 110, 1, 0, 1079, 228, 1, 0, 0, 0, 1080, 1081, 3, 51, 22, 0, 1081, 1082, - 1, 0, 0, 0, 1082, 1083, 6, 111, 29, 0, 1083, 1084, 6, 111, 1, 0, 1084, - 230, 1, 0, 0, 0, 1085, 1086, 3, 53, 23, 0, 1086, 1087, 1, 0, 0, 0, 1087, - 1088, 6, 112, 30, 0, 1088, 1089, 6, 112, 1, 0, 1089, 232, 1, 0, 0, 0, 1090, - 1091, 3, 55, 24, 0, 1091, 1092, 1, 0, 0, 0, 1092, 1093, 6, 113, 31, 0, - 1093, 1094, 6, 113, 1, 0, 1094, 234, 1, 0, 0, 0, 1095, 1096, 3, 57, 25, - 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 6, 114, 32, 0, 1098, 1099, 6, 114, - 1, 0, 1099, 236, 1, 0, 0, 0, 1100, 1101, 3, 59, 26, 0, 1101, 1102, 1, 0, - 0, 0, 1102, 1103, 6, 115, 33, 0, 1103, 1104, 6, 115, 1, 0, 1104, 238, 1, - 0, 0, 0, 1105, 1106, 3, 61, 27, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, - 6, 116, 34, 0, 1108, 1109, 6, 116, 1, 0, 1109, 240, 1, 0, 0, 0, 1110, 1111, - 3, 63, 28, 0, 1111, 1112, 1, 0, 0, 0, 1112, 1113, 6, 117, 35, 0, 1113, - 1114, 6, 117, 1, 0, 1114, 242, 1, 0, 0, 0, 1115, 1116, 3, 65, 29, 0, 1116, - 1117, 1, 0, 0, 0, 1117, 1118, 6, 118, 36, 0, 1118, 1119, 6, 118, 1, 0, - 1119, 244, 1, 0, 0, 0, 1120, 1121, 3, 69, 31, 0, 1121, 1122, 1, 0, 0, 0, - 1122, 1123, 6, 119, 37, 0, 1123, 1124, 6, 119, 1, 0, 1124, 246, 1, 0, 0, - 0, 1125, 1126, 3, 71, 32, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1128, 6, 120, - 38, 0, 1128, 1129, 6, 120, 1, 0, 1129, 248, 1, 0, 0, 0, 1130, 1131, 3, - 79, 36, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 6, 121, 41, 0, 1133, 250, - 1, 0, 0, 0, 1134, 1135, 3, 81, 37, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1137, - 6, 122, 42, 0, 1137, 1138, 6, 122, 4, 0, 1138, 1139, 6, 122, 1, 0, 1139, - 252, 1, 0, 0, 0, 1140, 1141, 3, 83, 38, 0, 1141, 1142, 1, 0, 0, 0, 1142, - 1143, 6, 123, 43, 0, 1143, 1144, 6, 123, 4, 0, 1144, 1145, 6, 123, 1, 0, - 1145, 254, 1, 0, 0, 0, 1146, 1147, 5, 69, 0, 0, 1147, 1148, 5, 76, 0, 0, - 1148, 1149, 5, 83, 0, 0, 1149, 1150, 5, 69, 0, 0, 1150, 1151, 1, 0, 0, - 0, 1151, 1152, 6, 124, 1, 0, 1152, 256, 1, 0, 0, 0, 1153, 1154, 5, 69, - 0, 0, 1154, 1155, 5, 76, 0, 0, 1155, 1156, 5, 83, 0, 0, 1156, 1157, 5, - 69, 0, 0, 1157, 1158, 5, 32, 0, 0, 1158, 1159, 5, 73, 0, 0, 1159, 1160, - 5, 70, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1162, 6, 125, 1, 0, 1162, 258, - 1, 0, 0, 0, 1163, 1164, 3, 85, 39, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1166, - 6, 126, 44, 0, 1166, 1167, 6, 126, 4, 0, 1167, 1168, 6, 126, 1, 0, 1168, - 260, 1, 0, 0, 0, 1169, 1170, 5, 67, 0, 0, 1170, 1171, 5, 65, 0, 0, 1171, - 1172, 5, 84, 0, 0, 1172, 1173, 5, 67, 0, 0, 1173, 1174, 5, 72, 0, 0, 1174, - 1175, 1, 0, 0, 0, 1175, 1176, 6, 127, 1, 0, 1176, 262, 1, 0, 0, 0, 1177, - 1178, 5, 70, 0, 0, 1178, 1179, 5, 73, 0, 0, 1179, 1180, 5, 78, 0, 0, 1180, - 1181, 5, 65, 0, 0, 1181, 1182, 5, 76, 0, 0, 1182, 1183, 5, 76, 0, 0, 1183, - 1184, 5, 89, 0, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1186, 6, 128, 1, 0, 1186, - 264, 1, 0, 0, 0, 1187, 1188, 3, 87, 40, 0, 1188, 1189, 1, 0, 0, 0, 1189, - 1190, 6, 129, 45, 0, 1190, 1191, 6, 129, 4, 0, 1191, 1192, 6, 129, 1, 0, - 1192, 266, 1, 0, 0, 0, 1193, 1194, 3, 89, 41, 0, 1194, 1195, 1, 0, 0, 0, - 1195, 1196, 6, 130, 46, 0, 1196, 1197, 6, 130, 4, 0, 1197, 268, 1, 0, 0, - 0, 1198, 1199, 5, 69, 0, 0, 1199, 1200, 5, 78, 0, 0, 1200, 1201, 5, 68, - 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 131, 50, 0, 1203, 1204, 6, - 131, 1, 0, 1204, 270, 1, 0, 0, 0, 1205, 1206, 3, 91, 42, 0, 1206, 1207, - 1, 0, 0, 0, 1207, 1208, 6, 132, 47, 0, 1208, 272, 1, 0, 0, 0, 1209, 1210, - 3, 93, 43, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, 6, 133, 48, 0, 1212, - 1213, 6, 133, 5, 0, 1213, 274, 1, 0, 0, 0, 1214, 1215, 3, 95, 44, 0, 1215, - 1216, 1, 0, 0, 0, 1216, 1217, 6, 134, 49, 0, 1217, 1218, 6, 134, 6, 0, - 1218, 276, 1, 0, 0, 0, 1219, 1223, 3, 283, 138, 0, 1220, 1223, 3, 279, - 136, 0, 1221, 1223, 3, 281, 137, 0, 1222, 1219, 1, 0, 0, 0, 1222, 1220, - 1, 0, 0, 0, 1222, 1221, 1, 0, 0, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1222, - 1, 0, 0, 0, 1224, 1225, 1, 0, 0, 0, 1225, 278, 1, 0, 0, 0, 1226, 1233, - 5, 34, 0, 0, 1227, 1232, 3, 281, 137, 0, 1228, 1232, 8, 6, 0, 0, 1229, - 1230, 5, 92, 0, 0, 1230, 1232, 9, 0, 0, 0, 1231, 1227, 1, 0, 0, 0, 1231, - 1228, 1, 0, 0, 0, 1231, 1229, 1, 0, 0, 0, 1232, 1235, 1, 0, 0, 0, 1233, - 1231, 1, 0, 0, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1236, 1, 0, 0, 0, 1235, - 1233, 1, 0, 0, 0, 1236, 1237, 5, 34, 0, 0, 1237, 280, 1, 0, 0, 0, 1238, - 1239, 5, 36, 0, 0, 1239, 1240, 5, 40, 0, 0, 1240, 1245, 1, 0, 0, 0, 1241, - 1246, 8, 7, 0, 0, 1242, 1246, 3, 279, 136, 0, 1243, 1246, 3, 281, 137, - 0, 1244, 1246, 3, 93, 43, 0, 1245, 1241, 1, 0, 0, 0, 1245, 1242, 1, 0, - 0, 0, 1245, 1243, 1, 0, 0, 0, 1245, 1244, 1, 0, 0, 0, 1246, 1247, 1, 0, - 0, 0, 1247, 1245, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1249, 1, 0, - 0, 0, 1249, 1250, 5, 41, 0, 0, 1250, 282, 1, 0, 0, 0, 1251, 1254, 8, 8, - 0, 0, 1252, 1254, 3, 285, 139, 0, 1253, 1251, 1, 0, 0, 0, 1253, 1252, 1, - 0, 0, 0, 1254, 284, 1, 0, 0, 0, 1255, 1256, 5, 92, 0, 0, 1256, 1265, 9, - 0, 0, 0, 1257, 1261, 3, 101, 47, 0, 1258, 1260, 7, 4, 0, 0, 1259, 1258, - 1, 0, 0, 0, 1260, 1263, 1, 0, 0, 0, 1261, 1259, 1, 0, 0, 0, 1261, 1262, - 1, 0, 0, 0, 1262, 1265, 1, 0, 0, 0, 1263, 1261, 1, 0, 0, 0, 1264, 1255, - 1, 0, 0, 0, 1264, 1257, 1, 0, 0, 0, 1265, 286, 1, 0, 0, 0, 1266, 1267, - 3, 91, 42, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 6, 140, 47, 0, 1269, - 1270, 6, 140, 50, 0, 1270, 288, 1, 0, 0, 0, 1271, 1272, 3, 93, 43, 0, 1272, - 1273, 1, 0, 0, 0, 1273, 1274, 6, 141, 48, 0, 1274, 1275, 6, 141, 5, 0, - 1275, 290, 1, 0, 0, 0, 1276, 1277, 3, 95, 44, 0, 1277, 1278, 1, 0, 0, 0, - 1278, 1279, 6, 142, 49, 0, 1279, 1280, 6, 142, 6, 0, 1280, 292, 1, 0, 0, - 0, 1281, 1282, 5, 61, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 143, - 51, 0, 1284, 294, 1, 0, 0, 0, 1285, 1289, 3, 297, 145, 0, 1286, 1289, 3, - 279, 136, 0, 1287, 1289, 3, 281, 137, 0, 1288, 1285, 1, 0, 0, 0, 1288, - 1286, 1, 0, 0, 0, 1288, 1287, 1, 0, 0, 0, 1289, 1290, 1, 0, 0, 0, 1290, - 1288, 1, 0, 0, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1292, 1, 0, 0, 0, 1292, - 1293, 6, 144, 52, 0, 1293, 296, 1, 0, 0, 0, 1294, 1297, 8, 9, 0, 0, 1295, - 1297, 3, 285, 139, 0, 1296, 1294, 1, 0, 0, 0, 1296, 1295, 1, 0, 0, 0, 1297, - 298, 1, 0, 0, 0, 1298, 1299, 3, 91, 42, 0, 1299, 1300, 1, 0, 0, 0, 1300, - 1301, 6, 146, 47, 0, 1301, 1302, 6, 146, 50, 0, 1302, 300, 1, 0, 0, 0, - 1303, 1304, 3, 93, 43, 0, 1304, 1305, 1, 0, 0, 0, 1305, 1306, 6, 147, 48, - 0, 1306, 1307, 6, 147, 5, 0, 1307, 302, 1, 0, 0, 0, 1308, 1309, 3, 95, - 44, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1311, 6, 148, 49, 0, 1311, 1312, 6, - 148, 6, 0, 1312, 304, 1, 0, 0, 0, 1313, 1314, 3, 277, 135, 0, 1314, 1315, - 1, 0, 0, 0, 1315, 1316, 6, 149, 52, 0, 1316, 306, 1, 0, 0, 0, 1317, 1318, - 3, 91, 42, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 6, 150, 47, 0, 1320, - 1321, 6, 150, 50, 0, 1321, 308, 1, 0, 0, 0, 1322, 1323, 3, 93, 43, 0, 1323, - 1324, 1, 0, 0, 0, 1324, 1325, 6, 151, 48, 0, 1325, 310, 1, 0, 0, 0, 1326, - 1327, 3, 95, 44, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 6, 152, 49, 0, - 1329, 1330, 6, 152, 6, 0, 1330, 312, 1, 0, 0, 0, 1331, 1332, 5, 61, 0, - 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 6, 153, 53, 0, 1334, 314, 1, 0, - 0, 0, 1335, 1336, 3, 295, 144, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 6, - 154, 52, 0, 1338, 316, 1, 0, 0, 0, 1339, 1340, 3, 299, 146, 0, 1340, 1341, - 1, 0, 0, 0, 1341, 1342, 6, 155, 47, 0, 1342, 1343, 6, 155, 50, 0, 1343, - 318, 1, 0, 0, 0, 1344, 1345, 3, 301, 147, 0, 1345, 1346, 1, 0, 0, 0, 1346, - 1347, 6, 156, 48, 0, 1347, 1348, 6, 156, 5, 0, 1348, 320, 1, 0, 0, 0, 1349, - 1350, 3, 95, 44, 0, 1350, 1351, 1, 0, 0, 0, 1351, 1352, 6, 157, 49, 0, - 1352, 1353, 6, 157, 6, 0, 1353, 322, 1, 0, 0, 0, 33, 0, 1, 2, 3, 4, 5, - 6, 325, 327, 338, 705, 710, 715, 717, 725, 732, 740, 745, 752, 756, 762, - 1222, 1224, 1231, 1233, 1245, 1247, 1253, 1261, 1264, 1288, 1290, 1296, - 54, 5, 1, 0, 5, 3, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 0, 2, 0, 0, 3, 0, 7, 3, - 0, 7, 4, 0, 7, 5, 0, 7, 6, 0, 7, 7, 0, 7, 8, 0, 7, 9, 0, 7, 10, 0, 7, 11, - 0, 7, 12, 0, 7, 13, 0, 7, 14, 0, 7, 15, 0, 7, 16, 0, 7, 17, 0, 7, 18, 0, - 7, 19, 0, 7, 20, 0, 7, 21, 0, 7, 22, 0, 7, 23, 0, 7, 24, 0, 7, 25, 0, 7, - 26, 0, 7, 27, 0, 7, 28, 0, 7, 29, 0, 7, 30, 0, 7, 31, 0, 7, 32, 0, 7, 34, - 0, 7, 35, 0, 7, 37, 0, 7, 38, 0, 7, 39, 0, 7, 40, 0, 7, 41, 0, 7, 42, 0, - 7, 43, 0, 7, 44, 0, 7, 45, 0, 7, 46, 0, 7, 47, 0, 4, 0, 0, 2, 5, 0, 7, - 53, 0, 7, 54, 0, + 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, + 0, 265, 50, 267, 51, 269, 0, 271, 52, 273, 53, 275, 0, 277, 0, 279, 54, + 281, 0, 283, 0, 285, 0, 287, 55, 289, 0, 291, 0, 293, 0, 295, 0, 297, 0, + 299, 0, 301, 0, 303, 56, 305, 0, 307, 0, 309, 0, 311, 0, 313, 0, 315, 0, + 317, 0, 319, 0, 321, 0, 323, 0, 325, 0, 327, 0, 329, 0, 331, 0, 7, 0, 1, + 2, 3, 4, 5, 6, 10, 1, 0, 97, 122, 4, 0, 45, 46, 48, 57, 65, 90, 97, 122, + 1, 0, 65, 90, 4, 0, 46, 46, 48, 57, 65, 90, 95, 95, 2, 0, 9, 9, 32, 32, + 2, 0, 10, 10, 13, 13, 2, 0, 34, 34, 92, 92, 6, 0, 9, 10, 13, 13, 32, 32, + 34, 34, 41, 41, 92, 92, 5, 0, 9, 10, 13, 13, 32, 32, 34, 34, 92, 92, 6, + 0, 9, 10, 13, 13, 32, 32, 34, 34, 61, 61, 92, 92, 1416, 0, 7, 1, 0, 0, + 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, + 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, + 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, + 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, + 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, + 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, + 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, + 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, + 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, + 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, + 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, + 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, + 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, 1, 111, 1, 0, 0, 0, 1, 113, + 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, 0, 0, 0, 1, 119, 1, 0, 0, 0, + 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, 125, 1, 0, 0, 0, 1, 127, 1, + 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 1, + 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, 1, 0, 0, 0, 1, 141, 1, 0, + 0, 0, 1, 143, 1, 0, 0, 0, 1, 145, 1, 0, 0, 0, 1, 147, 1, 0, 0, 0, 1, 149, + 1, 0, 0, 0, 1, 151, 1, 0, 0, 0, 1, 153, 1, 0, 0, 0, 1, 155, 1, 0, 0, 0, + 1, 157, 1, 0, 0, 0, 1, 159, 1, 0, 0, 0, 1, 161, 1, 0, 0, 0, 1, 163, 1, + 0, 0, 0, 1, 165, 1, 0, 0, 0, 1, 167, 1, 0, 0, 0, 1, 169, 1, 0, 0, 0, 1, + 171, 1, 0, 0, 0, 1, 173, 1, 0, 0, 0, 1, 175, 1, 0, 0, 0, 1, 177, 1, 0, + 0, 0, 1, 179, 1, 0, 0, 0, 1, 181, 1, 0, 0, 0, 1, 183, 1, 0, 0, 0, 1, 185, + 1, 0, 0, 0, 1, 187, 1, 0, 0, 0, 1, 189, 1, 0, 0, 0, 1, 191, 1, 0, 0, 0, + 1, 193, 1, 0, 0, 0, 1, 195, 1, 0, 0, 0, 2, 197, 1, 0, 0, 0, 2, 199, 1, + 0, 0, 0, 2, 201, 1, 0, 0, 0, 2, 203, 1, 0, 0, 0, 2, 205, 1, 0, 0, 0, 2, + 207, 1, 0, 0, 0, 2, 209, 1, 0, 0, 0, 2, 211, 1, 0, 0, 0, 2, 213, 1, 0, + 0, 0, 2, 215, 1, 0, 0, 0, 2, 217, 1, 0, 0, 0, 2, 219, 1, 0, 0, 0, 2, 221, + 1, 0, 0, 0, 2, 223, 1, 0, 0, 0, 2, 225, 1, 0, 0, 0, 2, 227, 1, 0, 0, 0, + 2, 229, 1, 0, 0, 0, 2, 231, 1, 0, 0, 0, 2, 233, 1, 0, 0, 0, 2, 235, 1, + 0, 0, 0, 2, 237, 1, 0, 0, 0, 2, 239, 1, 0, 0, 0, 2, 241, 1, 0, 0, 0, 2, + 243, 1, 0, 0, 0, 2, 245, 1, 0, 0, 0, 2, 247, 1, 0, 0, 0, 2, 249, 1, 0, + 0, 0, 2, 251, 1, 0, 0, 0, 2, 253, 1, 0, 0, 0, 2, 255, 1, 0, 0, 0, 2, 257, + 1, 0, 0, 0, 2, 259, 1, 0, 0, 0, 2, 261, 1, 0, 0, 0, 2, 263, 1, 0, 0, 0, + 2, 265, 1, 0, 0, 0, 2, 267, 1, 0, 0, 0, 2, 269, 1, 0, 0, 0, 2, 271, 1, + 0, 0, 0, 2, 273, 1, 0, 0, 0, 2, 275, 1, 0, 0, 0, 2, 277, 1, 0, 0, 0, 2, + 279, 1, 0, 0, 0, 2, 281, 1, 0, 0, 0, 2, 283, 1, 0, 0, 0, 2, 285, 1, 0, + 0, 0, 3, 287, 1, 0, 0, 0, 3, 297, 1, 0, 0, 0, 3, 299, 1, 0, 0, 0, 3, 301, + 1, 0, 0, 0, 4, 303, 1, 0, 0, 0, 4, 305, 1, 0, 0, 0, 4, 309, 1, 0, 0, 0, + 4, 311, 1, 0, 0, 0, 4, 313, 1, 0, 0, 0, 5, 315, 1, 0, 0, 0, 5, 317, 1, + 0, 0, 0, 5, 319, 1, 0, 0, 0, 5, 321, 1, 0, 0, 0, 6, 323, 1, 0, 0, 0, 6, + 325, 1, 0, 0, 0, 6, 327, 1, 0, 0, 0, 6, 329, 1, 0, 0, 0, 6, 331, 1, 0, + 0, 0, 7, 333, 1, 0, 0, 0, 9, 344, 1, 0, 0, 0, 11, 355, 1, 0, 0, 0, 13, + 366, 1, 0, 0, 0, 15, 373, 1, 0, 0, 0, 17, 391, 1, 0, 0, 0, 19, 401, 1, + 0, 0, 0, 21, 408, 1, 0, 0, 0, 23, 424, 1, 0, 0, 0, 25, 437, 1, 0, 0, 0, + 27, 443, 1, 0, 0, 0, 29, 452, 1, 0, 0, 0, 31, 461, 1, 0, 0, 0, 33, 467, + 1, 0, 0, 0, 35, 473, 1, 0, 0, 0, 37, 479, 1, 0, 0, 0, 39, 485, 1, 0, 0, + 0, 41, 493, 1, 0, 0, 0, 43, 501, 1, 0, 0, 0, 45, 511, 1, 0, 0, 0, 47, 518, + 1, 0, 0, 0, 49, 524, 1, 0, 0, 0, 51, 537, 1, 0, 0, 0, 53, 549, 1, 0, 0, + 0, 55, 555, 1, 0, 0, 0, 57, 568, 1, 0, 0, 0, 59, 578, 1, 0, 0, 0, 61, 592, + 1, 0, 0, 0, 63, 600, 1, 0, 0, 0, 65, 605, 1, 0, 0, 0, 67, 615, 1, 0, 0, + 0, 69, 626, 1, 0, 0, 0, 71, 635, 1, 0, 0, 0, 73, 645, 1, 0, 0, 0, 75, 653, + 1, 0, 0, 0, 77, 660, 1, 0, 0, 0, 79, 670, 1, 0, 0, 0, 81, 681, 1, 0, 0, + 0, 83, 691, 1, 0, 0, 0, 85, 696, 1, 0, 0, 0, 87, 706, 1, 0, 0, 0, 89, 712, + 1, 0, 0, 0, 91, 719, 1, 0, 0, 0, 93, 726, 1, 0, 0, 0, 95, 737, 1, 0, 0, + 0, 97, 744, 1, 0, 0, 0, 99, 757, 1, 0, 0, 0, 101, 772, 1, 0, 0, 0, 103, + 788, 1, 0, 0, 0, 105, 790, 1, 0, 0, 0, 107, 796, 1, 0, 0, 0, 109, 800, + 1, 0, 0, 0, 111, 804, 1, 0, 0, 0, 113, 808, 1, 0, 0, 0, 115, 813, 1, 0, + 0, 0, 117, 818, 1, 0, 0, 0, 119, 823, 1, 0, 0, 0, 121, 828, 1, 0, 0, 0, + 123, 833, 1, 0, 0, 0, 125, 838, 1, 0, 0, 0, 127, 843, 1, 0, 0, 0, 129, + 848, 1, 0, 0, 0, 131, 853, 1, 0, 0, 0, 133, 858, 1, 0, 0, 0, 135, 863, + 1, 0, 0, 0, 137, 868, 1, 0, 0, 0, 139, 873, 1, 0, 0, 0, 141, 878, 1, 0, + 0, 0, 143, 883, 1, 0, 0, 0, 145, 888, 1, 0, 0, 0, 147, 893, 1, 0, 0, 0, + 149, 898, 1, 0, 0, 0, 151, 903, 1, 0, 0, 0, 153, 908, 1, 0, 0, 0, 155, + 913, 1, 0, 0, 0, 157, 918, 1, 0, 0, 0, 159, 923, 1, 0, 0, 0, 161, 928, + 1, 0, 0, 0, 163, 933, 1, 0, 0, 0, 165, 938, 1, 0, 0, 0, 167, 943, 1, 0, + 0, 0, 169, 948, 1, 0, 0, 0, 171, 953, 1, 0, 0, 0, 173, 958, 1, 0, 0, 0, + 175, 963, 1, 0, 0, 0, 177, 968, 1, 0, 0, 0, 179, 973, 1, 0, 0, 0, 181, + 977, 1, 0, 0, 0, 183, 983, 1, 0, 0, 0, 185, 989, 1, 0, 0, 0, 187, 995, + 1, 0, 0, 0, 189, 1001, 1, 0, 0, 0, 191, 1007, 1, 0, 0, 0, 193, 1011, 1, + 0, 0, 0, 195, 1016, 1, 0, 0, 0, 197, 1021, 1, 0, 0, 0, 199, 1026, 1, 0, + 0, 0, 201, 1031, 1, 0, 0, 0, 203, 1036, 1, 0, 0, 0, 205, 1041, 1, 0, 0, + 0, 207, 1046, 1, 0, 0, 0, 209, 1051, 1, 0, 0, 0, 211, 1056, 1, 0, 0, 0, + 213, 1061, 1, 0, 0, 0, 215, 1066, 1, 0, 0, 0, 217, 1071, 1, 0, 0, 0, 219, + 1076, 1, 0, 0, 0, 221, 1081, 1, 0, 0, 0, 223, 1086, 1, 0, 0, 0, 225, 1091, + 1, 0, 0, 0, 227, 1096, 1, 0, 0, 0, 229, 1101, 1, 0, 0, 0, 231, 1106, 1, + 0, 0, 0, 233, 1111, 1, 0, 0, 0, 235, 1116, 1, 0, 0, 0, 237, 1121, 1, 0, + 0, 0, 239, 1126, 1, 0, 0, 0, 241, 1131, 1, 0, 0, 0, 243, 1136, 1, 0, 0, + 0, 245, 1141, 1, 0, 0, 0, 247, 1146, 1, 0, 0, 0, 249, 1151, 1, 0, 0, 0, + 251, 1156, 1, 0, 0, 0, 253, 1161, 1, 0, 0, 0, 255, 1166, 1, 0, 0, 0, 257, + 1171, 1, 0, 0, 0, 259, 1176, 1, 0, 0, 0, 261, 1180, 1, 0, 0, 0, 263, 1186, + 1, 0, 0, 0, 265, 1192, 1, 0, 0, 0, 267, 1199, 1, 0, 0, 0, 269, 1209, 1, + 0, 0, 0, 271, 1215, 1, 0, 0, 0, 273, 1223, 1, 0, 0, 0, 275, 1233, 1, 0, + 0, 0, 277, 1239, 1, 0, 0, 0, 279, 1244, 1, 0, 0, 0, 281, 1251, 1, 0, 0, + 0, 283, 1255, 1, 0, 0, 0, 285, 1260, 1, 0, 0, 0, 287, 1268, 1, 0, 0, 0, + 289, 1272, 1, 0, 0, 0, 291, 1284, 1, 0, 0, 0, 293, 1299, 1, 0, 0, 0, 295, + 1310, 1, 0, 0, 0, 297, 1312, 1, 0, 0, 0, 299, 1317, 1, 0, 0, 0, 301, 1322, + 1, 0, 0, 0, 303, 1327, 1, 0, 0, 0, 305, 1334, 1, 0, 0, 0, 307, 1342, 1, + 0, 0, 0, 309, 1344, 1, 0, 0, 0, 311, 1349, 1, 0, 0, 0, 313, 1354, 1, 0, + 0, 0, 315, 1359, 1, 0, 0, 0, 317, 1363, 1, 0, 0, 0, 319, 1368, 1, 0, 0, + 0, 321, 1372, 1, 0, 0, 0, 323, 1377, 1, 0, 0, 0, 325, 1381, 1, 0, 0, 0, + 327, 1385, 1, 0, 0, 0, 329, 1390, 1, 0, 0, 0, 331, 1395, 1, 0, 0, 0, 333, + 337, 7, 0, 0, 0, 334, 336, 7, 1, 0, 0, 335, 334, 1, 0, 0, 0, 336, 339, + 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 340, 1, 0, + 0, 0, 339, 337, 1, 0, 0, 0, 340, 341, 5, 58, 0, 0, 341, 342, 1, 0, 0, 0, + 342, 343, 6, 0, 0, 0, 343, 8, 1, 0, 0, 0, 344, 348, 7, 2, 0, 0, 345, 347, + 7, 3, 0, 0, 346, 345, 1, 0, 0, 0, 347, 350, 1, 0, 0, 0, 348, 346, 1, 0, + 0, 0, 348, 349, 1, 0, 0, 0, 349, 351, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, + 351, 352, 5, 58, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 6, 1, 0, 0, 354, + 10, 1, 0, 0, 0, 355, 359, 7, 2, 0, 0, 356, 358, 7, 3, 0, 0, 357, 356, 1, + 0, 0, 0, 358, 361, 1, 0, 0, 0, 359, 357, 1, 0, 0, 0, 359, 360, 1, 0, 0, + 0, 360, 362, 1, 0, 0, 0, 361, 359, 1, 0, 0, 0, 362, 363, 5, 58, 0, 0, 363, + 364, 1, 0, 0, 0, 364, 365, 6, 2, 0, 0, 365, 12, 1, 0, 0, 0, 366, 367, 5, + 70, 0, 0, 367, 368, 5, 82, 0, 0, 368, 369, 5, 79, 0, 0, 369, 370, 5, 77, + 0, 0, 370, 371, 1, 0, 0, 0, 371, 372, 6, 3, 1, 0, 372, 14, 1, 0, 0, 0, + 373, 374, 5, 70, 0, 0, 374, 375, 5, 82, 0, 0, 375, 376, 5, 79, 0, 0, 376, + 377, 5, 77, 0, 0, 377, 378, 5, 32, 0, 0, 378, 379, 5, 68, 0, 0, 379, 380, + 5, 79, 0, 0, 380, 381, 5, 67, 0, 0, 381, 382, 5, 75, 0, 0, 382, 383, 5, + 69, 0, 0, 383, 384, 5, 82, 0, 0, 384, 385, 5, 70, 0, 0, 385, 386, 5, 73, + 0, 0, 386, 387, 5, 76, 0, 0, 387, 388, 5, 69, 0, 0, 388, 389, 1, 0, 0, + 0, 389, 390, 6, 4, 1, 0, 390, 16, 1, 0, 0, 0, 391, 392, 5, 76, 0, 0, 392, + 393, 5, 79, 0, 0, 393, 394, 5, 67, 0, 0, 394, 395, 5, 65, 0, 0, 395, 396, + 5, 76, 0, 0, 396, 397, 5, 76, 0, 0, 397, 398, 5, 89, 0, 0, 398, 399, 1, + 0, 0, 0, 399, 400, 6, 5, 1, 0, 400, 18, 1, 0, 0, 0, 401, 402, 5, 67, 0, + 0, 402, 403, 5, 79, 0, 0, 403, 404, 5, 80, 0, 0, 404, 405, 5, 89, 0, 0, + 405, 406, 1, 0, 0, 0, 406, 407, 6, 6, 1, 0, 407, 20, 1, 0, 0, 0, 408, 409, + 5, 83, 0, 0, 409, 410, 5, 65, 0, 0, 410, 411, 5, 86, 0, 0, 411, 412, 5, + 69, 0, 0, 412, 413, 5, 32, 0, 0, 413, 414, 5, 65, 0, 0, 414, 415, 5, 82, + 0, 0, 415, 416, 5, 84, 0, 0, 416, 417, 5, 73, 0, 0, 417, 418, 5, 70, 0, + 0, 418, 419, 5, 65, 0, 0, 419, 420, 5, 67, 0, 0, 420, 421, 5, 84, 0, 0, + 421, 422, 1, 0, 0, 0, 422, 423, 6, 7, 1, 0, 423, 22, 1, 0, 0, 0, 424, 425, + 5, 83, 0, 0, 425, 426, 5, 65, 0, 0, 426, 427, 5, 86, 0, 0, 427, 428, 5, + 69, 0, 0, 428, 429, 5, 32, 0, 0, 429, 430, 5, 73, 0, 0, 430, 431, 5, 77, + 0, 0, 431, 432, 5, 65, 0, 0, 432, 433, 5, 71, 0, 0, 433, 434, 5, 69, 0, + 0, 434, 435, 1, 0, 0, 0, 435, 436, 6, 8, 1, 0, 436, 24, 1, 0, 0, 0, 437, + 438, 5, 82, 0, 0, 438, 439, 5, 85, 0, 0, 439, 440, 5, 78, 0, 0, 440, 441, + 1, 0, 0, 0, 441, 442, 6, 9, 1, 0, 442, 26, 1, 0, 0, 0, 443, 444, 5, 69, + 0, 0, 444, 445, 5, 88, 0, 0, 445, 446, 5, 80, 0, 0, 446, 447, 5, 79, 0, + 0, 447, 448, 5, 83, 0, 0, 448, 449, 5, 69, 0, 0, 449, 450, 1, 0, 0, 0, + 450, 451, 6, 10, 1, 0, 451, 28, 1, 0, 0, 0, 452, 453, 5, 86, 0, 0, 453, + 454, 5, 79, 0, 0, 454, 455, 5, 76, 0, 0, 455, 456, 5, 85, 0, 0, 456, 457, + 5, 77, 0, 0, 457, 458, 5, 69, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 6, + 11, 1, 0, 460, 30, 1, 0, 0, 0, 461, 462, 5, 69, 0, 0, 462, 463, 5, 78, + 0, 0, 463, 464, 5, 86, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 6, 12, 2, + 0, 466, 32, 1, 0, 0, 0, 467, 468, 5, 65, 0, 0, 468, 469, 5, 82, 0, 0, 469, + 470, 5, 71, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 6, 13, 2, 0, 472, 34, + 1, 0, 0, 0, 473, 474, 5, 83, 0, 0, 474, 475, 5, 69, 0, 0, 475, 476, 5, + 84, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 6, 14, 2, 0, 478, 36, 1, 0, 0, + 0, 479, 480, 5, 76, 0, 0, 480, 481, 5, 69, 0, 0, 481, 482, 5, 84, 0, 0, + 482, 483, 1, 0, 0, 0, 483, 484, 6, 15, 2, 0, 484, 38, 1, 0, 0, 0, 485, + 486, 5, 76, 0, 0, 486, 487, 5, 65, 0, 0, 487, 488, 5, 66, 0, 0, 488, 489, + 5, 69, 0, 0, 489, 490, 5, 76, 0, 0, 490, 491, 1, 0, 0, 0, 491, 492, 6, + 16, 3, 0, 492, 40, 1, 0, 0, 0, 493, 494, 5, 66, 0, 0, 494, 495, 5, 85, + 0, 0, 495, 496, 5, 73, 0, 0, 496, 497, 5, 76, 0, 0, 497, 498, 5, 68, 0, + 0, 498, 499, 1, 0, 0, 0, 499, 500, 6, 17, 1, 0, 500, 42, 1, 0, 0, 0, 501, + 502, 5, 87, 0, 0, 502, 503, 5, 79, 0, 0, 503, 504, 5, 82, 0, 0, 504, 505, + 5, 75, 0, 0, 505, 506, 5, 68, 0, 0, 506, 507, 5, 73, 0, 0, 507, 508, 5, + 82, 0, 0, 508, 509, 1, 0, 0, 0, 509, 510, 6, 18, 1, 0, 510, 44, 1, 0, 0, + 0, 511, 512, 5, 85, 0, 0, 512, 513, 5, 83, 0, 0, 513, 514, 5, 69, 0, 0, + 514, 515, 5, 82, 0, 0, 515, 516, 1, 0, 0, 0, 516, 517, 6, 19, 1, 0, 517, + 46, 1, 0, 0, 0, 518, 519, 5, 67, 0, 0, 519, 520, 5, 77, 0, 0, 520, 521, + 5, 68, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 6, 20, 1, 0, 523, 48, 1, 0, + 0, 0, 524, 525, 5, 69, 0, 0, 525, 526, 5, 78, 0, 0, 526, 527, 5, 84, 0, + 0, 527, 528, 5, 82, 0, 0, 528, 529, 5, 89, 0, 0, 529, 530, 5, 80, 0, 0, + 530, 531, 5, 79, 0, 0, 531, 532, 5, 73, 0, 0, 532, 533, 5, 78, 0, 0, 533, + 534, 5, 84, 0, 0, 534, 535, 1, 0, 0, 0, 535, 536, 6, 21, 1, 0, 536, 50, + 1, 0, 0, 0, 537, 538, 5, 71, 0, 0, 538, 539, 5, 73, 0, 0, 539, 540, 5, + 84, 0, 0, 540, 541, 5, 32, 0, 0, 541, 542, 5, 67, 0, 0, 542, 543, 5, 76, + 0, 0, 543, 544, 5, 79, 0, 0, 544, 545, 5, 78, 0, 0, 545, 546, 5, 69, 0, + 0, 546, 547, 1, 0, 0, 0, 547, 548, 6, 22, 1, 0, 548, 52, 1, 0, 0, 0, 549, + 550, 5, 65, 0, 0, 550, 551, 5, 68, 0, 0, 551, 552, 5, 68, 0, 0, 552, 553, + 1, 0, 0, 0, 553, 554, 6, 23, 1, 0, 554, 54, 1, 0, 0, 0, 555, 556, 5, 83, + 0, 0, 556, 557, 5, 84, 0, 0, 557, 558, 5, 79, 0, 0, 558, 559, 5, 80, 0, + 0, 559, 560, 5, 83, 0, 0, 560, 561, 5, 73, 0, 0, 561, 562, 5, 71, 0, 0, + 562, 563, 5, 78, 0, 0, 563, 564, 5, 65, 0, 0, 564, 565, 5, 76, 0, 0, 565, + 566, 1, 0, 0, 0, 566, 567, 6, 24, 1, 0, 567, 56, 1, 0, 0, 0, 568, 569, + 5, 79, 0, 0, 569, 570, 5, 78, 0, 0, 570, 571, 5, 66, 0, 0, 571, 572, 5, + 85, 0, 0, 572, 573, 5, 73, 0, 0, 573, 574, 5, 76, 0, 0, 574, 575, 5, 68, + 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 6, 25, 1, 0, 577, 58, 1, 0, 0, 0, + 578, 579, 5, 72, 0, 0, 579, 580, 5, 69, 0, 0, 580, 581, 5, 65, 0, 0, 581, + 582, 5, 76, 0, 0, 582, 583, 5, 84, 0, 0, 583, 584, 5, 72, 0, 0, 584, 585, + 5, 67, 0, 0, 585, 586, 5, 72, 0, 0, 586, 587, 5, 69, 0, 0, 587, 588, 5, + 67, 0, 0, 588, 589, 5, 75, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 6, 26, + 1, 0, 591, 60, 1, 0, 0, 0, 592, 593, 5, 83, 0, 0, 593, 594, 5, 72, 0, 0, + 594, 595, 5, 69, 0, 0, 595, 596, 5, 76, 0, 0, 596, 597, 5, 76, 0, 0, 597, + 598, 1, 0, 0, 0, 598, 599, 6, 27, 1, 0, 599, 62, 1, 0, 0, 0, 600, 601, + 5, 68, 0, 0, 601, 602, 5, 79, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 6, + 28, 1, 0, 604, 64, 1, 0, 0, 0, 605, 606, 5, 67, 0, 0, 606, 607, 5, 79, + 0, 0, 607, 608, 5, 77, 0, 0, 608, 609, 5, 77, 0, 0, 609, 610, 5, 65, 0, + 0, 610, 611, 5, 78, 0, 0, 611, 612, 5, 68, 0, 0, 612, 613, 1, 0, 0, 0, + 613, 614, 6, 29, 1, 0, 614, 66, 1, 0, 0, 0, 615, 616, 5, 70, 0, 0, 616, + 617, 5, 85, 0, 0, 617, 618, 5, 78, 0, 0, 618, 619, 5, 67, 0, 0, 619, 620, + 5, 84, 0, 0, 620, 621, 5, 73, 0, 0, 621, 622, 5, 79, 0, 0, 622, 623, 5, + 78, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 6, 30, 1, 0, 625, 68, 1, 0, 0, + 0, 626, 627, 5, 73, 0, 0, 627, 628, 5, 77, 0, 0, 628, 629, 5, 80, 0, 0, + 629, 630, 5, 79, 0, 0, 630, 631, 5, 82, 0, 0, 631, 632, 5, 84, 0, 0, 632, + 633, 1, 0, 0, 0, 633, 634, 6, 31, 1, 0, 634, 70, 1, 0, 0, 0, 635, 636, + 5, 86, 0, 0, 636, 637, 5, 69, 0, 0, 637, 638, 5, 82, 0, 0, 638, 639, 5, + 83, 0, 0, 639, 640, 5, 73, 0, 0, 640, 641, 5, 79, 0, 0, 641, 642, 5, 78, + 0, 0, 642, 643, 1, 0, 0, 0, 643, 644, 6, 32, 1, 0, 644, 72, 1, 0, 0, 0, + 645, 646, 5, 67, 0, 0, 646, 647, 5, 65, 0, 0, 647, 648, 5, 67, 0, 0, 648, + 649, 5, 72, 0, 0, 649, 650, 5, 69, 0, 0, 650, 651, 1, 0, 0, 0, 651, 652, + 6, 33, 1, 0, 652, 74, 1, 0, 0, 0, 653, 654, 5, 72, 0, 0, 654, 655, 5, 79, + 0, 0, 655, 656, 5, 83, 0, 0, 656, 657, 5, 84, 0, 0, 657, 658, 1, 0, 0, + 0, 658, 659, 6, 34, 1, 0, 659, 76, 1, 0, 0, 0, 660, 661, 5, 80, 0, 0, 661, + 662, 5, 82, 0, 0, 662, 663, 5, 79, 0, 0, 663, 664, 5, 74, 0, 0, 664, 665, + 5, 69, 0, 0, 665, 666, 5, 67, 0, 0, 666, 667, 5, 84, 0, 0, 667, 668, 1, + 0, 0, 0, 668, 669, 6, 35, 1, 0, 669, 78, 1, 0, 0, 0, 670, 671, 5, 80, 0, + 0, 671, 672, 5, 73, 0, 0, 672, 673, 5, 80, 0, 0, 673, 674, 5, 69, 0, 0, + 674, 675, 5, 76, 0, 0, 675, 676, 5, 73, 0, 0, 676, 677, 5, 78, 0, 0, 677, + 678, 5, 69, 0, 0, 678, 679, 1, 0, 0, 0, 679, 680, 6, 36, 1, 0, 680, 80, + 1, 0, 0, 0, 681, 682, 5, 84, 0, 0, 682, 683, 5, 82, 0, 0, 683, 684, 5, + 73, 0, 0, 684, 685, 5, 71, 0, 0, 685, 686, 5, 71, 0, 0, 686, 687, 5, 69, + 0, 0, 687, 688, 5, 82, 0, 0, 688, 689, 1, 0, 0, 0, 689, 690, 6, 37, 1, + 0, 690, 82, 1, 0, 0, 0, 691, 692, 5, 87, 0, 0, 692, 693, 5, 73, 0, 0, 693, + 694, 5, 84, 0, 0, 694, 695, 5, 72, 0, 0, 695, 84, 1, 0, 0, 0, 696, 697, + 5, 68, 0, 0, 697, 698, 5, 79, 0, 0, 698, 699, 5, 67, 0, 0, 699, 700, 5, + 75, 0, 0, 700, 701, 5, 69, 0, 0, 701, 702, 5, 82, 0, 0, 702, 703, 1, 0, + 0, 0, 703, 704, 6, 39, 4, 0, 704, 705, 6, 39, 1, 0, 705, 86, 1, 0, 0, 0, + 706, 707, 5, 73, 0, 0, 707, 708, 5, 70, 0, 0, 708, 709, 1, 0, 0, 0, 709, + 710, 6, 40, 4, 0, 710, 711, 6, 40, 1, 0, 711, 88, 1, 0, 0, 0, 712, 713, + 5, 84, 0, 0, 713, 714, 5, 82, 0, 0, 714, 715, 5, 89, 0, 0, 715, 716, 1, + 0, 0, 0, 716, 717, 6, 41, 4, 0, 717, 718, 6, 41, 1, 0, 718, 90, 1, 0, 0, + 0, 719, 720, 5, 70, 0, 0, 720, 721, 5, 79, 0, 0, 721, 722, 5, 82, 0, 0, + 722, 723, 1, 0, 0, 0, 723, 724, 6, 42, 4, 0, 724, 725, 6, 42, 1, 0, 725, + 92, 1, 0, 0, 0, 726, 727, 5, 87, 0, 0, 727, 728, 5, 65, 0, 0, 728, 729, + 5, 73, 0, 0, 729, 730, 5, 84, 0, 0, 730, 731, 1, 0, 0, 0, 731, 732, 6, + 43, 4, 0, 732, 733, 6, 43, 1, 0, 733, 94, 1, 0, 0, 0, 734, 736, 7, 4, 0, + 0, 735, 734, 1, 0, 0, 0, 736, 739, 1, 0, 0, 0, 737, 735, 1, 0, 0, 0, 737, + 738, 1, 0, 0, 0, 738, 742, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 740, 743, + 5, 0, 0, 1, 741, 743, 3, 101, 47, 0, 742, 740, 1, 0, 0, 0, 742, 741, 1, + 0, 0, 0, 743, 96, 1, 0, 0, 0, 744, 749, 7, 4, 0, 0, 745, 748, 7, 4, 0, + 0, 746, 748, 3, 105, 49, 0, 747, 745, 1, 0, 0, 0, 747, 746, 1, 0, 0, 0, + 748, 751, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 749, 750, 1, 0, 0, 0, 750, + 752, 1, 0, 0, 0, 751, 749, 1, 0, 0, 0, 752, 753, 6, 45, 5, 0, 753, 98, + 1, 0, 0, 0, 754, 756, 7, 4, 0, 0, 755, 754, 1, 0, 0, 0, 756, 759, 1, 0, + 0, 0, 757, 755, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, + 759, 757, 1, 0, 0, 0, 760, 764, 5, 35, 0, 0, 761, 763, 8, 5, 0, 0, 762, + 761, 1, 0, 0, 0, 763, 766, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 764, 765, + 1, 0, 0, 0, 765, 767, 1, 0, 0, 0, 766, 764, 1, 0, 0, 0, 767, 768, 6, 46, + 6, 0, 768, 100, 1, 0, 0, 0, 769, 773, 7, 5, 0, 0, 770, 771, 5, 13, 0, 0, + 771, 773, 5, 10, 0, 0, 772, 769, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 773, + 102, 1, 0, 0, 0, 774, 776, 7, 4, 0, 0, 775, 774, 1, 0, 0, 0, 776, 779, + 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 780, 1, 0, + 0, 0, 779, 777, 1, 0, 0, 0, 780, 789, 3, 101, 47, 0, 781, 783, 7, 4, 0, + 0, 782, 781, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 782, 1, 0, 0, 0, 784, + 785, 1, 0, 0, 0, 785, 787, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 787, 789, + 3, 99, 46, 0, 788, 777, 1, 0, 0, 0, 788, 784, 1, 0, 0, 0, 789, 104, 1, + 0, 0, 0, 790, 792, 5, 92, 0, 0, 791, 793, 3, 103, 48, 0, 792, 791, 1, 0, + 0, 0, 793, 794, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, + 795, 106, 1, 0, 0, 0, 796, 797, 3, 7, 0, 0, 797, 798, 1, 0, 0, 0, 798, + 799, 6, 50, 7, 0, 799, 108, 1, 0, 0, 0, 800, 801, 3, 9, 1, 0, 801, 802, + 1, 0, 0, 0, 802, 803, 6, 51, 8, 0, 803, 110, 1, 0, 0, 0, 804, 805, 3, 11, + 2, 0, 805, 806, 1, 0, 0, 0, 806, 807, 6, 52, 9, 0, 807, 112, 1, 0, 0, 0, + 808, 809, 3, 13, 3, 0, 809, 810, 1, 0, 0, 0, 810, 811, 6, 53, 10, 0, 811, + 812, 6, 53, 1, 0, 812, 114, 1, 0, 0, 0, 813, 814, 3, 15, 4, 0, 814, 815, + 1, 0, 0, 0, 815, 816, 6, 54, 11, 0, 816, 817, 6, 54, 1, 0, 817, 116, 1, + 0, 0, 0, 818, 819, 3, 17, 5, 0, 819, 820, 1, 0, 0, 0, 820, 821, 6, 55, + 12, 0, 821, 822, 6, 55, 1, 0, 822, 118, 1, 0, 0, 0, 823, 824, 3, 19, 6, + 0, 824, 825, 1, 0, 0, 0, 825, 826, 6, 56, 13, 0, 826, 827, 6, 56, 1, 0, + 827, 120, 1, 0, 0, 0, 828, 829, 3, 21, 7, 0, 829, 830, 1, 0, 0, 0, 830, + 831, 6, 57, 14, 0, 831, 832, 6, 57, 1, 0, 832, 122, 1, 0, 0, 0, 833, 834, + 3, 23, 8, 0, 834, 835, 1, 0, 0, 0, 835, 836, 6, 58, 15, 0, 836, 837, 6, + 58, 1, 0, 837, 124, 1, 0, 0, 0, 838, 839, 3, 25, 9, 0, 839, 840, 1, 0, + 0, 0, 840, 841, 6, 59, 16, 0, 841, 842, 6, 59, 1, 0, 842, 126, 1, 0, 0, + 0, 843, 844, 3, 27, 10, 0, 844, 845, 1, 0, 0, 0, 845, 846, 6, 60, 17, 0, + 846, 847, 6, 60, 1, 0, 847, 128, 1, 0, 0, 0, 848, 849, 3, 29, 11, 0, 849, + 850, 1, 0, 0, 0, 850, 851, 6, 61, 18, 0, 851, 852, 6, 61, 1, 0, 852, 130, + 1, 0, 0, 0, 853, 854, 3, 31, 12, 0, 854, 855, 1, 0, 0, 0, 855, 856, 6, + 62, 19, 0, 856, 857, 6, 62, 2, 0, 857, 132, 1, 0, 0, 0, 858, 859, 3, 33, + 13, 0, 859, 860, 1, 0, 0, 0, 860, 861, 6, 63, 20, 0, 861, 862, 6, 63, 2, + 0, 862, 134, 1, 0, 0, 0, 863, 864, 3, 35, 14, 0, 864, 865, 1, 0, 0, 0, + 865, 866, 6, 64, 21, 0, 866, 867, 6, 64, 2, 0, 867, 136, 1, 0, 0, 0, 868, + 869, 3, 37, 15, 0, 869, 870, 1, 0, 0, 0, 870, 871, 6, 65, 22, 0, 871, 872, + 6, 65, 2, 0, 872, 138, 1, 0, 0, 0, 873, 874, 3, 39, 16, 0, 874, 875, 1, + 0, 0, 0, 875, 876, 6, 66, 23, 0, 876, 877, 6, 66, 3, 0, 877, 140, 1, 0, + 0, 0, 878, 879, 3, 41, 17, 0, 879, 880, 1, 0, 0, 0, 880, 881, 6, 67, 24, + 0, 881, 882, 6, 67, 1, 0, 882, 142, 1, 0, 0, 0, 883, 884, 3, 43, 18, 0, + 884, 885, 1, 0, 0, 0, 885, 886, 6, 68, 25, 0, 886, 887, 6, 68, 1, 0, 887, + 144, 1, 0, 0, 0, 888, 889, 3, 45, 19, 0, 889, 890, 1, 0, 0, 0, 890, 891, + 6, 69, 26, 0, 891, 892, 6, 69, 1, 0, 892, 146, 1, 0, 0, 0, 893, 894, 3, + 47, 20, 0, 894, 895, 1, 0, 0, 0, 895, 896, 6, 70, 27, 0, 896, 897, 6, 70, + 1, 0, 897, 148, 1, 0, 0, 0, 898, 899, 3, 49, 21, 0, 899, 900, 1, 0, 0, + 0, 900, 901, 6, 71, 28, 0, 901, 902, 6, 71, 1, 0, 902, 150, 1, 0, 0, 0, + 903, 904, 3, 51, 22, 0, 904, 905, 1, 0, 0, 0, 905, 906, 6, 72, 29, 0, 906, + 907, 6, 72, 1, 0, 907, 152, 1, 0, 0, 0, 908, 909, 3, 53, 23, 0, 909, 910, + 1, 0, 0, 0, 910, 911, 6, 73, 30, 0, 911, 912, 6, 73, 1, 0, 912, 154, 1, + 0, 0, 0, 913, 914, 3, 55, 24, 0, 914, 915, 1, 0, 0, 0, 915, 916, 6, 74, + 31, 0, 916, 917, 6, 74, 1, 0, 917, 156, 1, 0, 0, 0, 918, 919, 3, 57, 25, + 0, 919, 920, 1, 0, 0, 0, 920, 921, 6, 75, 32, 0, 921, 922, 6, 75, 1, 0, + 922, 158, 1, 0, 0, 0, 923, 924, 3, 59, 26, 0, 924, 925, 1, 0, 0, 0, 925, + 926, 6, 76, 33, 0, 926, 927, 6, 76, 1, 0, 927, 160, 1, 0, 0, 0, 928, 929, + 3, 61, 27, 0, 929, 930, 1, 0, 0, 0, 930, 931, 6, 77, 34, 0, 931, 932, 6, + 77, 1, 0, 932, 162, 1, 0, 0, 0, 933, 934, 3, 63, 28, 0, 934, 935, 1, 0, + 0, 0, 935, 936, 6, 78, 35, 0, 936, 937, 6, 78, 1, 0, 937, 164, 1, 0, 0, + 0, 938, 939, 3, 65, 29, 0, 939, 940, 1, 0, 0, 0, 940, 941, 6, 79, 36, 0, + 941, 942, 6, 79, 1, 0, 942, 166, 1, 0, 0, 0, 943, 944, 3, 67, 30, 0, 944, + 945, 1, 0, 0, 0, 945, 946, 6, 80, 37, 0, 946, 947, 6, 80, 1, 0, 947, 168, + 1, 0, 0, 0, 948, 949, 3, 69, 31, 0, 949, 950, 1, 0, 0, 0, 950, 951, 6, + 81, 38, 0, 951, 952, 6, 81, 1, 0, 952, 170, 1, 0, 0, 0, 953, 954, 3, 73, + 33, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 82, 39, 0, 956, 957, 6, 82, 1, + 0, 957, 172, 1, 0, 0, 0, 958, 959, 3, 75, 34, 0, 959, 960, 1, 0, 0, 0, + 960, 961, 6, 83, 40, 0, 961, 962, 6, 83, 1, 0, 962, 174, 1, 0, 0, 0, 963, + 964, 3, 79, 36, 0, 964, 965, 1, 0, 0, 0, 965, 966, 6, 84, 41, 0, 966, 967, + 6, 84, 1, 0, 967, 176, 1, 0, 0, 0, 968, 969, 3, 81, 37, 0, 969, 970, 1, + 0, 0, 0, 970, 971, 6, 85, 42, 0, 971, 972, 6, 85, 1, 0, 972, 178, 1, 0, + 0, 0, 973, 974, 3, 83, 38, 0, 974, 975, 1, 0, 0, 0, 975, 976, 6, 86, 43, + 0, 976, 180, 1, 0, 0, 0, 977, 978, 3, 85, 39, 0, 978, 979, 1, 0, 0, 0, + 979, 980, 6, 87, 44, 0, 980, 981, 6, 87, 4, 0, 981, 982, 6, 87, 1, 0, 982, + 182, 1, 0, 0, 0, 983, 984, 3, 87, 40, 0, 984, 985, 1, 0, 0, 0, 985, 986, + 6, 88, 45, 0, 986, 987, 6, 88, 4, 0, 987, 988, 6, 88, 1, 0, 988, 184, 1, + 0, 0, 0, 989, 990, 3, 89, 41, 0, 990, 991, 1, 0, 0, 0, 991, 992, 6, 89, + 46, 0, 992, 993, 6, 89, 4, 0, 993, 994, 6, 89, 1, 0, 994, 186, 1, 0, 0, + 0, 995, 996, 3, 91, 42, 0, 996, 997, 1, 0, 0, 0, 997, 998, 6, 90, 47, 0, + 998, 999, 6, 90, 4, 0, 999, 1000, 6, 90, 1, 0, 1000, 188, 1, 0, 0, 0, 1001, + 1002, 3, 93, 43, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1004, 6, 91, 48, 0, 1004, + 1005, 6, 91, 4, 0, 1005, 1006, 6, 91, 1, 0, 1006, 190, 1, 0, 0, 0, 1007, + 1008, 3, 95, 44, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1010, 6, 92, 49, 0, 1010, + 192, 1, 0, 0, 0, 1011, 1012, 3, 97, 45, 0, 1012, 1013, 1, 0, 0, 0, 1013, + 1014, 6, 93, 50, 0, 1014, 1015, 6, 93, 5, 0, 1015, 194, 1, 0, 0, 0, 1016, + 1017, 3, 99, 46, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 6, 94, 51, 0, 1019, + 1020, 6, 94, 6, 0, 1020, 196, 1, 0, 0, 0, 1021, 1022, 3, 13, 3, 0, 1022, + 1023, 1, 0, 0, 0, 1023, 1024, 6, 95, 10, 0, 1024, 1025, 6, 95, 1, 0, 1025, + 198, 1, 0, 0, 0, 1026, 1027, 3, 15, 4, 0, 1027, 1028, 1, 0, 0, 0, 1028, + 1029, 6, 96, 11, 0, 1029, 1030, 6, 96, 1, 0, 1030, 200, 1, 0, 0, 0, 1031, + 1032, 3, 17, 5, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 6, 97, 12, 0, 1034, + 1035, 6, 97, 1, 0, 1035, 202, 1, 0, 0, 0, 1036, 1037, 3, 19, 6, 0, 1037, + 1038, 1, 0, 0, 0, 1038, 1039, 6, 98, 13, 0, 1039, 1040, 6, 98, 1, 0, 1040, + 204, 1, 0, 0, 0, 1041, 1042, 3, 21, 7, 0, 1042, 1043, 1, 0, 0, 0, 1043, + 1044, 6, 99, 14, 0, 1044, 1045, 6, 99, 1, 0, 1045, 206, 1, 0, 0, 0, 1046, + 1047, 3, 23, 8, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1049, 6, 100, 15, 0, 1049, + 1050, 6, 100, 1, 0, 1050, 208, 1, 0, 0, 0, 1051, 1052, 3, 25, 9, 0, 1052, + 1053, 1, 0, 0, 0, 1053, 1054, 6, 101, 16, 0, 1054, 1055, 6, 101, 1, 0, + 1055, 210, 1, 0, 0, 0, 1056, 1057, 3, 27, 10, 0, 1057, 1058, 1, 0, 0, 0, + 1058, 1059, 6, 102, 17, 0, 1059, 1060, 6, 102, 1, 0, 1060, 212, 1, 0, 0, + 0, 1061, 1062, 3, 29, 11, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1064, 6, 103, + 18, 0, 1064, 1065, 6, 103, 1, 0, 1065, 214, 1, 0, 0, 0, 1066, 1067, 3, + 31, 12, 0, 1067, 1068, 1, 0, 0, 0, 1068, 1069, 6, 104, 19, 0, 1069, 1070, + 6, 104, 2, 0, 1070, 216, 1, 0, 0, 0, 1071, 1072, 3, 33, 13, 0, 1072, 1073, + 1, 0, 0, 0, 1073, 1074, 6, 105, 20, 0, 1074, 1075, 6, 105, 2, 0, 1075, + 218, 1, 0, 0, 0, 1076, 1077, 3, 35, 14, 0, 1077, 1078, 1, 0, 0, 0, 1078, + 1079, 6, 106, 21, 0, 1079, 1080, 6, 106, 2, 0, 1080, 220, 1, 0, 0, 0, 1081, + 1082, 3, 37, 15, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 6, 107, 22, 0, + 1084, 1085, 6, 107, 2, 0, 1085, 222, 1, 0, 0, 0, 1086, 1087, 3, 39, 16, + 0, 1087, 1088, 1, 0, 0, 0, 1088, 1089, 6, 108, 23, 0, 1089, 1090, 6, 108, + 3, 0, 1090, 224, 1, 0, 0, 0, 1091, 1092, 3, 41, 17, 0, 1092, 1093, 1, 0, + 0, 0, 1093, 1094, 6, 109, 24, 0, 1094, 1095, 6, 109, 1, 0, 1095, 226, 1, + 0, 0, 0, 1096, 1097, 3, 43, 18, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, + 6, 110, 25, 0, 1099, 1100, 6, 110, 1, 0, 1100, 228, 1, 0, 0, 0, 1101, 1102, + 3, 45, 19, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1104, 6, 111, 26, 0, 1104, + 1105, 6, 111, 1, 0, 1105, 230, 1, 0, 0, 0, 1106, 1107, 3, 47, 20, 0, 1107, + 1108, 1, 0, 0, 0, 1108, 1109, 6, 112, 27, 0, 1109, 1110, 6, 112, 1, 0, + 1110, 232, 1, 0, 0, 0, 1111, 1112, 3, 49, 21, 0, 1112, 1113, 1, 0, 0, 0, + 1113, 1114, 6, 113, 28, 0, 1114, 1115, 6, 113, 1, 0, 1115, 234, 1, 0, 0, + 0, 1116, 1117, 3, 51, 22, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1119, 6, 114, + 29, 0, 1119, 1120, 6, 114, 1, 0, 1120, 236, 1, 0, 0, 0, 1121, 1122, 3, + 53, 23, 0, 1122, 1123, 1, 0, 0, 0, 1123, 1124, 6, 115, 30, 0, 1124, 1125, + 6, 115, 1, 0, 1125, 238, 1, 0, 0, 0, 1126, 1127, 3, 55, 24, 0, 1127, 1128, + 1, 0, 0, 0, 1128, 1129, 6, 116, 31, 0, 1129, 1130, 6, 116, 1, 0, 1130, + 240, 1, 0, 0, 0, 1131, 1132, 3, 57, 25, 0, 1132, 1133, 1, 0, 0, 0, 1133, + 1134, 6, 117, 32, 0, 1134, 1135, 6, 117, 1, 0, 1135, 242, 1, 0, 0, 0, 1136, + 1137, 3, 59, 26, 0, 1137, 1138, 1, 0, 0, 0, 1138, 1139, 6, 118, 33, 0, + 1139, 1140, 6, 118, 1, 0, 1140, 244, 1, 0, 0, 0, 1141, 1142, 3, 61, 27, + 0, 1142, 1143, 1, 0, 0, 0, 1143, 1144, 6, 119, 34, 0, 1144, 1145, 6, 119, + 1, 0, 1145, 246, 1, 0, 0, 0, 1146, 1147, 3, 63, 28, 0, 1147, 1148, 1, 0, + 0, 0, 1148, 1149, 6, 120, 35, 0, 1149, 1150, 6, 120, 1, 0, 1150, 248, 1, + 0, 0, 0, 1151, 1152, 3, 65, 29, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1154, + 6, 121, 36, 0, 1154, 1155, 6, 121, 1, 0, 1155, 250, 1, 0, 0, 0, 1156, 1157, + 3, 67, 30, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 6, 122, 37, 0, 1159, + 1160, 6, 122, 1, 0, 1160, 252, 1, 0, 0, 0, 1161, 1162, 3, 69, 31, 0, 1162, + 1163, 1, 0, 0, 0, 1163, 1164, 6, 123, 38, 0, 1164, 1165, 6, 123, 1, 0, + 1165, 254, 1, 0, 0, 0, 1166, 1167, 3, 73, 33, 0, 1167, 1168, 1, 0, 0, 0, + 1168, 1169, 6, 124, 39, 0, 1169, 1170, 6, 124, 1, 0, 1170, 256, 1, 0, 0, + 0, 1171, 1172, 3, 75, 34, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1174, 6, 125, + 40, 0, 1174, 1175, 6, 125, 1, 0, 1175, 258, 1, 0, 0, 0, 1176, 1177, 3, + 83, 38, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 6, 126, 43, 0, 1179, 260, + 1, 0, 0, 0, 1180, 1181, 3, 85, 39, 0, 1181, 1182, 1, 0, 0, 0, 1182, 1183, + 6, 127, 44, 0, 1183, 1184, 6, 127, 4, 0, 1184, 1185, 6, 127, 1, 0, 1185, + 262, 1, 0, 0, 0, 1186, 1187, 3, 87, 40, 0, 1187, 1188, 1, 0, 0, 0, 1188, + 1189, 6, 128, 45, 0, 1189, 1190, 6, 128, 4, 0, 1190, 1191, 6, 128, 1, 0, + 1191, 264, 1, 0, 0, 0, 1192, 1193, 5, 69, 0, 0, 1193, 1194, 5, 76, 0, 0, + 1194, 1195, 5, 83, 0, 0, 1195, 1196, 5, 69, 0, 0, 1196, 1197, 1, 0, 0, + 0, 1197, 1198, 6, 129, 1, 0, 1198, 266, 1, 0, 0, 0, 1199, 1200, 5, 69, + 0, 0, 1200, 1201, 5, 76, 0, 0, 1201, 1202, 5, 83, 0, 0, 1202, 1203, 5, + 69, 0, 0, 1203, 1204, 5, 32, 0, 0, 1204, 1205, 5, 73, 0, 0, 1205, 1206, + 5, 70, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 6, 130, 1, 0, 1208, 268, + 1, 0, 0, 0, 1209, 1210, 3, 89, 41, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, + 6, 131, 46, 0, 1212, 1213, 6, 131, 4, 0, 1213, 1214, 6, 131, 1, 0, 1214, + 270, 1, 0, 0, 0, 1215, 1216, 5, 67, 0, 0, 1216, 1217, 5, 65, 0, 0, 1217, + 1218, 5, 84, 0, 0, 1218, 1219, 5, 67, 0, 0, 1219, 1220, 5, 72, 0, 0, 1220, + 1221, 1, 0, 0, 0, 1221, 1222, 6, 132, 1, 0, 1222, 272, 1, 0, 0, 0, 1223, + 1224, 5, 70, 0, 0, 1224, 1225, 5, 73, 0, 0, 1225, 1226, 5, 78, 0, 0, 1226, + 1227, 5, 65, 0, 0, 1227, 1228, 5, 76, 0, 0, 1228, 1229, 5, 76, 0, 0, 1229, + 1230, 5, 89, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 6, 133, 1, 0, 1232, + 274, 1, 0, 0, 0, 1233, 1234, 3, 91, 42, 0, 1234, 1235, 1, 0, 0, 0, 1235, + 1236, 6, 134, 47, 0, 1236, 1237, 6, 134, 4, 0, 1237, 1238, 6, 134, 1, 0, + 1238, 276, 1, 0, 0, 0, 1239, 1240, 3, 93, 43, 0, 1240, 1241, 1, 0, 0, 0, + 1241, 1242, 6, 135, 48, 0, 1242, 1243, 6, 135, 4, 0, 1243, 278, 1, 0, 0, + 0, 1244, 1245, 5, 69, 0, 0, 1245, 1246, 5, 78, 0, 0, 1246, 1247, 5, 68, + 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1249, 6, 136, 52, 0, 1249, 1250, 6, + 136, 1, 0, 1250, 280, 1, 0, 0, 0, 1251, 1252, 3, 95, 44, 0, 1252, 1253, + 1, 0, 0, 0, 1253, 1254, 6, 137, 49, 0, 1254, 282, 1, 0, 0, 0, 1255, 1256, + 3, 97, 45, 0, 1256, 1257, 1, 0, 0, 0, 1257, 1258, 6, 138, 50, 0, 1258, + 1259, 6, 138, 5, 0, 1259, 284, 1, 0, 0, 0, 1260, 1261, 3, 99, 46, 0, 1261, + 1262, 1, 0, 0, 0, 1262, 1263, 6, 139, 51, 0, 1263, 1264, 6, 139, 6, 0, + 1264, 286, 1, 0, 0, 0, 1265, 1269, 3, 293, 143, 0, 1266, 1269, 3, 289, + 141, 0, 1267, 1269, 3, 291, 142, 0, 1268, 1265, 1, 0, 0, 0, 1268, 1266, + 1, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1269, 1270, 1, 0, 0, 0, 1270, 1268, + 1, 0, 0, 0, 1270, 1271, 1, 0, 0, 0, 1271, 288, 1, 0, 0, 0, 1272, 1279, + 5, 34, 0, 0, 1273, 1278, 3, 291, 142, 0, 1274, 1278, 8, 6, 0, 0, 1275, + 1276, 5, 92, 0, 0, 1276, 1278, 9, 0, 0, 0, 1277, 1273, 1, 0, 0, 0, 1277, + 1274, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1278, 1281, 1, 0, 0, 0, 1279, + 1277, 1, 0, 0, 0, 1279, 1280, 1, 0, 0, 0, 1280, 1282, 1, 0, 0, 0, 1281, + 1279, 1, 0, 0, 0, 1282, 1283, 5, 34, 0, 0, 1283, 290, 1, 0, 0, 0, 1284, + 1285, 5, 36, 0, 0, 1285, 1286, 5, 40, 0, 0, 1286, 1291, 1, 0, 0, 0, 1287, + 1292, 8, 7, 0, 0, 1288, 1292, 3, 289, 141, 0, 1289, 1292, 3, 291, 142, + 0, 1290, 1292, 3, 97, 45, 0, 1291, 1287, 1, 0, 0, 0, 1291, 1288, 1, 0, + 0, 0, 1291, 1289, 1, 0, 0, 0, 1291, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, + 0, 0, 1293, 1291, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 1, 0, + 0, 0, 1295, 1296, 5, 41, 0, 0, 1296, 292, 1, 0, 0, 0, 1297, 1300, 8, 8, + 0, 0, 1298, 1300, 3, 295, 144, 0, 1299, 1297, 1, 0, 0, 0, 1299, 1298, 1, + 0, 0, 0, 1300, 294, 1, 0, 0, 0, 1301, 1302, 5, 92, 0, 0, 1302, 1311, 9, + 0, 0, 0, 1303, 1307, 3, 105, 49, 0, 1304, 1306, 7, 4, 0, 0, 1305, 1304, + 1, 0, 0, 0, 1306, 1309, 1, 0, 0, 0, 1307, 1305, 1, 0, 0, 0, 1307, 1308, + 1, 0, 0, 0, 1308, 1311, 1, 0, 0, 0, 1309, 1307, 1, 0, 0, 0, 1310, 1301, + 1, 0, 0, 0, 1310, 1303, 1, 0, 0, 0, 1311, 296, 1, 0, 0, 0, 1312, 1313, + 3, 95, 44, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 145, 49, 0, 1315, + 1316, 6, 145, 52, 0, 1316, 298, 1, 0, 0, 0, 1317, 1318, 3, 97, 45, 0, 1318, + 1319, 1, 0, 0, 0, 1319, 1320, 6, 146, 50, 0, 1320, 1321, 6, 146, 5, 0, + 1321, 300, 1, 0, 0, 0, 1322, 1323, 3, 99, 46, 0, 1323, 1324, 1, 0, 0, 0, + 1324, 1325, 6, 147, 51, 0, 1325, 1326, 6, 147, 6, 0, 1326, 302, 1, 0, 0, + 0, 1327, 1328, 5, 61, 0, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1330, 6, 148, + 53, 0, 1330, 304, 1, 0, 0, 0, 1331, 1335, 3, 307, 150, 0, 1332, 1335, 3, + 289, 141, 0, 1333, 1335, 3, 291, 142, 0, 1334, 1331, 1, 0, 0, 0, 1334, + 1332, 1, 0, 0, 0, 1334, 1333, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, + 1334, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 1, 0, 0, 0, 1338, + 1339, 6, 149, 54, 0, 1339, 306, 1, 0, 0, 0, 1340, 1343, 8, 9, 0, 0, 1341, + 1343, 3, 295, 144, 0, 1342, 1340, 1, 0, 0, 0, 1342, 1341, 1, 0, 0, 0, 1343, + 308, 1, 0, 0, 0, 1344, 1345, 3, 95, 44, 0, 1345, 1346, 1, 0, 0, 0, 1346, + 1347, 6, 151, 49, 0, 1347, 1348, 6, 151, 52, 0, 1348, 310, 1, 0, 0, 0, + 1349, 1350, 3, 97, 45, 0, 1350, 1351, 1, 0, 0, 0, 1351, 1352, 6, 152, 50, + 0, 1352, 1353, 6, 152, 5, 0, 1353, 312, 1, 0, 0, 0, 1354, 1355, 3, 99, + 46, 0, 1355, 1356, 1, 0, 0, 0, 1356, 1357, 6, 153, 51, 0, 1357, 1358, 6, + 153, 6, 0, 1358, 314, 1, 0, 0, 0, 1359, 1360, 3, 287, 140, 0, 1360, 1361, + 1, 0, 0, 0, 1361, 1362, 6, 154, 54, 0, 1362, 316, 1, 0, 0, 0, 1363, 1364, + 3, 95, 44, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1366, 6, 155, 49, 0, 1366, + 1367, 6, 155, 52, 0, 1367, 318, 1, 0, 0, 0, 1368, 1369, 3, 97, 45, 0, 1369, + 1370, 1, 0, 0, 0, 1370, 1371, 6, 156, 50, 0, 1371, 320, 1, 0, 0, 0, 1372, + 1373, 3, 99, 46, 0, 1373, 1374, 1, 0, 0, 0, 1374, 1375, 6, 157, 51, 0, + 1375, 1376, 6, 157, 6, 0, 1376, 322, 1, 0, 0, 0, 1377, 1378, 5, 61, 0, + 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 6, 158, 55, 0, 1380, 324, 1, 0, + 0, 0, 1381, 1382, 3, 305, 149, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1384, 6, + 159, 54, 0, 1384, 326, 1, 0, 0, 0, 1385, 1386, 3, 309, 151, 0, 1386, 1387, + 1, 0, 0, 0, 1387, 1388, 6, 160, 49, 0, 1388, 1389, 6, 160, 52, 0, 1389, + 328, 1, 0, 0, 0, 1390, 1391, 3, 311, 152, 0, 1391, 1392, 1, 0, 0, 0, 1392, + 1393, 6, 161, 50, 0, 1393, 1394, 6, 161, 5, 0, 1394, 330, 1, 0, 0, 0, 1395, + 1396, 3, 99, 46, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 162, 51, 0, + 1398, 1399, 6, 162, 6, 0, 1399, 332, 1, 0, 0, 0, 34, 0, 1, 2, 3, 4, 5, + 6, 335, 337, 348, 359, 737, 742, 747, 749, 757, 764, 772, 777, 784, 788, + 794, 1268, 1270, 1277, 1279, 1291, 1293, 1299, 1307, 1310, 1334, 1336, + 1342, 56, 5, 1, 0, 5, 3, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 0, 2, 0, 0, 3, 0, + 7, 3, 0, 7, 4, 0, 7, 5, 0, 7, 6, 0, 7, 7, 0, 7, 8, 0, 7, 9, 0, 7, 10, 0, + 7, 11, 0, 7, 12, 0, 7, 13, 0, 7, 14, 0, 7, 15, 0, 7, 16, 0, 7, 17, 0, 7, + 18, 0, 7, 19, 0, 7, 20, 0, 7, 21, 0, 7, 22, 0, 7, 23, 0, 7, 24, 0, 7, 25, + 0, 7, 26, 0, 7, 27, 0, 7, 28, 0, 7, 29, 0, 7, 30, 0, 7, 31, 0, 7, 32, 0, + 7, 33, 0, 7, 34, 0, 7, 36, 0, 7, 37, 0, 7, 39, 0, 7, 40, 0, 7, 41, 0, 7, + 42, 0, 7, 43, 0, 7, 44, 0, 7, 45, 0, 7, 46, 0, 7, 47, 0, 7, 48, 0, 7, 49, + 0, 4, 0, 0, 2, 5, 0, 7, 55, 0, 7, 56, 0, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -740,56 +761,58 @@ const ( EarthLexerDEDENT = 2 EarthLexerTarget = 3 EarthLexerUserCommand = 4 - EarthLexerFROM = 5 - EarthLexerFROM_DOCKERFILE = 6 - EarthLexerLOCALLY = 7 - EarthLexerCOPY = 8 - EarthLexerSAVE_ARTIFACT = 9 - EarthLexerSAVE_IMAGE = 10 - EarthLexerRUN = 11 - EarthLexerEXPOSE = 12 - EarthLexerVOLUME = 13 - EarthLexerENV = 14 - EarthLexerARG = 15 - EarthLexerSET = 16 - EarthLexerLET = 17 - EarthLexerLABEL = 18 - EarthLexerBUILD = 19 - EarthLexerWORKDIR = 20 - EarthLexerUSER = 21 - EarthLexerCMD = 22 - EarthLexerENTRYPOINT = 23 - EarthLexerGIT_CLONE = 24 - EarthLexerADD = 25 - EarthLexerSTOPSIGNAL = 26 - EarthLexerONBUILD = 27 - EarthLexerHEALTHCHECK = 28 - EarthLexerSHELL = 29 - EarthLexerDO = 30 - EarthLexerCOMMAND = 31 - EarthLexerIMPORT = 32 - EarthLexerVERSION = 33 - EarthLexerCACHE = 34 - EarthLexerHOST = 35 - EarthLexerPROJECT = 36 - EarthLexerPIPELINE = 37 - EarthLexerTRIGGER = 38 - EarthLexerWITH = 39 - EarthLexerDOCKER = 40 - EarthLexerIF = 41 - EarthLexerTRY = 42 - EarthLexerFOR = 43 - EarthLexerWAIT = 44 - EarthLexerNL = 45 - EarthLexerWS = 46 - EarthLexerCOMMENT = 47 - EarthLexerELSE = 48 - EarthLexerELSE_IF = 49 - EarthLexerCATCH = 50 - EarthLexerFINALLY = 51 - EarthLexerEND = 52 - EarthLexerAtom = 53 - EarthLexerEQUALS = 54 + EarthLexerFunction = 5 + EarthLexerFROM = 6 + EarthLexerFROM_DOCKERFILE = 7 + EarthLexerLOCALLY = 8 + EarthLexerCOPY = 9 + EarthLexerSAVE_ARTIFACT = 10 + EarthLexerSAVE_IMAGE = 11 + EarthLexerRUN = 12 + EarthLexerEXPOSE = 13 + EarthLexerVOLUME = 14 + EarthLexerENV = 15 + EarthLexerARG = 16 + EarthLexerSET = 17 + EarthLexerLET = 18 + EarthLexerLABEL = 19 + EarthLexerBUILD = 20 + EarthLexerWORKDIR = 21 + EarthLexerUSER = 22 + EarthLexerCMD = 23 + EarthLexerENTRYPOINT = 24 + EarthLexerGIT_CLONE = 25 + EarthLexerADD = 26 + EarthLexerSTOPSIGNAL = 27 + EarthLexerONBUILD = 28 + EarthLexerHEALTHCHECK = 29 + EarthLexerSHELL = 30 + EarthLexerDO = 31 + EarthLexerCOMMAND = 32 + EarthLexerFUNCTION = 33 + EarthLexerIMPORT = 34 + EarthLexerVERSION = 35 + EarthLexerCACHE = 36 + EarthLexerHOST = 37 + EarthLexerPROJECT = 38 + EarthLexerPIPELINE = 39 + EarthLexerTRIGGER = 40 + EarthLexerWITH = 41 + EarthLexerDOCKER = 42 + EarthLexerIF = 43 + EarthLexerTRY = 44 + EarthLexerFOR = 45 + EarthLexerWAIT = 46 + EarthLexerNL = 47 + EarthLexerWS = 48 + EarthLexerCOMMENT = 49 + EarthLexerELSE = 50 + EarthLexerELSE_IF = 51 + EarthLexerCATCH = 52 + EarthLexerFINALLY = 53 + EarthLexerEND = 54 + EarthLexerAtom = 55 + EarthLexerEQUALS = 56 ) // EarthLexer escapedChannels. diff --git a/ast/parser/earth_parser.go b/ast/parser/earth_parser.go index b15c87de..c5903c76 100644 --- a/ast/parser/earth_parser.go +++ b/ast/parser/earth_parser.go @@ -34,46 +34,46 @@ var earthparserParserStaticData struct { func earthparserParserInit() { staticData := &earthparserParserStaticData staticData.literalNames = []string{ - "", "", "", "", "", "'FROM'", "'FROM DOCKERFILE'", "'LOCALLY'", "'COPY'", - "'SAVE ARTIFACT'", "'SAVE IMAGE'", "'RUN'", "'EXPOSE'", "'VOLUME'", + "", "", "", "", "", "", "'FROM'", "'FROM DOCKERFILE'", "'LOCALLY'", + "'COPY'", "'SAVE ARTIFACT'", "'SAVE IMAGE'", "'RUN'", "'EXPOSE'", "'VOLUME'", "'ENV'", "'ARG'", "'SET'", "'LET'", "'LABEL'", "'BUILD'", "'WORKDIR'", "'USER'", "'CMD'", "'ENTRYPOINT'", "'GIT CLONE'", "'ADD'", "'STOPSIGNAL'", - "'ONBUILD'", "'HEALTHCHECK'", "'SHELL'", "'DO'", "'COMMAND'", "'IMPORT'", - "'VERSION'", "'CACHE'", "'HOST'", "'PROJECT'", "'PIPELINE'", "'TRIGGER'", - "'WITH'", "", "", "", "", "", "", "", "", "'ELSE'", "'ELSE IF'", "'CATCH'", - "'FINALLY'", "'END'", + "'ONBUILD'", "'HEALTHCHECK'", "'SHELL'", "'DO'", "'COMMAND'", "'FUNCTION'", + "'IMPORT'", "'VERSION'", "'CACHE'", "'HOST'", "'PROJECT'", "'PIPELINE'", + "'TRIGGER'", "'WITH'", "", "", "", "", "", "", "", "", "'ELSE'", "'ELSE IF'", + "'CATCH'", "'FINALLY'", "'END'", } staticData.symbolicNames = []string{ - "", "INDENT", "DEDENT", "Target", "UserCommand", "FROM", "FROM_DOCKERFILE", - "LOCALLY", "COPY", "SAVE_ARTIFACT", "SAVE_IMAGE", "RUN", "EXPOSE", "VOLUME", - "ENV", "ARG", "SET", "LET", "LABEL", "BUILD", "WORKDIR", "USER", "CMD", - "ENTRYPOINT", "GIT_CLONE", "ADD", "STOPSIGNAL", "ONBUILD", "HEALTHCHECK", - "SHELL", "DO", "COMMAND", "IMPORT", "VERSION", "CACHE", "HOST", "PROJECT", - "PIPELINE", "TRIGGER", "WITH", "DOCKER", "IF", "TRY", "FOR", "WAIT", - "NL", "WS", "COMMENT", "ELSE", "ELSE_IF", "CATCH", "FINALLY", "END", - "Atom", "EQUALS", + "", "INDENT", "DEDENT", "Target", "UserCommand", "Function", "FROM", + "FROM_DOCKERFILE", "LOCALLY", "COPY", "SAVE_ARTIFACT", "SAVE_IMAGE", + "RUN", "EXPOSE", "VOLUME", "ENV", "ARG", "SET", "LET", "LABEL", "BUILD", + "WORKDIR", "USER", "CMD", "ENTRYPOINT", "GIT_CLONE", "ADD", "STOPSIGNAL", + "ONBUILD", "HEALTHCHECK", "SHELL", "DO", "COMMAND", "FUNCTION", "IMPORT", + "VERSION", "CACHE", "HOST", "PROJECT", "PIPELINE", "TRIGGER", "WITH", + "DOCKER", "IF", "TRY", "FOR", "WAIT", "NL", "WS", "COMMENT", "ELSE", + "ELSE_IF", "CATCH", "FINALLY", "END", "Atom", "EQUALS", } staticData.ruleNames = []string{ "earthFile", "targets", "targetOrUserCommand", "target", "targetHeader", - "userCommand", "userCommandHeader", "stmts", "stmt", "commandStmt", - "version", "withStmt", "withBlock", "withExpr", "withCommand", "dockerCommand", - "ifStmt", "ifClause", "ifBlock", "elseIfClause", "elseIfBlock", "elseClause", - "elseBlock", "ifExpr", "elseIfExpr", "tryStmt", "tryClause", "tryBlock", - "catchClause", "catchBlock", "finallyClause", "finallyBlock", "forStmt", - "forClause", "forBlock", "forExpr", "waitStmt", "waitClause", "waitBlock", - "waitExpr", "fromStmt", "fromDockerfileStmt", "locallyStmt", "copyStmt", - "saveStmt", "saveImage", "saveArtifact", "runStmt", "buildStmt", "workdirStmt", - "userStmt", "cmdStmt", "entrypointStmt", "exposeStmt", "volumeStmt", - "envStmt", "argStmt", "setStmt", "letStmt", "optionalFlag", "envArgKey", - "envArgValue", "labelStmt", "labelKey", "labelValue", "gitCloneStmt", - "addStmt", "stopsignalStmt", "onbuildStmt", "healthcheckStmt", "shellStmt", - "userCommandStmt", "doStmt", "importStmt", "cacheStmt", "hostStmt", - "projectStmt", "pipelineStmt", "triggerStmt", "expr", "stmtWordsMaybeJSON", - "stmtWords", "stmtWord", + "userCommand", "userCommandHeader", "function", "functionHeader", "stmts", + "stmt", "commandStmt", "version", "withStmt", "withBlock", "withExpr", + "withCommand", "dockerCommand", "ifStmt", "ifClause", "ifBlock", "elseIfClause", + "elseIfBlock", "elseClause", "elseBlock", "ifExpr", "elseIfExpr", "tryStmt", + "tryClause", "tryBlock", "catchClause", "catchBlock", "finallyClause", + "finallyBlock", "forStmt", "forClause", "forBlock", "forExpr", "waitStmt", + "waitClause", "waitBlock", "waitExpr", "fromStmt", "fromDockerfileStmt", + "locallyStmt", "copyStmt", "saveStmt", "saveImage", "saveArtifact", + "runStmt", "buildStmt", "workdirStmt", "userStmt", "cmdStmt", "entrypointStmt", + "exposeStmt", "volumeStmt", "envStmt", "argStmt", "setStmt", "letStmt", + "optionalFlag", "envArgKey", "envArgValue", "labelStmt", "labelKey", + "labelValue", "gitCloneStmt", "addStmt", "stopsignalStmt", "onbuildStmt", + "healthcheckStmt", "shellStmt", "userCommandStmt", "functionStmt", "doStmt", + "importStmt", "cacheStmt", "hostStmt", "projectStmt", "pipelineStmt", + "triggerStmt", "expr", "stmtWordsMaybeJSON", "stmtWords", "stmtWord", } staticData.predictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 1, 54, 719, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, + 4, 1, 56, 755, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, @@ -88,317 +88,334 @@ func earthparserParserInit() { 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, - 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 1, 0, 5, 0, 168, - 8, 0, 10, 0, 12, 0, 171, 9, 0, 1, 0, 3, 0, 174, 8, 0, 1, 0, 1, 0, 1, 0, - 3, 0, 179, 8, 0, 1, 0, 5, 0, 182, 8, 0, 10, 0, 12, 0, 185, 9, 0, 1, 0, - 3, 0, 188, 8, 0, 1, 0, 5, 0, 191, 8, 0, 10, 0, 12, 0, 194, 9, 0, 1, 0, - 1, 0, 1, 1, 1, 1, 5, 1, 200, 8, 1, 10, 1, 12, 1, 203, 9, 1, 1, 1, 5, 1, - 206, 8, 1, 10, 1, 12, 1, 209, 9, 1, 1, 2, 1, 2, 3, 2, 213, 8, 2, 1, 3, - 1, 3, 4, 3, 217, 8, 3, 11, 3, 12, 3, 218, 1, 3, 1, 3, 5, 3, 223, 8, 3, - 10, 3, 12, 3, 226, 9, 3, 1, 3, 3, 3, 229, 8, 3, 1, 3, 4, 3, 232, 8, 3, - 11, 3, 12, 3, 233, 1, 3, 3, 3, 237, 8, 3, 1, 4, 1, 4, 1, 5, 1, 5, 4, 5, - 243, 8, 5, 11, 5, 12, 5, 244, 1, 5, 1, 5, 5, 5, 249, 8, 5, 10, 5, 12, 5, - 252, 9, 5, 1, 5, 1, 5, 4, 5, 256, 8, 5, 11, 5, 12, 5, 257, 1, 5, 1, 5, - 3, 5, 262, 8, 5, 1, 6, 1, 6, 1, 7, 1, 7, 4, 7, 268, 8, 7, 11, 7, 12, 7, - 269, 1, 7, 5, 7, 273, 8, 7, 10, 7, 12, 7, 276, 9, 7, 1, 8, 1, 8, 1, 8, - 1, 8, 1, 8, 1, 8, 3, 8, 284, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, - 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, - 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, - 1, 9, 1, 9, 3, 9, 318, 8, 9, 1, 10, 1, 10, 1, 10, 4, 10, 323, 8, 10, 11, - 10, 12, 10, 324, 1, 11, 1, 11, 4, 11, 329, 8, 11, 11, 11, 12, 11, 330, - 1, 11, 3, 11, 334, 8, 11, 1, 11, 4, 11, 337, 8, 11, 11, 11, 12, 11, 338, - 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, - 15, 3, 15, 352, 8, 15, 1, 16, 1, 16, 4, 16, 356, 8, 16, 11, 16, 12, 16, - 357, 1, 16, 5, 16, 361, 8, 16, 10, 16, 12, 16, 364, 9, 16, 1, 16, 4, 16, - 367, 8, 16, 11, 16, 12, 16, 368, 1, 16, 3, 16, 372, 8, 16, 1, 16, 4, 16, - 375, 8, 16, 11, 16, 12, 16, 376, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 4, - 17, 384, 8, 17, 11, 17, 12, 17, 385, 1, 17, 3, 17, 389, 8, 17, 1, 18, 1, - 18, 1, 19, 1, 19, 1, 19, 4, 19, 396, 8, 19, 11, 19, 12, 19, 397, 1, 19, - 3, 19, 401, 8, 19, 1, 20, 1, 20, 1, 21, 1, 21, 4, 21, 407, 8, 21, 11, 21, - 12, 21, 408, 1, 21, 3, 21, 412, 8, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, - 1, 24, 1, 25, 1, 25, 4, 25, 422, 8, 25, 11, 25, 12, 25, 423, 1, 25, 3, - 25, 427, 8, 25, 1, 25, 4, 25, 430, 8, 25, 11, 25, 12, 25, 431, 1, 25, 3, - 25, 435, 8, 25, 1, 25, 4, 25, 438, 8, 25, 11, 25, 12, 25, 439, 1, 25, 1, - 25, 1, 26, 1, 26, 4, 26, 446, 8, 26, 11, 26, 12, 26, 447, 1, 26, 3, 26, - 451, 8, 26, 1, 27, 1, 27, 1, 28, 1, 28, 4, 28, 457, 8, 28, 11, 28, 12, - 28, 458, 1, 28, 3, 28, 462, 8, 28, 1, 29, 1, 29, 1, 30, 1, 30, 4, 30, 468, - 8, 30, 11, 30, 12, 30, 469, 1, 30, 3, 30, 473, 8, 30, 1, 31, 1, 31, 1, - 32, 1, 32, 4, 32, 479, 8, 32, 11, 32, 12, 32, 480, 1, 32, 1, 32, 1, 33, - 1, 33, 1, 33, 4, 33, 488, 8, 33, 11, 33, 12, 33, 489, 1, 33, 3, 33, 493, - 8, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 4, 36, 501, 8, 36, 11, - 36, 12, 36, 502, 1, 36, 1, 36, 1, 37, 1, 37, 3, 37, 509, 8, 37, 1, 37, - 4, 37, 512, 8, 37, 11, 37, 12, 37, 513, 1, 37, 3, 37, 517, 8, 37, 1, 38, - 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 3, 40, 525, 8, 40, 1, 41, 1, 41, 3, - 41, 529, 8, 41, 1, 42, 1, 42, 3, 42, 533, 8, 42, 1, 43, 1, 43, 3, 43, 537, - 8, 43, 1, 44, 1, 44, 3, 44, 541, 8, 44, 1, 45, 1, 45, 3, 45, 545, 8, 45, - 1, 46, 1, 46, 3, 46, 549, 8, 46, 1, 47, 1, 47, 3, 47, 553, 8, 47, 1, 48, - 1, 48, 3, 48, 557, 8, 48, 1, 49, 1, 49, 3, 49, 561, 8, 49, 1, 50, 1, 50, - 3, 50, 565, 8, 50, 1, 51, 1, 51, 3, 51, 569, 8, 51, 1, 52, 1, 52, 3, 52, - 573, 8, 52, 1, 53, 1, 53, 3, 53, 577, 8, 53, 1, 54, 1, 54, 3, 54, 581, - 8, 54, 1, 55, 1, 55, 1, 55, 3, 55, 586, 8, 55, 1, 55, 3, 55, 589, 8, 55, - 1, 55, 3, 55, 592, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 599, - 8, 56, 1, 56, 3, 56, 602, 8, 56, 3, 56, 604, 8, 56, 1, 57, 1, 57, 1, 57, - 1, 57, 3, 57, 610, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, - 58, 3, 58, 619, 8, 58, 1, 58, 1, 58, 1, 59, 3, 59, 624, 8, 59, 1, 60, 1, - 60, 1, 61, 1, 61, 3, 61, 630, 8, 61, 1, 61, 5, 61, 633, 8, 61, 10, 61, - 12, 61, 636, 9, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 643, 8, 62, - 10, 62, 12, 62, 646, 9, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 3, - 65, 654, 8, 65, 1, 66, 1, 66, 3, 66, 658, 8, 66, 1, 67, 1, 67, 3, 67, 662, - 8, 67, 1, 68, 1, 68, 3, 68, 666, 8, 68, 1, 69, 1, 69, 3, 69, 670, 8, 69, - 1, 70, 1, 70, 3, 70, 674, 8, 70, 1, 71, 1, 71, 3, 71, 678, 8, 71, 1, 72, - 1, 72, 3, 72, 682, 8, 72, 1, 73, 1, 73, 3, 73, 686, 8, 73, 1, 74, 1, 74, - 3, 74, 690, 8, 74, 1, 75, 1, 75, 3, 75, 694, 8, 75, 1, 76, 1, 76, 3, 76, - 698, 8, 76, 1, 77, 1, 77, 3, 77, 702, 8, 77, 1, 78, 1, 78, 3, 78, 706, - 8, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 4, 81, 713, 8, 81, 11, 81, 12, - 81, 714, 1, 82, 1, 82, 1, 82, 0, 0, 83, 0, 2, 4, 6, 8, 10, 12, 14, 16, - 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, - 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, - 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, - 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, - 152, 154, 156, 158, 160, 162, 164, 0, 0, 767, 0, 169, 1, 0, 0, 0, 2, 197, - 1, 0, 0, 0, 4, 212, 1, 0, 0, 0, 6, 214, 1, 0, 0, 0, 8, 238, 1, 0, 0, 0, - 10, 240, 1, 0, 0, 0, 12, 263, 1, 0, 0, 0, 14, 265, 1, 0, 0, 0, 16, 283, - 1, 0, 0, 0, 18, 317, 1, 0, 0, 0, 20, 319, 1, 0, 0, 0, 22, 326, 1, 0, 0, - 0, 24, 342, 1, 0, 0, 0, 26, 344, 1, 0, 0, 0, 28, 347, 1, 0, 0, 0, 30, 349, - 1, 0, 0, 0, 32, 353, 1, 0, 0, 0, 34, 380, 1, 0, 0, 0, 36, 390, 1, 0, 0, - 0, 38, 392, 1, 0, 0, 0, 40, 402, 1, 0, 0, 0, 42, 404, 1, 0, 0, 0, 44, 413, - 1, 0, 0, 0, 46, 415, 1, 0, 0, 0, 48, 417, 1, 0, 0, 0, 50, 419, 1, 0, 0, - 0, 52, 443, 1, 0, 0, 0, 54, 452, 1, 0, 0, 0, 56, 454, 1, 0, 0, 0, 58, 463, - 1, 0, 0, 0, 60, 465, 1, 0, 0, 0, 62, 474, 1, 0, 0, 0, 64, 476, 1, 0, 0, - 0, 66, 484, 1, 0, 0, 0, 68, 494, 1, 0, 0, 0, 70, 496, 1, 0, 0, 0, 72, 498, - 1, 0, 0, 0, 74, 506, 1, 0, 0, 0, 76, 518, 1, 0, 0, 0, 78, 520, 1, 0, 0, - 0, 80, 522, 1, 0, 0, 0, 82, 526, 1, 0, 0, 0, 84, 530, 1, 0, 0, 0, 86, 534, - 1, 0, 0, 0, 88, 540, 1, 0, 0, 0, 90, 542, 1, 0, 0, 0, 92, 546, 1, 0, 0, - 0, 94, 550, 1, 0, 0, 0, 96, 554, 1, 0, 0, 0, 98, 558, 1, 0, 0, 0, 100, - 562, 1, 0, 0, 0, 102, 566, 1, 0, 0, 0, 104, 570, 1, 0, 0, 0, 106, 574, - 1, 0, 0, 0, 108, 578, 1, 0, 0, 0, 110, 582, 1, 0, 0, 0, 112, 593, 1, 0, - 0, 0, 114, 605, 1, 0, 0, 0, 116, 613, 1, 0, 0, 0, 118, 623, 1, 0, 0, 0, - 120, 625, 1, 0, 0, 0, 122, 627, 1, 0, 0, 0, 124, 637, 1, 0, 0, 0, 126, - 647, 1, 0, 0, 0, 128, 649, 1, 0, 0, 0, 130, 651, 1, 0, 0, 0, 132, 655, - 1, 0, 0, 0, 134, 659, 1, 0, 0, 0, 136, 663, 1, 0, 0, 0, 138, 667, 1, 0, - 0, 0, 140, 671, 1, 0, 0, 0, 142, 675, 1, 0, 0, 0, 144, 679, 1, 0, 0, 0, - 146, 683, 1, 0, 0, 0, 148, 687, 1, 0, 0, 0, 150, 691, 1, 0, 0, 0, 152, - 695, 1, 0, 0, 0, 154, 699, 1, 0, 0, 0, 156, 703, 1, 0, 0, 0, 158, 707, - 1, 0, 0, 0, 160, 709, 1, 0, 0, 0, 162, 712, 1, 0, 0, 0, 164, 716, 1, 0, - 0, 0, 166, 168, 5, 45, 0, 0, 167, 166, 1, 0, 0, 0, 168, 171, 1, 0, 0, 0, - 169, 167, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 173, 1, 0, 0, 0, 171, - 169, 1, 0, 0, 0, 172, 174, 3, 20, 10, 0, 173, 172, 1, 0, 0, 0, 173, 174, - 1, 0, 0, 0, 174, 178, 1, 0, 0, 0, 175, 176, 3, 14, 7, 0, 176, 177, 5, 45, - 0, 0, 177, 179, 1, 0, 0, 0, 178, 175, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, - 179, 183, 1, 0, 0, 0, 180, 182, 5, 45, 0, 0, 181, 180, 1, 0, 0, 0, 182, - 185, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 187, - 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 186, 188, 3, 2, 1, 0, 187, 186, 1, 0, - 0, 0, 187, 188, 1, 0, 0, 0, 188, 192, 1, 0, 0, 0, 189, 191, 5, 45, 0, 0, - 190, 189, 1, 0, 0, 0, 191, 194, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, - 193, 1, 0, 0, 0, 193, 195, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 195, 196, - 5, 0, 0, 1, 196, 1, 1, 0, 0, 0, 197, 207, 3, 4, 2, 0, 198, 200, 5, 45, - 0, 0, 199, 198, 1, 0, 0, 0, 200, 203, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, - 201, 202, 1, 0, 0, 0, 202, 204, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 204, - 206, 3, 4, 2, 0, 205, 201, 1, 0, 0, 0, 206, 209, 1, 0, 0, 0, 207, 205, - 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 3, 1, 0, 0, 0, 209, 207, 1, 0, 0, - 0, 210, 213, 3, 6, 3, 0, 211, 213, 3, 10, 5, 0, 212, 210, 1, 0, 0, 0, 212, - 211, 1, 0, 0, 0, 213, 5, 1, 0, 0, 0, 214, 216, 3, 8, 4, 0, 215, 217, 5, - 45, 0, 0, 216, 215, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 216, 1, 0, 0, - 0, 218, 219, 1, 0, 0, 0, 219, 236, 1, 0, 0, 0, 220, 224, 5, 1, 0, 0, 221, - 223, 5, 45, 0, 0, 222, 221, 1, 0, 0, 0, 223, 226, 1, 0, 0, 0, 224, 222, - 1, 0, 0, 0, 224, 225, 1, 0, 0, 0, 225, 228, 1, 0, 0, 0, 226, 224, 1, 0, - 0, 0, 227, 229, 3, 14, 7, 0, 228, 227, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, - 229, 231, 1, 0, 0, 0, 230, 232, 5, 45, 0, 0, 231, 230, 1, 0, 0, 0, 232, - 233, 1, 0, 0, 0, 233, 231, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, - 1, 0, 0, 0, 235, 237, 5, 2, 0, 0, 236, 220, 1, 0, 0, 0, 236, 237, 1, 0, - 0, 0, 237, 7, 1, 0, 0, 0, 238, 239, 5, 3, 0, 0, 239, 9, 1, 0, 0, 0, 240, - 242, 3, 12, 6, 0, 241, 243, 5, 45, 0, 0, 242, 241, 1, 0, 0, 0, 243, 244, - 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 261, 1, 0, - 0, 0, 246, 250, 5, 1, 0, 0, 247, 249, 5, 45, 0, 0, 248, 247, 1, 0, 0, 0, - 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, - 253, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 253, 255, 3, 14, 7, 0, 254, 256, - 5, 45, 0, 0, 255, 254, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 255, 1, 0, - 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 260, 5, 2, 0, 0, - 260, 262, 1, 0, 0, 0, 261, 246, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, - 11, 1, 0, 0, 0, 263, 264, 5, 4, 0, 0, 264, 13, 1, 0, 0, 0, 265, 274, 3, - 16, 8, 0, 266, 268, 5, 45, 0, 0, 267, 266, 1, 0, 0, 0, 268, 269, 1, 0, - 0, 0, 269, 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, - 271, 273, 3, 16, 8, 0, 272, 267, 1, 0, 0, 0, 273, 276, 1, 0, 0, 0, 274, - 272, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 15, 1, 0, 0, 0, 276, 274, 1, - 0, 0, 0, 277, 284, 3, 18, 9, 0, 278, 284, 3, 22, 11, 0, 279, 284, 3, 32, - 16, 0, 280, 284, 3, 64, 32, 0, 281, 284, 3, 72, 36, 0, 282, 284, 3, 50, - 25, 0, 283, 277, 1, 0, 0, 0, 283, 278, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, - 283, 280, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 283, 282, 1, 0, 0, 0, 284, - 17, 1, 0, 0, 0, 285, 318, 3, 80, 40, 0, 286, 318, 3, 82, 41, 0, 287, 318, - 3, 84, 42, 0, 288, 318, 3, 86, 43, 0, 289, 318, 3, 88, 44, 0, 290, 318, - 3, 94, 47, 0, 291, 318, 3, 96, 48, 0, 292, 318, 3, 98, 49, 0, 293, 318, - 3, 100, 50, 0, 294, 318, 3, 102, 51, 0, 295, 318, 3, 104, 52, 0, 296, 318, - 3, 106, 53, 0, 297, 318, 3, 108, 54, 0, 298, 318, 3, 110, 55, 0, 299, 318, - 3, 112, 56, 0, 300, 318, 3, 114, 57, 0, 301, 318, 3, 116, 58, 0, 302, 318, - 3, 124, 62, 0, 303, 318, 3, 130, 65, 0, 304, 318, 3, 132, 66, 0, 305, 318, - 3, 134, 67, 0, 306, 318, 3, 136, 68, 0, 307, 318, 3, 138, 69, 0, 308, 318, - 3, 140, 70, 0, 309, 318, 3, 142, 71, 0, 310, 318, 3, 144, 72, 0, 311, 318, - 3, 146, 73, 0, 312, 318, 3, 148, 74, 0, 313, 318, 3, 150, 75, 0, 314, 318, - 3, 152, 76, 0, 315, 318, 3, 154, 77, 0, 316, 318, 3, 156, 78, 0, 317, 285, - 1, 0, 0, 0, 317, 286, 1, 0, 0, 0, 317, 287, 1, 0, 0, 0, 317, 288, 1, 0, - 0, 0, 317, 289, 1, 0, 0, 0, 317, 290, 1, 0, 0, 0, 317, 291, 1, 0, 0, 0, - 317, 292, 1, 0, 0, 0, 317, 293, 1, 0, 0, 0, 317, 294, 1, 0, 0, 0, 317, - 295, 1, 0, 0, 0, 317, 296, 1, 0, 0, 0, 317, 297, 1, 0, 0, 0, 317, 298, - 1, 0, 0, 0, 317, 299, 1, 0, 0, 0, 317, 300, 1, 0, 0, 0, 317, 301, 1, 0, - 0, 0, 317, 302, 1, 0, 0, 0, 317, 303, 1, 0, 0, 0, 317, 304, 1, 0, 0, 0, - 317, 305, 1, 0, 0, 0, 317, 306, 1, 0, 0, 0, 317, 307, 1, 0, 0, 0, 317, - 308, 1, 0, 0, 0, 317, 309, 1, 0, 0, 0, 317, 310, 1, 0, 0, 0, 317, 311, - 1, 0, 0, 0, 317, 312, 1, 0, 0, 0, 317, 313, 1, 0, 0, 0, 317, 314, 1, 0, - 0, 0, 317, 315, 1, 0, 0, 0, 317, 316, 1, 0, 0, 0, 318, 19, 1, 0, 0, 0, - 319, 320, 5, 33, 0, 0, 320, 322, 3, 162, 81, 0, 321, 323, 5, 45, 0, 0, - 322, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, - 325, 1, 0, 0, 0, 325, 21, 1, 0, 0, 0, 326, 333, 3, 26, 13, 0, 327, 329, - 5, 45, 0, 0, 328, 327, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 328, 1, 0, - 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 334, 3, 24, 12, - 0, 333, 328, 1, 0, 0, 0, 333, 334, 1, 0, 0, 0, 334, 336, 1, 0, 0, 0, 335, - 337, 5, 45, 0, 0, 336, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 336, - 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 341, 5, 52, - 0, 0, 341, 23, 1, 0, 0, 0, 342, 343, 3, 14, 7, 0, 343, 25, 1, 0, 0, 0, - 344, 345, 5, 39, 0, 0, 345, 346, 3, 28, 14, 0, 346, 27, 1, 0, 0, 0, 347, - 348, 3, 30, 15, 0, 348, 29, 1, 0, 0, 0, 349, 351, 5, 40, 0, 0, 350, 352, - 3, 162, 81, 0, 351, 350, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 31, 1, - 0, 0, 0, 353, 362, 3, 34, 17, 0, 354, 356, 5, 45, 0, 0, 355, 354, 1, 0, - 0, 0, 356, 357, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, - 358, 359, 1, 0, 0, 0, 359, 361, 3, 38, 19, 0, 360, 355, 1, 0, 0, 0, 361, - 364, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 371, - 1, 0, 0, 0, 364, 362, 1, 0, 0, 0, 365, 367, 5, 45, 0, 0, 366, 365, 1, 0, - 0, 0, 367, 368, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, - 369, 370, 1, 0, 0, 0, 370, 372, 3, 42, 21, 0, 371, 366, 1, 0, 0, 0, 371, - 372, 1, 0, 0, 0, 372, 374, 1, 0, 0, 0, 373, 375, 5, 45, 0, 0, 374, 373, - 1, 0, 0, 0, 375, 376, 1, 0, 0, 0, 376, 374, 1, 0, 0, 0, 376, 377, 1, 0, - 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 5, 52, 0, 0, 379, 33, 1, 0, 0, 0, - 380, 381, 5, 41, 0, 0, 381, 388, 3, 46, 23, 0, 382, 384, 5, 45, 0, 0, 383, - 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 385, 386, - 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 389, 3, 36, 18, 0, 388, 383, 1, - 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 35, 1, 0, 0, 0, 390, 391, 3, 14, 7, - 0, 391, 37, 1, 0, 0, 0, 392, 393, 5, 49, 0, 0, 393, 400, 3, 48, 24, 0, - 394, 396, 5, 45, 0, 0, 395, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, - 395, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 401, - 3, 40, 20, 0, 400, 395, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 39, 1, 0, - 0, 0, 402, 403, 3, 14, 7, 0, 403, 41, 1, 0, 0, 0, 404, 411, 5, 48, 0, 0, - 405, 407, 5, 45, 0, 0, 406, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, - 406, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 412, - 3, 44, 22, 0, 411, 406, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 43, 1, 0, - 0, 0, 413, 414, 3, 14, 7, 0, 414, 45, 1, 0, 0, 0, 415, 416, 3, 158, 79, - 0, 416, 47, 1, 0, 0, 0, 417, 418, 3, 158, 79, 0, 418, 49, 1, 0, 0, 0, 419, - 426, 3, 52, 26, 0, 420, 422, 5, 45, 0, 0, 421, 420, 1, 0, 0, 0, 422, 423, - 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 1, 0, - 0, 0, 425, 427, 3, 56, 28, 0, 426, 421, 1, 0, 0, 0, 426, 427, 1, 0, 0, - 0, 427, 434, 1, 0, 0, 0, 428, 430, 5, 45, 0, 0, 429, 428, 1, 0, 0, 0, 430, - 431, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, - 1, 0, 0, 0, 433, 435, 3, 60, 30, 0, 434, 429, 1, 0, 0, 0, 434, 435, 1, - 0, 0, 0, 435, 437, 1, 0, 0, 0, 436, 438, 5, 45, 0, 0, 437, 436, 1, 0, 0, - 0, 438, 439, 1, 0, 0, 0, 439, 437, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, - 441, 1, 0, 0, 0, 441, 442, 5, 52, 0, 0, 442, 51, 1, 0, 0, 0, 443, 450, - 5, 42, 0, 0, 444, 446, 5, 45, 0, 0, 445, 444, 1, 0, 0, 0, 446, 447, 1, - 0, 0, 0, 447, 445, 1, 0, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 1, 0, 0, - 0, 449, 451, 3, 54, 27, 0, 450, 445, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, - 451, 53, 1, 0, 0, 0, 452, 453, 3, 14, 7, 0, 453, 55, 1, 0, 0, 0, 454, 461, - 5, 50, 0, 0, 455, 457, 5, 45, 0, 0, 456, 455, 1, 0, 0, 0, 457, 458, 1, - 0, 0, 0, 458, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 1, 0, 0, - 0, 460, 462, 3, 58, 29, 0, 461, 456, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, - 462, 57, 1, 0, 0, 0, 463, 464, 3, 14, 7, 0, 464, 59, 1, 0, 0, 0, 465, 472, - 5, 51, 0, 0, 466, 468, 5, 45, 0, 0, 467, 466, 1, 0, 0, 0, 468, 469, 1, - 0, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 1, 0, 0, - 0, 471, 473, 3, 62, 31, 0, 472, 467, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, - 473, 61, 1, 0, 0, 0, 474, 475, 3, 14, 7, 0, 475, 63, 1, 0, 0, 0, 476, 478, - 3, 66, 33, 0, 477, 479, 5, 45, 0, 0, 478, 477, 1, 0, 0, 0, 479, 480, 1, - 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 1, 0, 0, - 0, 482, 483, 5, 52, 0, 0, 483, 65, 1, 0, 0, 0, 484, 485, 5, 43, 0, 0, 485, - 492, 3, 70, 35, 0, 486, 488, 5, 45, 0, 0, 487, 486, 1, 0, 0, 0, 488, 489, - 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 1, 0, - 0, 0, 491, 493, 3, 68, 34, 0, 492, 487, 1, 0, 0, 0, 492, 493, 1, 0, 0, - 0, 493, 67, 1, 0, 0, 0, 494, 495, 3, 14, 7, 0, 495, 69, 1, 0, 0, 0, 496, - 497, 3, 162, 81, 0, 497, 71, 1, 0, 0, 0, 498, 500, 3, 74, 37, 0, 499, 501, - 5, 45, 0, 0, 500, 499, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 500, 1, 0, - 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 5, 52, 0, 0, - 505, 73, 1, 0, 0, 0, 506, 508, 5, 44, 0, 0, 507, 509, 3, 78, 39, 0, 508, - 507, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 516, 1, 0, 0, 0, 510, 512, - 5, 45, 0, 0, 511, 510, 1, 0, 0, 0, 512, 513, 1, 0, 0, 0, 513, 511, 1, 0, - 0, 0, 513, 514, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 517, 3, 76, 38, - 0, 516, 511, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 75, 1, 0, 0, 0, 518, - 519, 3, 14, 7, 0, 519, 77, 1, 0, 0, 0, 520, 521, 3, 162, 81, 0, 521, 79, - 1, 0, 0, 0, 522, 524, 5, 5, 0, 0, 523, 525, 3, 162, 81, 0, 524, 523, 1, - 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 81, 1, 0, 0, 0, 526, 528, 5, 6, 0, - 0, 527, 529, 3, 162, 81, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, - 529, 83, 1, 0, 0, 0, 530, 532, 5, 7, 0, 0, 531, 533, 3, 162, 81, 0, 532, - 531, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 85, 1, 0, 0, 0, 534, 536, 5, - 8, 0, 0, 535, 537, 3, 162, 81, 0, 536, 535, 1, 0, 0, 0, 536, 537, 1, 0, - 0, 0, 537, 87, 1, 0, 0, 0, 538, 541, 3, 92, 46, 0, 539, 541, 3, 90, 45, - 0, 540, 538, 1, 0, 0, 0, 540, 539, 1, 0, 0, 0, 541, 89, 1, 0, 0, 0, 542, - 544, 5, 10, 0, 0, 543, 545, 3, 162, 81, 0, 544, 543, 1, 0, 0, 0, 544, 545, - 1, 0, 0, 0, 545, 91, 1, 0, 0, 0, 546, 548, 5, 9, 0, 0, 547, 549, 3, 162, - 81, 0, 548, 547, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 93, 1, 0, 0, 0, - 550, 552, 5, 11, 0, 0, 551, 553, 3, 160, 80, 0, 552, 551, 1, 0, 0, 0, 552, - 553, 1, 0, 0, 0, 553, 95, 1, 0, 0, 0, 554, 556, 5, 19, 0, 0, 555, 557, - 3, 162, 81, 0, 556, 555, 1, 0, 0, 0, 556, 557, 1, 0, 0, 0, 557, 97, 1, - 0, 0, 0, 558, 560, 5, 20, 0, 0, 559, 561, 3, 162, 81, 0, 560, 559, 1, 0, - 0, 0, 560, 561, 1, 0, 0, 0, 561, 99, 1, 0, 0, 0, 562, 564, 5, 21, 0, 0, - 563, 565, 3, 162, 81, 0, 564, 563, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, - 101, 1, 0, 0, 0, 566, 568, 5, 22, 0, 0, 567, 569, 3, 160, 80, 0, 568, 567, - 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 103, 1, 0, 0, 0, 570, 572, 5, 23, - 0, 0, 571, 573, 3, 160, 80, 0, 572, 571, 1, 0, 0, 0, 572, 573, 1, 0, 0, - 0, 573, 105, 1, 0, 0, 0, 574, 576, 5, 12, 0, 0, 575, 577, 3, 162, 81, 0, - 576, 575, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 107, 1, 0, 0, 0, 578, - 580, 5, 13, 0, 0, 579, 581, 3, 160, 80, 0, 580, 579, 1, 0, 0, 0, 580, 581, - 1, 0, 0, 0, 581, 109, 1, 0, 0, 0, 582, 583, 5, 14, 0, 0, 583, 585, 3, 120, - 60, 0, 584, 586, 5, 54, 0, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, - 0, 586, 591, 1, 0, 0, 0, 587, 589, 5, 46, 0, 0, 588, 587, 1, 0, 0, 0, 588, - 589, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 3, 122, 61, 0, 591, 588, - 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 111, 1, 0, 0, 0, 593, 594, 5, 15, - 0, 0, 594, 595, 3, 118, 59, 0, 595, 603, 3, 120, 60, 0, 596, 601, 5, 54, - 0, 0, 597, 599, 5, 46, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, - 599, 600, 1, 0, 0, 0, 600, 602, 3, 122, 61, 0, 601, 598, 1, 0, 0, 0, 601, - 602, 1, 0, 0, 0, 602, 604, 1, 0, 0, 0, 603, 596, 1, 0, 0, 0, 603, 604, - 1, 0, 0, 0, 604, 113, 1, 0, 0, 0, 605, 606, 5, 16, 0, 0, 606, 607, 3, 120, - 60, 0, 607, 609, 5, 54, 0, 0, 608, 610, 5, 46, 0, 0, 609, 608, 1, 0, 0, - 0, 609, 610, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 612, 3, 122, 61, 0, - 612, 115, 1, 0, 0, 0, 613, 614, 5, 17, 0, 0, 614, 615, 3, 118, 59, 0, 615, - 616, 3, 120, 60, 0, 616, 618, 5, 54, 0, 0, 617, 619, 5, 46, 0, 0, 618, - 617, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, - 3, 122, 61, 0, 621, 117, 1, 0, 0, 0, 622, 624, 3, 162, 81, 0, 623, 622, - 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 119, 1, 0, 0, 0, 625, 626, 5, 53, - 0, 0, 626, 121, 1, 0, 0, 0, 627, 634, 5, 53, 0, 0, 628, 630, 5, 46, 0, - 0, 629, 628, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, - 633, 5, 53, 0, 0, 632, 629, 1, 0, 0, 0, 633, 636, 1, 0, 0, 0, 634, 632, - 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 123, 1, 0, 0, 0, 636, 634, 1, 0, - 0, 0, 637, 644, 5, 18, 0, 0, 638, 639, 3, 126, 63, 0, 639, 640, 5, 54, - 0, 0, 640, 641, 3, 128, 64, 0, 641, 643, 1, 0, 0, 0, 642, 638, 1, 0, 0, - 0, 643, 646, 1, 0, 0, 0, 644, 642, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, - 125, 1, 0, 0, 0, 646, 644, 1, 0, 0, 0, 647, 648, 5, 53, 0, 0, 648, 127, - 1, 0, 0, 0, 649, 650, 5, 53, 0, 0, 650, 129, 1, 0, 0, 0, 651, 653, 5, 24, - 0, 0, 652, 654, 3, 162, 81, 0, 653, 652, 1, 0, 0, 0, 653, 654, 1, 0, 0, - 0, 654, 131, 1, 0, 0, 0, 655, 657, 5, 25, 0, 0, 656, 658, 3, 162, 81, 0, - 657, 656, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 133, 1, 0, 0, 0, 659, - 661, 5, 26, 0, 0, 660, 662, 3, 162, 81, 0, 661, 660, 1, 0, 0, 0, 661, 662, - 1, 0, 0, 0, 662, 135, 1, 0, 0, 0, 663, 665, 5, 27, 0, 0, 664, 666, 3, 162, - 81, 0, 665, 664, 1, 0, 0, 0, 665, 666, 1, 0, 0, 0, 666, 137, 1, 0, 0, 0, - 667, 669, 5, 28, 0, 0, 668, 670, 3, 162, 81, 0, 669, 668, 1, 0, 0, 0, 669, - 670, 1, 0, 0, 0, 670, 139, 1, 0, 0, 0, 671, 673, 5, 29, 0, 0, 672, 674, - 3, 162, 81, 0, 673, 672, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 141, 1, - 0, 0, 0, 675, 677, 5, 31, 0, 0, 676, 678, 3, 162, 81, 0, 677, 676, 1, 0, - 0, 0, 677, 678, 1, 0, 0, 0, 678, 143, 1, 0, 0, 0, 679, 681, 5, 30, 0, 0, - 680, 682, 3, 162, 81, 0, 681, 680, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, - 145, 1, 0, 0, 0, 683, 685, 5, 32, 0, 0, 684, 686, 3, 162, 81, 0, 685, 684, - 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 147, 1, 0, 0, 0, 687, 689, 5, 34, - 0, 0, 688, 690, 3, 162, 81, 0, 689, 688, 1, 0, 0, 0, 689, 690, 1, 0, 0, - 0, 690, 149, 1, 0, 0, 0, 691, 693, 5, 35, 0, 0, 692, 694, 3, 162, 81, 0, - 693, 692, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 151, 1, 0, 0, 0, 695, - 697, 5, 36, 0, 0, 696, 698, 3, 162, 81, 0, 697, 696, 1, 0, 0, 0, 697, 698, - 1, 0, 0, 0, 698, 153, 1, 0, 0, 0, 699, 701, 5, 37, 0, 0, 700, 702, 3, 162, - 81, 0, 701, 700, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 155, 1, 0, 0, 0, - 703, 705, 5, 38, 0, 0, 704, 706, 3, 162, 81, 0, 705, 704, 1, 0, 0, 0, 705, - 706, 1, 0, 0, 0, 706, 157, 1, 0, 0, 0, 707, 708, 3, 160, 80, 0, 708, 159, - 1, 0, 0, 0, 709, 710, 3, 162, 81, 0, 710, 161, 1, 0, 0, 0, 711, 713, 3, - 164, 82, 0, 712, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 712, 1, 0, - 0, 0, 714, 715, 1, 0, 0, 0, 715, 163, 1, 0, 0, 0, 716, 717, 5, 53, 0, 0, - 717, 165, 1, 0, 0, 0, 98, 169, 173, 178, 183, 187, 192, 201, 207, 212, - 218, 224, 228, 233, 236, 244, 250, 257, 261, 269, 274, 283, 317, 324, 330, - 333, 338, 351, 357, 362, 368, 371, 376, 385, 388, 397, 400, 408, 411, 423, - 426, 431, 434, 439, 447, 450, 458, 461, 469, 472, 480, 489, 492, 502, 508, - 513, 516, 524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, - 576, 580, 585, 588, 591, 598, 601, 603, 609, 618, 623, 629, 634, 644, 653, - 657, 661, 665, 669, 673, 677, 681, 685, 689, 693, 697, 701, 705, 714, + 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, + 84, 7, 84, 2, 85, 7, 85, 1, 0, 5, 0, 174, 8, 0, 10, 0, 12, 0, 177, 9, 0, + 1, 0, 3, 0, 180, 8, 0, 1, 0, 1, 0, 1, 0, 3, 0, 185, 8, 0, 1, 0, 5, 0, 188, + 8, 0, 10, 0, 12, 0, 191, 9, 0, 1, 0, 3, 0, 194, 8, 0, 1, 0, 5, 0, 197, + 8, 0, 10, 0, 12, 0, 200, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 5, 1, 206, 8, 1, + 10, 1, 12, 1, 209, 9, 1, 1, 1, 5, 1, 212, 8, 1, 10, 1, 12, 1, 215, 9, 1, + 1, 2, 1, 2, 3, 2, 219, 8, 2, 1, 3, 1, 3, 4, 3, 223, 8, 3, 11, 3, 12, 3, + 224, 1, 3, 1, 3, 5, 3, 229, 8, 3, 10, 3, 12, 3, 232, 9, 3, 1, 3, 3, 3, + 235, 8, 3, 1, 3, 4, 3, 238, 8, 3, 11, 3, 12, 3, 239, 1, 3, 3, 3, 243, 8, + 3, 1, 4, 1, 4, 1, 5, 1, 5, 4, 5, 249, 8, 5, 11, 5, 12, 5, 250, 1, 5, 1, + 5, 5, 5, 255, 8, 5, 10, 5, 12, 5, 258, 9, 5, 1, 5, 1, 5, 4, 5, 262, 8, + 5, 11, 5, 12, 5, 263, 1, 5, 1, 5, 3, 5, 268, 8, 5, 1, 6, 1, 6, 1, 7, 1, + 7, 4, 7, 274, 8, 7, 11, 7, 12, 7, 275, 1, 7, 1, 7, 5, 7, 280, 8, 7, 10, + 7, 12, 7, 283, 9, 7, 1, 7, 1, 7, 4, 7, 287, 8, 7, 11, 7, 12, 7, 288, 1, + 7, 1, 7, 3, 7, 293, 8, 7, 1, 8, 1, 8, 1, 9, 1, 9, 4, 9, 299, 8, 9, 11, + 9, 12, 9, 300, 1, 9, 5, 9, 304, 8, 9, 10, 9, 12, 9, 307, 9, 9, 1, 10, 1, + 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 315, 8, 10, 1, 11, 1, 11, 1, 11, + 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, + 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, + 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 350, + 8, 11, 1, 12, 1, 12, 1, 12, 4, 12, 355, 8, 12, 11, 12, 12, 12, 356, 1, + 13, 1, 13, 4, 13, 361, 8, 13, 11, 13, 12, 13, 362, 1, 13, 3, 13, 366, 8, + 13, 1, 13, 4, 13, 369, 8, 13, 11, 13, 12, 13, 370, 1, 13, 1, 13, 1, 14, + 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 3, 17, 384, 8, + 17, 1, 18, 1, 18, 4, 18, 388, 8, 18, 11, 18, 12, 18, 389, 1, 18, 5, 18, + 393, 8, 18, 10, 18, 12, 18, 396, 9, 18, 1, 18, 4, 18, 399, 8, 18, 11, 18, + 12, 18, 400, 1, 18, 3, 18, 404, 8, 18, 1, 18, 4, 18, 407, 8, 18, 11, 18, + 12, 18, 408, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 4, 19, 416, 8, 19, 11, + 19, 12, 19, 417, 1, 19, 3, 19, 421, 8, 19, 1, 20, 1, 20, 1, 21, 1, 21, + 1, 21, 4, 21, 428, 8, 21, 11, 21, 12, 21, 429, 1, 21, 3, 21, 433, 8, 21, + 1, 22, 1, 22, 1, 23, 1, 23, 4, 23, 439, 8, 23, 11, 23, 12, 23, 440, 1, + 23, 3, 23, 444, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, + 1, 27, 4, 27, 454, 8, 27, 11, 27, 12, 27, 455, 1, 27, 3, 27, 459, 8, 27, + 1, 27, 4, 27, 462, 8, 27, 11, 27, 12, 27, 463, 1, 27, 3, 27, 467, 8, 27, + 1, 27, 4, 27, 470, 8, 27, 11, 27, 12, 27, 471, 1, 27, 1, 27, 1, 28, 1, + 28, 4, 28, 478, 8, 28, 11, 28, 12, 28, 479, 1, 28, 3, 28, 483, 8, 28, 1, + 29, 1, 29, 1, 30, 1, 30, 4, 30, 489, 8, 30, 11, 30, 12, 30, 490, 1, 30, + 3, 30, 494, 8, 30, 1, 31, 1, 31, 1, 32, 1, 32, 4, 32, 500, 8, 32, 11, 32, + 12, 32, 501, 1, 32, 3, 32, 505, 8, 32, 1, 33, 1, 33, 1, 34, 1, 34, 4, 34, + 511, 8, 34, 11, 34, 12, 34, 512, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 4, + 35, 520, 8, 35, 11, 35, 12, 35, 521, 1, 35, 3, 35, 525, 8, 35, 1, 36, 1, + 36, 1, 37, 1, 37, 1, 38, 1, 38, 4, 38, 533, 8, 38, 11, 38, 12, 38, 534, + 1, 38, 1, 38, 1, 39, 1, 39, 3, 39, 541, 8, 39, 1, 39, 4, 39, 544, 8, 39, + 11, 39, 12, 39, 545, 1, 39, 3, 39, 549, 8, 39, 1, 40, 1, 40, 1, 41, 1, + 41, 1, 42, 1, 42, 3, 42, 557, 8, 42, 1, 43, 1, 43, 3, 43, 561, 8, 43, 1, + 44, 1, 44, 3, 44, 565, 8, 44, 1, 45, 1, 45, 3, 45, 569, 8, 45, 1, 46, 1, + 46, 3, 46, 573, 8, 46, 1, 47, 1, 47, 3, 47, 577, 8, 47, 1, 48, 1, 48, 3, + 48, 581, 8, 48, 1, 49, 1, 49, 3, 49, 585, 8, 49, 1, 50, 1, 50, 3, 50, 589, + 8, 50, 1, 51, 1, 51, 3, 51, 593, 8, 51, 1, 52, 1, 52, 3, 52, 597, 8, 52, + 1, 53, 1, 53, 3, 53, 601, 8, 53, 1, 54, 1, 54, 3, 54, 605, 8, 54, 1, 55, + 1, 55, 3, 55, 609, 8, 55, 1, 56, 1, 56, 3, 56, 613, 8, 56, 1, 57, 1, 57, + 1, 57, 3, 57, 618, 8, 57, 1, 57, 3, 57, 621, 8, 57, 1, 57, 3, 57, 624, + 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 631, 8, 58, 1, 58, 3, + 58, 634, 8, 58, 3, 58, 636, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 642, + 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 651, 8, + 60, 1, 60, 1, 60, 1, 61, 3, 61, 656, 8, 61, 1, 62, 1, 62, 1, 63, 1, 63, + 3, 63, 662, 8, 63, 1, 63, 5, 63, 665, 8, 63, 10, 63, 12, 63, 668, 9, 63, + 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 5, 64, 675, 8, 64, 10, 64, 12, 64, 678, + 9, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 3, 67, 686, 8, 67, 1, + 68, 1, 68, 3, 68, 690, 8, 68, 1, 69, 1, 69, 3, 69, 694, 8, 69, 1, 70, 1, + 70, 3, 70, 698, 8, 70, 1, 71, 1, 71, 3, 71, 702, 8, 71, 1, 72, 1, 72, 3, + 72, 706, 8, 72, 1, 73, 1, 73, 3, 73, 710, 8, 73, 1, 74, 1, 74, 3, 74, 714, + 8, 74, 1, 75, 1, 75, 3, 75, 718, 8, 75, 1, 76, 1, 76, 3, 76, 722, 8, 76, + 1, 77, 1, 77, 3, 77, 726, 8, 77, 1, 78, 1, 78, 3, 78, 730, 8, 78, 1, 79, + 1, 79, 3, 79, 734, 8, 79, 1, 80, 1, 80, 3, 80, 738, 8, 80, 1, 81, 1, 81, + 3, 81, 742, 8, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 4, 84, 749, 8, 84, + 11, 84, 12, 84, 750, 1, 85, 1, 85, 1, 85, 0, 0, 86, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, + 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, + 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, + 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, + 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 0, 0, + 806, 0, 175, 1, 0, 0, 0, 2, 203, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 6, 220, + 1, 0, 0, 0, 8, 244, 1, 0, 0, 0, 10, 246, 1, 0, 0, 0, 12, 269, 1, 0, 0, + 0, 14, 271, 1, 0, 0, 0, 16, 294, 1, 0, 0, 0, 18, 296, 1, 0, 0, 0, 20, 314, + 1, 0, 0, 0, 22, 349, 1, 0, 0, 0, 24, 351, 1, 0, 0, 0, 26, 358, 1, 0, 0, + 0, 28, 374, 1, 0, 0, 0, 30, 376, 1, 0, 0, 0, 32, 379, 1, 0, 0, 0, 34, 381, + 1, 0, 0, 0, 36, 385, 1, 0, 0, 0, 38, 412, 1, 0, 0, 0, 40, 422, 1, 0, 0, + 0, 42, 424, 1, 0, 0, 0, 44, 434, 1, 0, 0, 0, 46, 436, 1, 0, 0, 0, 48, 445, + 1, 0, 0, 0, 50, 447, 1, 0, 0, 0, 52, 449, 1, 0, 0, 0, 54, 451, 1, 0, 0, + 0, 56, 475, 1, 0, 0, 0, 58, 484, 1, 0, 0, 0, 60, 486, 1, 0, 0, 0, 62, 495, + 1, 0, 0, 0, 64, 497, 1, 0, 0, 0, 66, 506, 1, 0, 0, 0, 68, 508, 1, 0, 0, + 0, 70, 516, 1, 0, 0, 0, 72, 526, 1, 0, 0, 0, 74, 528, 1, 0, 0, 0, 76, 530, + 1, 0, 0, 0, 78, 538, 1, 0, 0, 0, 80, 550, 1, 0, 0, 0, 82, 552, 1, 0, 0, + 0, 84, 554, 1, 0, 0, 0, 86, 558, 1, 0, 0, 0, 88, 562, 1, 0, 0, 0, 90, 566, + 1, 0, 0, 0, 92, 572, 1, 0, 0, 0, 94, 574, 1, 0, 0, 0, 96, 578, 1, 0, 0, + 0, 98, 582, 1, 0, 0, 0, 100, 586, 1, 0, 0, 0, 102, 590, 1, 0, 0, 0, 104, + 594, 1, 0, 0, 0, 106, 598, 1, 0, 0, 0, 108, 602, 1, 0, 0, 0, 110, 606, + 1, 0, 0, 0, 112, 610, 1, 0, 0, 0, 114, 614, 1, 0, 0, 0, 116, 625, 1, 0, + 0, 0, 118, 637, 1, 0, 0, 0, 120, 645, 1, 0, 0, 0, 122, 655, 1, 0, 0, 0, + 124, 657, 1, 0, 0, 0, 126, 659, 1, 0, 0, 0, 128, 669, 1, 0, 0, 0, 130, + 679, 1, 0, 0, 0, 132, 681, 1, 0, 0, 0, 134, 683, 1, 0, 0, 0, 136, 687, + 1, 0, 0, 0, 138, 691, 1, 0, 0, 0, 140, 695, 1, 0, 0, 0, 142, 699, 1, 0, + 0, 0, 144, 703, 1, 0, 0, 0, 146, 707, 1, 0, 0, 0, 148, 711, 1, 0, 0, 0, + 150, 715, 1, 0, 0, 0, 152, 719, 1, 0, 0, 0, 154, 723, 1, 0, 0, 0, 156, + 727, 1, 0, 0, 0, 158, 731, 1, 0, 0, 0, 160, 735, 1, 0, 0, 0, 162, 739, + 1, 0, 0, 0, 164, 743, 1, 0, 0, 0, 166, 745, 1, 0, 0, 0, 168, 748, 1, 0, + 0, 0, 170, 752, 1, 0, 0, 0, 172, 174, 5, 47, 0, 0, 173, 172, 1, 0, 0, 0, + 174, 177, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, + 179, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 178, 180, 3, 24, 12, 0, 179, 178, + 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 184, 1, 0, 0, 0, 181, 182, 3, 18, + 9, 0, 182, 183, 5, 47, 0, 0, 183, 185, 1, 0, 0, 0, 184, 181, 1, 0, 0, 0, + 184, 185, 1, 0, 0, 0, 185, 189, 1, 0, 0, 0, 186, 188, 5, 47, 0, 0, 187, + 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, + 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 194, 3, 2, + 1, 0, 193, 192, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 198, 1, 0, 0, 0, + 195, 197, 5, 47, 0, 0, 196, 195, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, + 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 201, 1, 0, 0, 0, 200, 198, + 1, 0, 0, 0, 201, 202, 5, 0, 0, 1, 202, 1, 1, 0, 0, 0, 203, 213, 3, 4, 2, + 0, 204, 206, 5, 47, 0, 0, 205, 204, 1, 0, 0, 0, 206, 209, 1, 0, 0, 0, 207, + 205, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 210, 1, 0, 0, 0, 209, 207, + 1, 0, 0, 0, 210, 212, 3, 4, 2, 0, 211, 207, 1, 0, 0, 0, 212, 215, 1, 0, + 0, 0, 213, 211, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 3, 1, 0, 0, 0, 215, + 213, 1, 0, 0, 0, 216, 219, 3, 6, 3, 0, 217, 219, 3, 10, 5, 0, 218, 216, + 1, 0, 0, 0, 218, 217, 1, 0, 0, 0, 219, 5, 1, 0, 0, 0, 220, 222, 3, 8, 4, + 0, 221, 223, 5, 47, 0, 0, 222, 221, 1, 0, 0, 0, 223, 224, 1, 0, 0, 0, 224, + 222, 1, 0, 0, 0, 224, 225, 1, 0, 0, 0, 225, 242, 1, 0, 0, 0, 226, 230, + 5, 1, 0, 0, 227, 229, 5, 47, 0, 0, 228, 227, 1, 0, 0, 0, 229, 232, 1, 0, + 0, 0, 230, 228, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 234, 1, 0, 0, 0, + 232, 230, 1, 0, 0, 0, 233, 235, 3, 18, 9, 0, 234, 233, 1, 0, 0, 0, 234, + 235, 1, 0, 0, 0, 235, 237, 1, 0, 0, 0, 236, 238, 5, 47, 0, 0, 237, 236, + 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, + 0, 0, 240, 241, 1, 0, 0, 0, 241, 243, 5, 2, 0, 0, 242, 226, 1, 0, 0, 0, + 242, 243, 1, 0, 0, 0, 243, 7, 1, 0, 0, 0, 244, 245, 5, 3, 0, 0, 245, 9, + 1, 0, 0, 0, 246, 248, 3, 12, 6, 0, 247, 249, 5, 47, 0, 0, 248, 247, 1, + 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, + 0, 251, 267, 1, 0, 0, 0, 252, 256, 5, 1, 0, 0, 253, 255, 5, 47, 0, 0, 254, + 253, 1, 0, 0, 0, 255, 258, 1, 0, 0, 0, 256, 254, 1, 0, 0, 0, 256, 257, + 1, 0, 0, 0, 257, 259, 1, 0, 0, 0, 258, 256, 1, 0, 0, 0, 259, 261, 3, 18, + 9, 0, 260, 262, 5, 47, 0, 0, 261, 260, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, + 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, + 266, 5, 2, 0, 0, 266, 268, 1, 0, 0, 0, 267, 252, 1, 0, 0, 0, 267, 268, + 1, 0, 0, 0, 268, 11, 1, 0, 0, 0, 269, 270, 5, 4, 0, 0, 270, 13, 1, 0, 0, + 0, 271, 273, 3, 16, 8, 0, 272, 274, 5, 47, 0, 0, 273, 272, 1, 0, 0, 0, + 274, 275, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, + 292, 1, 0, 0, 0, 277, 281, 5, 1, 0, 0, 278, 280, 5, 47, 0, 0, 279, 278, + 1, 0, 0, 0, 280, 283, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 282, 1, 0, + 0, 0, 282, 284, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 286, 3, 18, 9, 0, + 285, 287, 5, 47, 0, 0, 286, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, + 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 291, + 5, 2, 0, 0, 291, 293, 1, 0, 0, 0, 292, 277, 1, 0, 0, 0, 292, 293, 1, 0, + 0, 0, 293, 15, 1, 0, 0, 0, 294, 295, 5, 5, 0, 0, 295, 17, 1, 0, 0, 0, 296, + 305, 3, 20, 10, 0, 297, 299, 5, 47, 0, 0, 298, 297, 1, 0, 0, 0, 299, 300, + 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 1, 0, + 0, 0, 302, 304, 3, 20, 10, 0, 303, 298, 1, 0, 0, 0, 304, 307, 1, 0, 0, + 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 19, 1, 0, 0, 0, 307, + 305, 1, 0, 0, 0, 308, 315, 3, 22, 11, 0, 309, 315, 3, 26, 13, 0, 310, 315, + 3, 36, 18, 0, 311, 315, 3, 68, 34, 0, 312, 315, 3, 76, 38, 0, 313, 315, + 3, 54, 27, 0, 314, 308, 1, 0, 0, 0, 314, 309, 1, 0, 0, 0, 314, 310, 1, + 0, 0, 0, 314, 311, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 314, 313, 1, 0, 0, + 0, 315, 21, 1, 0, 0, 0, 316, 350, 3, 84, 42, 0, 317, 350, 3, 86, 43, 0, + 318, 350, 3, 88, 44, 0, 319, 350, 3, 90, 45, 0, 320, 350, 3, 92, 46, 0, + 321, 350, 3, 98, 49, 0, 322, 350, 3, 100, 50, 0, 323, 350, 3, 102, 51, + 0, 324, 350, 3, 104, 52, 0, 325, 350, 3, 106, 53, 0, 326, 350, 3, 108, + 54, 0, 327, 350, 3, 110, 55, 0, 328, 350, 3, 112, 56, 0, 329, 350, 3, 114, + 57, 0, 330, 350, 3, 116, 58, 0, 331, 350, 3, 118, 59, 0, 332, 350, 3, 120, + 60, 0, 333, 350, 3, 128, 64, 0, 334, 350, 3, 134, 67, 0, 335, 350, 3, 136, + 68, 0, 336, 350, 3, 138, 69, 0, 337, 350, 3, 140, 70, 0, 338, 350, 3, 142, + 71, 0, 339, 350, 3, 144, 72, 0, 340, 350, 3, 146, 73, 0, 341, 350, 3, 148, + 74, 0, 342, 350, 3, 150, 75, 0, 343, 350, 3, 152, 76, 0, 344, 350, 3, 154, + 77, 0, 345, 350, 3, 156, 78, 0, 346, 350, 3, 158, 79, 0, 347, 350, 3, 160, + 80, 0, 348, 350, 3, 162, 81, 0, 349, 316, 1, 0, 0, 0, 349, 317, 1, 0, 0, + 0, 349, 318, 1, 0, 0, 0, 349, 319, 1, 0, 0, 0, 349, 320, 1, 0, 0, 0, 349, + 321, 1, 0, 0, 0, 349, 322, 1, 0, 0, 0, 349, 323, 1, 0, 0, 0, 349, 324, + 1, 0, 0, 0, 349, 325, 1, 0, 0, 0, 349, 326, 1, 0, 0, 0, 349, 327, 1, 0, + 0, 0, 349, 328, 1, 0, 0, 0, 349, 329, 1, 0, 0, 0, 349, 330, 1, 0, 0, 0, + 349, 331, 1, 0, 0, 0, 349, 332, 1, 0, 0, 0, 349, 333, 1, 0, 0, 0, 349, + 334, 1, 0, 0, 0, 349, 335, 1, 0, 0, 0, 349, 336, 1, 0, 0, 0, 349, 337, + 1, 0, 0, 0, 349, 338, 1, 0, 0, 0, 349, 339, 1, 0, 0, 0, 349, 340, 1, 0, + 0, 0, 349, 341, 1, 0, 0, 0, 349, 342, 1, 0, 0, 0, 349, 343, 1, 0, 0, 0, + 349, 344, 1, 0, 0, 0, 349, 345, 1, 0, 0, 0, 349, 346, 1, 0, 0, 0, 349, + 347, 1, 0, 0, 0, 349, 348, 1, 0, 0, 0, 350, 23, 1, 0, 0, 0, 351, 352, 5, + 35, 0, 0, 352, 354, 3, 168, 84, 0, 353, 355, 5, 47, 0, 0, 354, 353, 1, + 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, + 0, 357, 25, 1, 0, 0, 0, 358, 365, 3, 30, 15, 0, 359, 361, 5, 47, 0, 0, + 360, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 362, + 363, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 366, 3, 28, 14, 0, 365, 360, + 1, 0, 0, 0, 365, 366, 1, 0, 0, 0, 366, 368, 1, 0, 0, 0, 367, 369, 5, 47, + 0, 0, 368, 367, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, + 370, 371, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 5, 54, 0, 0, 373, + 27, 1, 0, 0, 0, 374, 375, 3, 18, 9, 0, 375, 29, 1, 0, 0, 0, 376, 377, 5, + 41, 0, 0, 377, 378, 3, 32, 16, 0, 378, 31, 1, 0, 0, 0, 379, 380, 3, 34, + 17, 0, 380, 33, 1, 0, 0, 0, 381, 383, 5, 42, 0, 0, 382, 384, 3, 168, 84, + 0, 383, 382, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 35, 1, 0, 0, 0, 385, + 394, 3, 38, 19, 0, 386, 388, 5, 47, 0, 0, 387, 386, 1, 0, 0, 0, 388, 389, + 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 391, 1, 0, + 0, 0, 391, 393, 3, 42, 21, 0, 392, 387, 1, 0, 0, 0, 393, 396, 1, 0, 0, + 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 403, 1, 0, 0, 0, 396, + 394, 1, 0, 0, 0, 397, 399, 5, 47, 0, 0, 398, 397, 1, 0, 0, 0, 399, 400, + 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 1, 0, + 0, 0, 402, 404, 3, 46, 23, 0, 403, 398, 1, 0, 0, 0, 403, 404, 1, 0, 0, + 0, 404, 406, 1, 0, 0, 0, 405, 407, 5, 47, 0, 0, 406, 405, 1, 0, 0, 0, 407, + 408, 1, 0, 0, 0, 408, 406, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, + 1, 0, 0, 0, 410, 411, 5, 54, 0, 0, 411, 37, 1, 0, 0, 0, 412, 413, 5, 43, + 0, 0, 413, 420, 3, 50, 25, 0, 414, 416, 5, 47, 0, 0, 415, 414, 1, 0, 0, + 0, 416, 417, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, + 419, 1, 0, 0, 0, 419, 421, 3, 40, 20, 0, 420, 415, 1, 0, 0, 0, 420, 421, + 1, 0, 0, 0, 421, 39, 1, 0, 0, 0, 422, 423, 3, 18, 9, 0, 423, 41, 1, 0, + 0, 0, 424, 425, 5, 51, 0, 0, 425, 432, 3, 52, 26, 0, 426, 428, 5, 47, 0, + 0, 427, 426, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, + 430, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 433, 3, 44, 22, 0, 432, 427, + 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 43, 1, 0, 0, 0, 434, 435, 3, 18, + 9, 0, 435, 45, 1, 0, 0, 0, 436, 443, 5, 50, 0, 0, 437, 439, 5, 47, 0, 0, + 438, 437, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 440, + 441, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 444, 3, 48, 24, 0, 443, 438, + 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 47, 1, 0, 0, 0, 445, 446, 3, 18, + 9, 0, 446, 49, 1, 0, 0, 0, 447, 448, 3, 164, 82, 0, 448, 51, 1, 0, 0, 0, + 449, 450, 3, 164, 82, 0, 450, 53, 1, 0, 0, 0, 451, 458, 3, 56, 28, 0, 452, + 454, 5, 47, 0, 0, 453, 452, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 453, + 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 459, 3, 60, + 30, 0, 458, 453, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 466, 1, 0, 0, 0, + 460, 462, 5, 47, 0, 0, 461, 460, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, + 461, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 467, + 3, 64, 32, 0, 466, 461, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 469, 1, + 0, 0, 0, 468, 470, 5, 47, 0, 0, 469, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, + 0, 471, 469, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, + 474, 5, 54, 0, 0, 474, 55, 1, 0, 0, 0, 475, 482, 5, 44, 0, 0, 476, 478, + 5, 47, 0, 0, 477, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 477, 1, 0, + 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 3, 58, 29, + 0, 482, 477, 1, 0, 0, 0, 482, 483, 1, 0, 0, 0, 483, 57, 1, 0, 0, 0, 484, + 485, 3, 18, 9, 0, 485, 59, 1, 0, 0, 0, 486, 493, 5, 52, 0, 0, 487, 489, + 5, 47, 0, 0, 488, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 488, 1, 0, + 0, 0, 490, 491, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 494, 3, 62, 31, + 0, 493, 488, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 61, 1, 0, 0, 0, 495, + 496, 3, 18, 9, 0, 496, 63, 1, 0, 0, 0, 497, 504, 5, 53, 0, 0, 498, 500, + 5, 47, 0, 0, 499, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 499, 1, 0, + 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 505, 3, 66, 33, + 0, 504, 499, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 65, 1, 0, 0, 0, 506, + 507, 3, 18, 9, 0, 507, 67, 1, 0, 0, 0, 508, 510, 3, 70, 35, 0, 509, 511, + 5, 47, 0, 0, 510, 509, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 510, 1, 0, + 0, 0, 512, 513, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 515, 5, 54, 0, 0, + 515, 69, 1, 0, 0, 0, 516, 517, 5, 45, 0, 0, 517, 524, 3, 74, 37, 0, 518, + 520, 5, 47, 0, 0, 519, 518, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 519, + 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 525, 3, 72, + 36, 0, 524, 519, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 71, 1, 0, 0, 0, + 526, 527, 3, 18, 9, 0, 527, 73, 1, 0, 0, 0, 528, 529, 3, 168, 84, 0, 529, + 75, 1, 0, 0, 0, 530, 532, 3, 78, 39, 0, 531, 533, 5, 47, 0, 0, 532, 531, + 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, + 0, 0, 535, 536, 1, 0, 0, 0, 536, 537, 5, 54, 0, 0, 537, 77, 1, 0, 0, 0, + 538, 540, 5, 46, 0, 0, 539, 541, 3, 82, 41, 0, 540, 539, 1, 0, 0, 0, 540, + 541, 1, 0, 0, 0, 541, 548, 1, 0, 0, 0, 542, 544, 5, 47, 0, 0, 543, 542, + 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, + 0, 0, 546, 547, 1, 0, 0, 0, 547, 549, 3, 80, 40, 0, 548, 543, 1, 0, 0, + 0, 548, 549, 1, 0, 0, 0, 549, 79, 1, 0, 0, 0, 550, 551, 3, 18, 9, 0, 551, + 81, 1, 0, 0, 0, 552, 553, 3, 168, 84, 0, 553, 83, 1, 0, 0, 0, 554, 556, + 5, 6, 0, 0, 555, 557, 3, 168, 84, 0, 556, 555, 1, 0, 0, 0, 556, 557, 1, + 0, 0, 0, 557, 85, 1, 0, 0, 0, 558, 560, 5, 7, 0, 0, 559, 561, 3, 168, 84, + 0, 560, 559, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 87, 1, 0, 0, 0, 562, + 564, 5, 8, 0, 0, 563, 565, 3, 168, 84, 0, 564, 563, 1, 0, 0, 0, 564, 565, + 1, 0, 0, 0, 565, 89, 1, 0, 0, 0, 566, 568, 5, 9, 0, 0, 567, 569, 3, 168, + 84, 0, 568, 567, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 91, 1, 0, 0, 0, + 570, 573, 3, 96, 48, 0, 571, 573, 3, 94, 47, 0, 572, 570, 1, 0, 0, 0, 572, + 571, 1, 0, 0, 0, 573, 93, 1, 0, 0, 0, 574, 576, 5, 11, 0, 0, 575, 577, + 3, 168, 84, 0, 576, 575, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 95, 1, + 0, 0, 0, 578, 580, 5, 10, 0, 0, 579, 581, 3, 168, 84, 0, 580, 579, 1, 0, + 0, 0, 580, 581, 1, 0, 0, 0, 581, 97, 1, 0, 0, 0, 582, 584, 5, 12, 0, 0, + 583, 585, 3, 166, 83, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, + 99, 1, 0, 0, 0, 586, 588, 5, 20, 0, 0, 587, 589, 3, 168, 84, 0, 588, 587, + 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 101, 1, 0, 0, 0, 590, 592, 5, 21, + 0, 0, 591, 593, 3, 168, 84, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, + 0, 593, 103, 1, 0, 0, 0, 594, 596, 5, 22, 0, 0, 595, 597, 3, 168, 84, 0, + 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 105, 1, 0, 0, 0, 598, + 600, 5, 23, 0, 0, 599, 601, 3, 166, 83, 0, 600, 599, 1, 0, 0, 0, 600, 601, + 1, 0, 0, 0, 601, 107, 1, 0, 0, 0, 602, 604, 5, 24, 0, 0, 603, 605, 3, 166, + 83, 0, 604, 603, 1, 0, 0, 0, 604, 605, 1, 0, 0, 0, 605, 109, 1, 0, 0, 0, + 606, 608, 5, 13, 0, 0, 607, 609, 3, 168, 84, 0, 608, 607, 1, 0, 0, 0, 608, + 609, 1, 0, 0, 0, 609, 111, 1, 0, 0, 0, 610, 612, 5, 14, 0, 0, 611, 613, + 3, 166, 83, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 113, 1, + 0, 0, 0, 614, 615, 5, 15, 0, 0, 615, 617, 3, 124, 62, 0, 616, 618, 5, 56, + 0, 0, 617, 616, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 623, 1, 0, 0, 0, + 619, 621, 5, 48, 0, 0, 620, 619, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 621, + 622, 1, 0, 0, 0, 622, 624, 3, 126, 63, 0, 623, 620, 1, 0, 0, 0, 623, 624, + 1, 0, 0, 0, 624, 115, 1, 0, 0, 0, 625, 626, 5, 16, 0, 0, 626, 627, 3, 122, + 61, 0, 627, 635, 3, 124, 62, 0, 628, 633, 5, 56, 0, 0, 629, 631, 5, 48, + 0, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, + 632, 634, 3, 126, 63, 0, 633, 630, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, + 636, 1, 0, 0, 0, 635, 628, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 117, + 1, 0, 0, 0, 637, 638, 5, 17, 0, 0, 638, 639, 3, 124, 62, 0, 639, 641, 5, + 56, 0, 0, 640, 642, 5, 48, 0, 0, 641, 640, 1, 0, 0, 0, 641, 642, 1, 0, + 0, 0, 642, 643, 1, 0, 0, 0, 643, 644, 3, 126, 63, 0, 644, 119, 1, 0, 0, + 0, 645, 646, 5, 18, 0, 0, 646, 647, 3, 122, 61, 0, 647, 648, 3, 124, 62, + 0, 648, 650, 5, 56, 0, 0, 649, 651, 5, 48, 0, 0, 650, 649, 1, 0, 0, 0, + 650, 651, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 653, 3, 126, 63, 0, 653, + 121, 1, 0, 0, 0, 654, 656, 3, 168, 84, 0, 655, 654, 1, 0, 0, 0, 655, 656, + 1, 0, 0, 0, 656, 123, 1, 0, 0, 0, 657, 658, 5, 55, 0, 0, 658, 125, 1, 0, + 0, 0, 659, 666, 5, 55, 0, 0, 660, 662, 5, 48, 0, 0, 661, 660, 1, 0, 0, + 0, 661, 662, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 665, 5, 55, 0, 0, 664, + 661, 1, 0, 0, 0, 665, 668, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 666, 667, + 1, 0, 0, 0, 667, 127, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 669, 676, 5, 19, + 0, 0, 670, 671, 3, 130, 65, 0, 671, 672, 5, 56, 0, 0, 672, 673, 3, 132, + 66, 0, 673, 675, 1, 0, 0, 0, 674, 670, 1, 0, 0, 0, 675, 678, 1, 0, 0, 0, + 676, 674, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 129, 1, 0, 0, 0, 678, + 676, 1, 0, 0, 0, 679, 680, 5, 55, 0, 0, 680, 131, 1, 0, 0, 0, 681, 682, + 5, 55, 0, 0, 682, 133, 1, 0, 0, 0, 683, 685, 5, 25, 0, 0, 684, 686, 3, + 168, 84, 0, 685, 684, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 135, 1, 0, + 0, 0, 687, 689, 5, 26, 0, 0, 688, 690, 3, 168, 84, 0, 689, 688, 1, 0, 0, + 0, 689, 690, 1, 0, 0, 0, 690, 137, 1, 0, 0, 0, 691, 693, 5, 27, 0, 0, 692, + 694, 3, 168, 84, 0, 693, 692, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 139, + 1, 0, 0, 0, 695, 697, 5, 28, 0, 0, 696, 698, 3, 168, 84, 0, 697, 696, 1, + 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 141, 1, 0, 0, 0, 699, 701, 5, 29, 0, + 0, 700, 702, 3, 168, 84, 0, 701, 700, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, + 702, 143, 1, 0, 0, 0, 703, 705, 5, 30, 0, 0, 704, 706, 3, 168, 84, 0, 705, + 704, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 145, 1, 0, 0, 0, 707, 709, + 5, 32, 0, 0, 708, 710, 3, 168, 84, 0, 709, 708, 1, 0, 0, 0, 709, 710, 1, + 0, 0, 0, 710, 147, 1, 0, 0, 0, 711, 713, 5, 33, 0, 0, 712, 714, 3, 168, + 84, 0, 713, 712, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 149, 1, 0, 0, 0, + 715, 717, 5, 31, 0, 0, 716, 718, 3, 168, 84, 0, 717, 716, 1, 0, 0, 0, 717, + 718, 1, 0, 0, 0, 718, 151, 1, 0, 0, 0, 719, 721, 5, 34, 0, 0, 720, 722, + 3, 168, 84, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 153, 1, + 0, 0, 0, 723, 725, 5, 36, 0, 0, 724, 726, 3, 168, 84, 0, 725, 724, 1, 0, + 0, 0, 725, 726, 1, 0, 0, 0, 726, 155, 1, 0, 0, 0, 727, 729, 5, 37, 0, 0, + 728, 730, 3, 168, 84, 0, 729, 728, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, + 157, 1, 0, 0, 0, 731, 733, 5, 38, 0, 0, 732, 734, 3, 168, 84, 0, 733, 732, + 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 159, 1, 0, 0, 0, 735, 737, 5, 39, + 0, 0, 736, 738, 3, 168, 84, 0, 737, 736, 1, 0, 0, 0, 737, 738, 1, 0, 0, + 0, 738, 161, 1, 0, 0, 0, 739, 741, 5, 40, 0, 0, 740, 742, 3, 168, 84, 0, + 741, 740, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 163, 1, 0, 0, 0, 743, + 744, 3, 166, 83, 0, 744, 165, 1, 0, 0, 0, 745, 746, 3, 168, 84, 0, 746, + 167, 1, 0, 0, 0, 747, 749, 3, 170, 85, 0, 748, 747, 1, 0, 0, 0, 749, 750, + 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 169, 1, 0, + 0, 0, 752, 753, 5, 55, 0, 0, 753, 171, 1, 0, 0, 0, 103, 175, 179, 184, + 189, 193, 198, 207, 213, 218, 224, 230, 234, 239, 242, 250, 256, 263, 267, + 275, 281, 288, 292, 300, 305, 314, 349, 356, 362, 365, 370, 383, 389, 394, + 400, 403, 408, 417, 420, 429, 432, 440, 443, 455, 458, 463, 466, 471, 479, + 482, 490, 493, 501, 504, 512, 521, 524, 534, 540, 545, 548, 556, 560, 564, + 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 617, 620, 623, + 630, 633, 635, 641, 650, 655, 661, 666, 676, 685, 689, 693, 697, 701, 705, + 709, 713, 717, 721, 725, 729, 733, 737, 741, 750, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -442,56 +459,58 @@ const ( EarthParserDEDENT = 2 EarthParserTarget = 3 EarthParserUserCommand = 4 - EarthParserFROM = 5 - EarthParserFROM_DOCKERFILE = 6 - EarthParserLOCALLY = 7 - EarthParserCOPY = 8 - EarthParserSAVE_ARTIFACT = 9 - EarthParserSAVE_IMAGE = 10 - EarthParserRUN = 11 - EarthParserEXPOSE = 12 - EarthParserVOLUME = 13 - EarthParserENV = 14 - EarthParserARG = 15 - EarthParserSET = 16 - EarthParserLET = 17 - EarthParserLABEL = 18 - EarthParserBUILD = 19 - EarthParserWORKDIR = 20 - EarthParserUSER = 21 - EarthParserCMD = 22 - EarthParserENTRYPOINT = 23 - EarthParserGIT_CLONE = 24 - EarthParserADD = 25 - EarthParserSTOPSIGNAL = 26 - EarthParserONBUILD = 27 - EarthParserHEALTHCHECK = 28 - EarthParserSHELL = 29 - EarthParserDO = 30 - EarthParserCOMMAND = 31 - EarthParserIMPORT = 32 - EarthParserVERSION = 33 - EarthParserCACHE = 34 - EarthParserHOST = 35 - EarthParserPROJECT = 36 - EarthParserPIPELINE = 37 - EarthParserTRIGGER = 38 - EarthParserWITH = 39 - EarthParserDOCKER = 40 - EarthParserIF = 41 - EarthParserTRY = 42 - EarthParserFOR = 43 - EarthParserWAIT = 44 - EarthParserNL = 45 - EarthParserWS = 46 - EarthParserCOMMENT = 47 - EarthParserELSE = 48 - EarthParserELSE_IF = 49 - EarthParserCATCH = 50 - EarthParserFINALLY = 51 - EarthParserEND = 52 - EarthParserAtom = 53 - EarthParserEQUALS = 54 + EarthParserFunction = 5 + EarthParserFROM = 6 + EarthParserFROM_DOCKERFILE = 7 + EarthParserLOCALLY = 8 + EarthParserCOPY = 9 + EarthParserSAVE_ARTIFACT = 10 + EarthParserSAVE_IMAGE = 11 + EarthParserRUN = 12 + EarthParserEXPOSE = 13 + EarthParserVOLUME = 14 + EarthParserENV = 15 + EarthParserARG = 16 + EarthParserSET = 17 + EarthParserLET = 18 + EarthParserLABEL = 19 + EarthParserBUILD = 20 + EarthParserWORKDIR = 21 + EarthParserUSER = 22 + EarthParserCMD = 23 + EarthParserENTRYPOINT = 24 + EarthParserGIT_CLONE = 25 + EarthParserADD = 26 + EarthParserSTOPSIGNAL = 27 + EarthParserONBUILD = 28 + EarthParserHEALTHCHECK = 29 + EarthParserSHELL = 30 + EarthParserDO = 31 + EarthParserCOMMAND = 32 + EarthParserFUNCTION = 33 + EarthParserIMPORT = 34 + EarthParserVERSION = 35 + EarthParserCACHE = 36 + EarthParserHOST = 37 + EarthParserPROJECT = 38 + EarthParserPIPELINE = 39 + EarthParserTRIGGER = 40 + EarthParserWITH = 41 + EarthParserDOCKER = 42 + EarthParserIF = 43 + EarthParserTRY = 44 + EarthParserFOR = 45 + EarthParserWAIT = 46 + EarthParserNL = 47 + EarthParserWS = 48 + EarthParserCOMMENT = 49 + EarthParserELSE = 50 + EarthParserELSE_IF = 51 + EarthParserCATCH = 52 + EarthParserFINALLY = 53 + EarthParserEND = 54 + EarthParserAtom = 55 + EarthParserEQUALS = 56 ) // EarthParser rules. @@ -503,82 +522,85 @@ const ( EarthParserRULE_targetHeader = 4 EarthParserRULE_userCommand = 5 EarthParserRULE_userCommandHeader = 6 - EarthParserRULE_stmts = 7 - EarthParserRULE_stmt = 8 - EarthParserRULE_commandStmt = 9 - EarthParserRULE_version = 10 - EarthParserRULE_withStmt = 11 - EarthParserRULE_withBlock = 12 - EarthParserRULE_withExpr = 13 - EarthParserRULE_withCommand = 14 - EarthParserRULE_dockerCommand = 15 - EarthParserRULE_ifStmt = 16 - EarthParserRULE_ifClause = 17 - EarthParserRULE_ifBlock = 18 - EarthParserRULE_elseIfClause = 19 - EarthParserRULE_elseIfBlock = 20 - EarthParserRULE_elseClause = 21 - EarthParserRULE_elseBlock = 22 - EarthParserRULE_ifExpr = 23 - EarthParserRULE_elseIfExpr = 24 - EarthParserRULE_tryStmt = 25 - EarthParserRULE_tryClause = 26 - EarthParserRULE_tryBlock = 27 - EarthParserRULE_catchClause = 28 - EarthParserRULE_catchBlock = 29 - EarthParserRULE_finallyClause = 30 - EarthParserRULE_finallyBlock = 31 - EarthParserRULE_forStmt = 32 - EarthParserRULE_forClause = 33 - EarthParserRULE_forBlock = 34 - EarthParserRULE_forExpr = 35 - EarthParserRULE_waitStmt = 36 - EarthParserRULE_waitClause = 37 - EarthParserRULE_waitBlock = 38 - EarthParserRULE_waitExpr = 39 - EarthParserRULE_fromStmt = 40 - EarthParserRULE_fromDockerfileStmt = 41 - EarthParserRULE_locallyStmt = 42 - EarthParserRULE_copyStmt = 43 - EarthParserRULE_saveStmt = 44 - EarthParserRULE_saveImage = 45 - EarthParserRULE_saveArtifact = 46 - EarthParserRULE_runStmt = 47 - EarthParserRULE_buildStmt = 48 - EarthParserRULE_workdirStmt = 49 - EarthParserRULE_userStmt = 50 - EarthParserRULE_cmdStmt = 51 - EarthParserRULE_entrypointStmt = 52 - EarthParserRULE_exposeStmt = 53 - EarthParserRULE_volumeStmt = 54 - EarthParserRULE_envStmt = 55 - EarthParserRULE_argStmt = 56 - EarthParserRULE_setStmt = 57 - EarthParserRULE_letStmt = 58 - EarthParserRULE_optionalFlag = 59 - EarthParserRULE_envArgKey = 60 - EarthParserRULE_envArgValue = 61 - EarthParserRULE_labelStmt = 62 - EarthParserRULE_labelKey = 63 - EarthParserRULE_labelValue = 64 - EarthParserRULE_gitCloneStmt = 65 - EarthParserRULE_addStmt = 66 - EarthParserRULE_stopsignalStmt = 67 - EarthParserRULE_onbuildStmt = 68 - EarthParserRULE_healthcheckStmt = 69 - EarthParserRULE_shellStmt = 70 - EarthParserRULE_userCommandStmt = 71 - EarthParserRULE_doStmt = 72 - EarthParserRULE_importStmt = 73 - EarthParserRULE_cacheStmt = 74 - EarthParserRULE_hostStmt = 75 - EarthParserRULE_projectStmt = 76 - EarthParserRULE_pipelineStmt = 77 - EarthParserRULE_triggerStmt = 78 - EarthParserRULE_expr = 79 - EarthParserRULE_stmtWordsMaybeJSON = 80 - EarthParserRULE_stmtWords = 81 - EarthParserRULE_stmtWord = 82 + EarthParserRULE_function = 7 + EarthParserRULE_functionHeader = 8 + EarthParserRULE_stmts = 9 + EarthParserRULE_stmt = 10 + EarthParserRULE_commandStmt = 11 + EarthParserRULE_version = 12 + EarthParserRULE_withStmt = 13 + EarthParserRULE_withBlock = 14 + EarthParserRULE_withExpr = 15 + EarthParserRULE_withCommand = 16 + EarthParserRULE_dockerCommand = 17 + EarthParserRULE_ifStmt = 18 + EarthParserRULE_ifClause = 19 + EarthParserRULE_ifBlock = 20 + EarthParserRULE_elseIfClause = 21 + EarthParserRULE_elseIfBlock = 22 + EarthParserRULE_elseClause = 23 + EarthParserRULE_elseBlock = 24 + EarthParserRULE_ifExpr = 25 + EarthParserRULE_elseIfExpr = 26 + EarthParserRULE_tryStmt = 27 + EarthParserRULE_tryClause = 28 + EarthParserRULE_tryBlock = 29 + EarthParserRULE_catchClause = 30 + EarthParserRULE_catchBlock = 31 + EarthParserRULE_finallyClause = 32 + EarthParserRULE_finallyBlock = 33 + EarthParserRULE_forStmt = 34 + EarthParserRULE_forClause = 35 + EarthParserRULE_forBlock = 36 + EarthParserRULE_forExpr = 37 + EarthParserRULE_waitStmt = 38 + EarthParserRULE_waitClause = 39 + EarthParserRULE_waitBlock = 40 + EarthParserRULE_waitExpr = 41 + EarthParserRULE_fromStmt = 42 + EarthParserRULE_fromDockerfileStmt = 43 + EarthParserRULE_locallyStmt = 44 + EarthParserRULE_copyStmt = 45 + EarthParserRULE_saveStmt = 46 + EarthParserRULE_saveImage = 47 + EarthParserRULE_saveArtifact = 48 + EarthParserRULE_runStmt = 49 + EarthParserRULE_buildStmt = 50 + EarthParserRULE_workdirStmt = 51 + EarthParserRULE_userStmt = 52 + EarthParserRULE_cmdStmt = 53 + EarthParserRULE_entrypointStmt = 54 + EarthParserRULE_exposeStmt = 55 + EarthParserRULE_volumeStmt = 56 + EarthParserRULE_envStmt = 57 + EarthParserRULE_argStmt = 58 + EarthParserRULE_setStmt = 59 + EarthParserRULE_letStmt = 60 + EarthParserRULE_optionalFlag = 61 + EarthParserRULE_envArgKey = 62 + EarthParserRULE_envArgValue = 63 + EarthParserRULE_labelStmt = 64 + EarthParserRULE_labelKey = 65 + EarthParserRULE_labelValue = 66 + EarthParserRULE_gitCloneStmt = 67 + EarthParserRULE_addStmt = 68 + EarthParserRULE_stopsignalStmt = 69 + EarthParserRULE_onbuildStmt = 70 + EarthParserRULE_healthcheckStmt = 71 + EarthParserRULE_shellStmt = 72 + EarthParserRULE_userCommandStmt = 73 + EarthParserRULE_functionStmt = 74 + EarthParserRULE_doStmt = 75 + EarthParserRULE_importStmt = 76 + EarthParserRULE_cacheStmt = 77 + EarthParserRULE_hostStmt = 78 + EarthParserRULE_projectStmt = 79 + EarthParserRULE_pipelineStmt = 80 + EarthParserRULE_triggerStmt = 81 + EarthParserRULE_expr = 82 + EarthParserRULE_stmtWordsMaybeJSON = 83 + EarthParserRULE_stmtWords = 84 + EarthParserRULE_stmtWord = 85 ) // IEarthFileContext is an interface to support dynamic dispatch. @@ -739,98 +761,98 @@ func (p *EarthParser) EarthFile() (localctx IEarthFileContext) { var _alt int p.EnterOuterAlt(localctx, 1) - p.SetState(169) + p.SetState(175) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 0, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(166) + p.SetState(172) p.Match(EarthParserNL) } } - p.SetState(171) + p.SetState(177) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 0, p.GetParserRuleContext()) } - p.SetState(173) + p.SetState(179) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserVERSION { { - p.SetState(172) + p.SetState(178) p.Version() } } - p.SetState(178) + p.SetState(184) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) - if ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 34076270526432) != 0) { + if ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 136305082105792) != 0) { { - p.SetState(175) + p.SetState(181) p.Stmts() } { - p.SetState(176) + p.SetState(182) p.Match(EarthParserNL) } } - p.SetState(183) + p.SetState(189) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 3, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(180) + p.SetState(186) p.Match(EarthParserNL) } } - p.SetState(185) + p.SetState(191) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 3, p.GetParserRuleContext()) } - p.SetState(187) + p.SetState(193) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserTarget || _la == EarthParserUserCommand { { - p.SetState(186) + p.SetState(192) p.Targets() } } - p.SetState(192) + p.SetState(198) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == EarthParserNL { { - p.SetState(189) + p.SetState(195) p.Match(EarthParserNL) } - p.SetState(194) + p.SetState(200) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(195) + p.SetState(201) p.Match(EarthParserEOF) } @@ -986,39 +1008,39 @@ func (p *EarthParser) Targets() (localctx ITargetsContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(197) + p.SetState(203) p.TargetOrUserCommand() } - p.SetState(207) + p.SetState(213) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 7, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { - p.SetState(201) + p.SetState(207) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == EarthParserNL { { - p.SetState(198) + p.SetState(204) p.Match(EarthParserNL) } - p.SetState(203) + p.SetState(209) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(204) + p.SetState(210) p.TargetOrUserCommand() } } - p.SetState(209) + p.SetState(215) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 7, p.GetParserRuleContext()) } @@ -1150,14 +1172,14 @@ func (p *EarthParser) TargetOrUserCommand() (localctx ITargetOrUserCommandContex } }() - p.SetState(212) + p.SetState(218) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case EarthParserTarget: p.EnterOuterAlt(localctx, 1) { - p.SetState(210) + p.SetState(216) p.Target() } @@ -1165,7 +1187,7 @@ func (p *EarthParser) TargetOrUserCommand() (localctx ITargetOrUserCommandContex case EarthParserUserCommand: p.EnterOuterAlt(localctx, 2) { - p.SetState(211) + p.SetState(217) p.UserCommand() } @@ -1327,17 +1349,17 @@ func (p *EarthParser) Target() (localctx ITargetContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(214) + p.SetState(220) p.TargetHeader() } - p.SetState(216) + p.SetState(222) p.GetErrorHandler().Sync(p) _alt = 1 for ok := true; ok; ok = _alt != 2 && _alt != antlr.ATNInvalidAltNumber { switch _alt { case 1: { - p.SetState(215) + p.SetState(221) p.Match(EarthParserNL) } @@ -1348,67 +1370,67 @@ func (p *EarthParser) Target() (localctx ITargetContext) { panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) } - p.SetState(218) + p.SetState(224) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 9, p.GetParserRuleContext()) } - p.SetState(236) + p.SetState(242) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserINDENT { { - p.SetState(220) + p.SetState(226) p.Match(EarthParserINDENT) } - p.SetState(224) + p.SetState(230) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 10, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(221) + p.SetState(227) p.Match(EarthParserNL) } } - p.SetState(226) + p.SetState(232) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 10, p.GetParserRuleContext()) } - p.SetState(228) + p.SetState(234) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) - if ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 34076270526432) != 0) { + if ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 136305082105792) != 0) { { - p.SetState(227) + p.SetState(233) p.Stmts() } } - p.SetState(231) + p.SetState(237) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(230) + p.SetState(236) p.Match(EarthParserNL) } - p.SetState(233) + p.SetState(239) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(235) + p.SetState(241) p.Match(EarthParserDEDENT) } @@ -1514,7 +1536,7 @@ func (p *EarthParser) TargetHeader() (localctx ITargetHeaderContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(238) + p.SetState(244) p.Match(EarthParserTarget) } @@ -1671,17 +1693,17 @@ func (p *EarthParser) UserCommand() (localctx IUserCommandContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(240) + p.SetState(246) p.UserCommandHeader() } - p.SetState(242) + p.SetState(248) p.GetErrorHandler().Sync(p) _alt = 1 for ok := true; ok; ok = _alt != 2 && _alt != antlr.ATNInvalidAltNumber { switch _alt { case 1: { - p.SetState(241) + p.SetState(247) p.Match(EarthParserNL) } @@ -1692,58 +1714,58 @@ func (p *EarthParser) UserCommand() (localctx IUserCommandContext) { panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) } - p.SetState(244) + p.SetState(250) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 14, p.GetParserRuleContext()) } - p.SetState(261) + p.SetState(267) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserINDENT { { - p.SetState(246) + p.SetState(252) p.Match(EarthParserINDENT) } - p.SetState(250) + p.SetState(256) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == EarthParserNL { { - p.SetState(247) + p.SetState(253) p.Match(EarthParserNL) } - p.SetState(252) + p.SetState(258) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(253) + p.SetState(259) p.Stmts() } - p.SetState(255) + p.SetState(261) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(254) + p.SetState(260) p.Match(EarthParserNL) } - p.SetState(257) + p.SetState(263) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(259) + p.SetState(265) p.Match(EarthParserDEDENT) } @@ -1849,7 +1871,7 @@ func (p *EarthParser) UserCommandHeader() (localctx IUserCommandHeaderContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(263) + p.SetState(269) p.Match(EarthParserUserCommand) } @@ -1859,6 +1881,333 @@ func (p *EarthParser) UserCommandHeader() (localctx IUserCommandHeaderContext) { } +// IFunctionContext is an interface to support dynamic dispatch. +type IFunctionContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + FunctionHeader() IFunctionHeaderContext + AllNL() []antlr.TerminalNode + NL(i int) antlr.TerminalNode + INDENT() antlr.TerminalNode + Stmts() IStmtsContext + DEDENT() antlr.TerminalNode + + // IsFunctionContext differentiates from other interfaces. + IsFunctionContext() +} + +type FunctionContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyFunctionContext() *FunctionContext { + var p = new(FunctionContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = EarthParserRULE_function + return p +} + +func (*FunctionContext) IsFunctionContext() {} + +func NewFunctionContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *FunctionContext { + var p = new(FunctionContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = EarthParserRULE_function + + return p +} + +func (s *FunctionContext) GetParser() antlr.Parser { return s.parser } + +func (s *FunctionContext) FunctionHeader() IFunctionHeaderContext { + var t antlr.RuleContext; + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IFunctionHeaderContext); ok { + t = ctx.(antlr.RuleContext); + break + } + } + + if t == nil { + return nil + } + + return t.(IFunctionHeaderContext) +} + +func (s *FunctionContext) AllNL() []antlr.TerminalNode { + return s.GetTokens(EarthParserNL) +} + +func (s *FunctionContext) NL(i int) antlr.TerminalNode { + return s.GetToken(EarthParserNL, i) +} + +func (s *FunctionContext) INDENT() antlr.TerminalNode { + return s.GetToken(EarthParserINDENT, 0) +} + +func (s *FunctionContext) Stmts() IStmtsContext { + var t antlr.RuleContext; + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IStmtsContext); ok { + t = ctx.(antlr.RuleContext); + break + } + } + + if t == nil { + return nil + } + + return t.(IStmtsContext) +} + +func (s *FunctionContext) DEDENT() antlr.TerminalNode { + return s.GetToken(EarthParserDEDENT, 0) +} + +func (s *FunctionContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *FunctionContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + + +func (s *FunctionContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(EarthParserListener); ok { + listenerT.EnterFunction(s) + } +} + +func (s *FunctionContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(EarthParserListener); ok { + listenerT.ExitFunction(s) + } +} + + + + +func (p *EarthParser) Function() (localctx IFunctionContext) { + this := p + _ = this + + localctx = NewFunctionContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 14, EarthParserRULE_function) + var _la int + + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(271) + p.FunctionHeader() + } + p.SetState(273) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + + for ok := true; ok; ok = _la == EarthParserNL { + { + p.SetState(272) + p.Match(EarthParserNL) + } + + + p.SetState(275) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + } + p.SetState(292) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + + if _la == EarthParserINDENT { + { + p.SetState(277) + p.Match(EarthParserINDENT) + } + p.SetState(281) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + + for _la == EarthParserNL { + { + p.SetState(278) + p.Match(EarthParserNL) + } + + + p.SetState(283) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(284) + p.Stmts() + } + p.SetState(286) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + + for ok := true; ok; ok = _la == EarthParserNL { + { + p.SetState(285) + p.Match(EarthParserNL) + } + + + p.SetState(288) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(290) + p.Match(EarthParserDEDENT) + } + + } + + + + return localctx +} + + +// IFunctionHeaderContext is an interface to support dynamic dispatch. +type IFunctionHeaderContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + Function() antlr.TerminalNode + + // IsFunctionHeaderContext differentiates from other interfaces. + IsFunctionHeaderContext() +} + +type FunctionHeaderContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyFunctionHeaderContext() *FunctionHeaderContext { + var p = new(FunctionHeaderContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = EarthParserRULE_functionHeader + return p +} + +func (*FunctionHeaderContext) IsFunctionHeaderContext() {} + +func NewFunctionHeaderContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *FunctionHeaderContext { + var p = new(FunctionHeaderContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = EarthParserRULE_functionHeader + + return p +} + +func (s *FunctionHeaderContext) GetParser() antlr.Parser { return s.parser } + +func (s *FunctionHeaderContext) Function() antlr.TerminalNode { + return s.GetToken(EarthParserFunction, 0) +} + +func (s *FunctionHeaderContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *FunctionHeaderContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + + +func (s *FunctionHeaderContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(EarthParserListener); ok { + listenerT.EnterFunctionHeader(s) + } +} + +func (s *FunctionHeaderContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(EarthParserListener); ok { + listenerT.ExitFunctionHeader(s) + } +} + + + + +func (p *EarthParser) FunctionHeader() (localctx IFunctionHeaderContext) { + this := p + _ = this + + localctx = NewFunctionHeaderContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 16, EarthParserRULE_functionHeader) + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(294) + p.Match(EarthParserFunction) + } + + + + return localctx +} + + // IStmtsContext is an interface to support dynamic dispatch. type IStmtsContext interface { antlr.ParserRuleContext @@ -1981,7 +2330,7 @@ func (p *EarthParser) Stmts() (localctx IStmtsContext) { _ = this localctx = NewStmtsContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 14, EarthParserRULE_stmts) + p.EnterRule(localctx, 18, EarthParserRULE_stmts) var _la int @@ -2005,41 +2354,41 @@ func (p *EarthParser) Stmts() (localctx IStmtsContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(265) + p.SetState(296) p.Stmt() } - p.SetState(274) + p.SetState(305) p.GetErrorHandler().Sync(p) - _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 19, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 23, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { - p.SetState(267) + p.SetState(298) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(266) + p.SetState(297) p.Match(EarthParserNL) } - p.SetState(269) + p.SetState(300) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(271) + p.SetState(302) p.Stmt() } } - p.SetState(276) + p.SetState(307) p.GetErrorHandler().Sync(p) - _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 19, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 23, p.GetParserRuleContext()) } @@ -2219,7 +2568,7 @@ func (p *EarthParser) Stmt() (localctx IStmtContext) { _ = this localctx = NewStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 16, EarthParserRULE_stmt) + p.EnterRule(localctx, 20, EarthParserRULE_stmt) defer func() { p.ExitRule() @@ -2237,14 +2586,14 @@ func (p *EarthParser) Stmt() (localctx IStmtContext) { } }() - p.SetState(283) + p.SetState(314) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { - case EarthParserFROM, EarthParserFROM_DOCKERFILE, EarthParserLOCALLY, EarthParserCOPY, EarthParserSAVE_ARTIFACT, EarthParserSAVE_IMAGE, EarthParserRUN, EarthParserEXPOSE, EarthParserVOLUME, EarthParserENV, EarthParserARG, EarthParserSET, EarthParserLET, EarthParserLABEL, EarthParserBUILD, EarthParserWORKDIR, EarthParserUSER, EarthParserCMD, EarthParserENTRYPOINT, EarthParserGIT_CLONE, EarthParserADD, EarthParserSTOPSIGNAL, EarthParserONBUILD, EarthParserHEALTHCHECK, EarthParserSHELL, EarthParserDO, EarthParserCOMMAND, EarthParserIMPORT, EarthParserCACHE, EarthParserHOST, EarthParserPROJECT, EarthParserPIPELINE, EarthParserTRIGGER: + case EarthParserFROM, EarthParserFROM_DOCKERFILE, EarthParserLOCALLY, EarthParserCOPY, EarthParserSAVE_ARTIFACT, EarthParserSAVE_IMAGE, EarthParserRUN, EarthParserEXPOSE, EarthParserVOLUME, EarthParserENV, EarthParserARG, EarthParserSET, EarthParserLET, EarthParserLABEL, EarthParserBUILD, EarthParserWORKDIR, EarthParserUSER, EarthParserCMD, EarthParserENTRYPOINT, EarthParserGIT_CLONE, EarthParserADD, EarthParserSTOPSIGNAL, EarthParserONBUILD, EarthParserHEALTHCHECK, EarthParserSHELL, EarthParserDO, EarthParserCOMMAND, EarthParserFUNCTION, EarthParserIMPORT, EarthParserCACHE, EarthParserHOST, EarthParserPROJECT, EarthParserPIPELINE, EarthParserTRIGGER: p.EnterOuterAlt(localctx, 1) { - p.SetState(277) + p.SetState(308) p.CommandStmt() } @@ -2252,7 +2601,7 @@ func (p *EarthParser) Stmt() (localctx IStmtContext) { case EarthParserWITH: p.EnterOuterAlt(localctx, 2) { - p.SetState(278) + p.SetState(309) p.WithStmt() } @@ -2260,7 +2609,7 @@ func (p *EarthParser) Stmt() (localctx IStmtContext) { case EarthParserIF: p.EnterOuterAlt(localctx, 3) { - p.SetState(279) + p.SetState(310) p.IfStmt() } @@ -2268,7 +2617,7 @@ func (p *EarthParser) Stmt() (localctx IStmtContext) { case EarthParserFOR: p.EnterOuterAlt(localctx, 4) { - p.SetState(280) + p.SetState(311) p.ForStmt() } @@ -2276,7 +2625,7 @@ func (p *EarthParser) Stmt() (localctx IStmtContext) { case EarthParserWAIT: p.EnterOuterAlt(localctx, 5) { - p.SetState(281) + p.SetState(312) p.WaitStmt() } @@ -2284,7 +2633,7 @@ func (p *EarthParser) Stmt() (localctx IStmtContext) { case EarthParserTRY: p.EnterOuterAlt(localctx, 6) { - p.SetState(282) + p.SetState(313) p.TryStmt() } @@ -2332,6 +2681,7 @@ type ICommandStmtContext interface { HealthcheckStmt() IHealthcheckStmtContext ShellStmt() IShellStmtContext UserCommandStmt() IUserCommandStmtContext + FunctionStmt() IFunctionStmtContext DoStmt() IDoStmtContext ImportStmt() IImportStmtContext CacheStmt() ICacheStmtContext @@ -2771,6 +3121,22 @@ func (s *CommandStmtContext) UserCommandStmt() IUserCommandStmtContext { return t.(IUserCommandStmtContext) } +func (s *CommandStmtContext) FunctionStmt() IFunctionStmtContext { + var t antlr.RuleContext; + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IFunctionStmtContext); ok { + t = ctx.(antlr.RuleContext); + break + } + } + + if t == nil { + return nil + } + + return t.(IFunctionStmtContext) +} + func (s *CommandStmtContext) DoStmt() IDoStmtContext { var t antlr.RuleContext; for _, ctx := range s.GetChildren() { @@ -2912,7 +3278,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { _ = this localctx = NewCommandStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 18, EarthParserRULE_commandStmt) + p.EnterRule(localctx, 22, EarthParserRULE_commandStmt) defer func() { p.ExitRule() @@ -2930,14 +3296,14 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { } }() - p.SetState(317) + p.SetState(349) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case EarthParserFROM: p.EnterOuterAlt(localctx, 1) { - p.SetState(285) + p.SetState(316) p.FromStmt() } @@ -2945,7 +3311,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserFROM_DOCKERFILE: p.EnterOuterAlt(localctx, 2) { - p.SetState(286) + p.SetState(317) p.FromDockerfileStmt() } @@ -2953,7 +3319,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserLOCALLY: p.EnterOuterAlt(localctx, 3) { - p.SetState(287) + p.SetState(318) p.LocallyStmt() } @@ -2961,7 +3327,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserCOPY: p.EnterOuterAlt(localctx, 4) { - p.SetState(288) + p.SetState(319) p.CopyStmt() } @@ -2969,7 +3335,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserSAVE_ARTIFACT, EarthParserSAVE_IMAGE: p.EnterOuterAlt(localctx, 5) { - p.SetState(289) + p.SetState(320) p.SaveStmt() } @@ -2977,7 +3343,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserRUN: p.EnterOuterAlt(localctx, 6) { - p.SetState(290) + p.SetState(321) p.RunStmt() } @@ -2985,7 +3351,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserBUILD: p.EnterOuterAlt(localctx, 7) { - p.SetState(291) + p.SetState(322) p.BuildStmt() } @@ -2993,7 +3359,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserWORKDIR: p.EnterOuterAlt(localctx, 8) { - p.SetState(292) + p.SetState(323) p.WorkdirStmt() } @@ -3001,7 +3367,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserUSER: p.EnterOuterAlt(localctx, 9) { - p.SetState(293) + p.SetState(324) p.UserStmt() } @@ -3009,7 +3375,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserCMD: p.EnterOuterAlt(localctx, 10) { - p.SetState(294) + p.SetState(325) p.CmdStmt() } @@ -3017,7 +3383,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserENTRYPOINT: p.EnterOuterAlt(localctx, 11) { - p.SetState(295) + p.SetState(326) p.EntrypointStmt() } @@ -3025,7 +3391,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserEXPOSE: p.EnterOuterAlt(localctx, 12) { - p.SetState(296) + p.SetState(327) p.ExposeStmt() } @@ -3033,7 +3399,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserVOLUME: p.EnterOuterAlt(localctx, 13) { - p.SetState(297) + p.SetState(328) p.VolumeStmt() } @@ -3041,7 +3407,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserENV: p.EnterOuterAlt(localctx, 14) { - p.SetState(298) + p.SetState(329) p.EnvStmt() } @@ -3049,7 +3415,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserARG: p.EnterOuterAlt(localctx, 15) { - p.SetState(299) + p.SetState(330) p.ArgStmt() } @@ -3057,7 +3423,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserSET: p.EnterOuterAlt(localctx, 16) { - p.SetState(300) + p.SetState(331) p.SetStmt() } @@ -3065,7 +3431,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserLET: p.EnterOuterAlt(localctx, 17) { - p.SetState(301) + p.SetState(332) p.LetStmt() } @@ -3073,7 +3439,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserLABEL: p.EnterOuterAlt(localctx, 18) { - p.SetState(302) + p.SetState(333) p.LabelStmt() } @@ -3081,7 +3447,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserGIT_CLONE: p.EnterOuterAlt(localctx, 19) { - p.SetState(303) + p.SetState(334) p.GitCloneStmt() } @@ -3089,7 +3455,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserADD: p.EnterOuterAlt(localctx, 20) { - p.SetState(304) + p.SetState(335) p.AddStmt() } @@ -3097,7 +3463,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserSTOPSIGNAL: p.EnterOuterAlt(localctx, 21) { - p.SetState(305) + p.SetState(336) p.StopsignalStmt() } @@ -3105,7 +3471,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserONBUILD: p.EnterOuterAlt(localctx, 22) { - p.SetState(306) + p.SetState(337) p.OnbuildStmt() } @@ -3113,7 +3479,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserHEALTHCHECK: p.EnterOuterAlt(localctx, 23) { - p.SetState(307) + p.SetState(338) p.HealthcheckStmt() } @@ -3121,7 +3487,7 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserSHELL: p.EnterOuterAlt(localctx, 24) { - p.SetState(308) + p.SetState(339) p.ShellStmt() } @@ -3129,63 +3495,71 @@ func (p *EarthParser) CommandStmt() (localctx ICommandStmtContext) { case EarthParserCOMMAND: p.EnterOuterAlt(localctx, 25) { - p.SetState(309) + p.SetState(340) p.UserCommandStmt() } - case EarthParserDO: + case EarthParserFUNCTION: p.EnterOuterAlt(localctx, 26) { - p.SetState(310) + p.SetState(341) + p.FunctionStmt() + } + + + case EarthParserDO: + p.EnterOuterAlt(localctx, 27) + { + p.SetState(342) p.DoStmt() } case EarthParserIMPORT: - p.EnterOuterAlt(localctx, 27) + p.EnterOuterAlt(localctx, 28) { - p.SetState(311) + p.SetState(343) p.ImportStmt() } case EarthParserCACHE: - p.EnterOuterAlt(localctx, 28) + p.EnterOuterAlt(localctx, 29) { - p.SetState(312) + p.SetState(344) p.CacheStmt() } case EarthParserHOST: - p.EnterOuterAlt(localctx, 29) + p.EnterOuterAlt(localctx, 30) { - p.SetState(313) + p.SetState(345) p.HostStmt() } case EarthParserPROJECT: - p.EnterOuterAlt(localctx, 30) + p.EnterOuterAlt(localctx, 31) { - p.SetState(314) + p.SetState(346) p.ProjectStmt() } case EarthParserPIPELINE: - p.EnterOuterAlt(localctx, 31) + p.EnterOuterAlt(localctx, 32) { - p.SetState(315) + p.SetState(347) p.PipelineStmt() } case EarthParserTRIGGER: - p.EnterOuterAlt(localctx, 32) + p.EnterOuterAlt(localctx, 33) { - p.SetState(316) + p.SetState(348) p.TriggerStmt() } @@ -3301,7 +3675,7 @@ func (p *EarthParser) Version() (localctx IVersionContext) { _ = this localctx = NewVersionContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 20, EarthParserRULE_version) + p.EnterRule(localctx, 24, EarthParserRULE_version) defer func() { p.ExitRule() @@ -3323,21 +3697,21 @@ func (p *EarthParser) Version() (localctx IVersionContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(319) + p.SetState(351) p.Match(EarthParserVERSION) } { - p.SetState(320) + p.SetState(352) p.StmtWords() } - p.SetState(322) + p.SetState(354) p.GetErrorHandler().Sync(p) _alt = 1 for ok := true; ok; ok = _alt != 2 && _alt != antlr.ATNInvalidAltNumber { switch _alt { case 1: { - p.SetState(321) + p.SetState(353) p.Match(EarthParserNL) } @@ -3348,9 +3722,9 @@ func (p *EarthParser) Version() (localctx IVersionContext) { panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) } - p.SetState(324) + p.SetState(356) p.GetErrorHandler().Sync(p) - _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 22, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 26, p.GetParserRuleContext()) } @@ -3477,7 +3851,7 @@ func (p *EarthParser) WithStmt() (localctx IWithStmtContext) { _ = this localctx = NewWithStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 22, EarthParserRULE_withStmt) + p.EnterRule(localctx, 26, EarthParserRULE_withStmt) var _la int @@ -3499,55 +3873,55 @@ func (p *EarthParser) WithStmt() (localctx IWithStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(326) + p.SetState(358) p.WithExpr() } - p.SetState(333) + p.SetState(365) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 24, p.GetParserRuleContext()) == 1 { - p.SetState(328) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 28, p.GetParserRuleContext()) == 1 { + p.SetState(360) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(327) + p.SetState(359) p.Match(EarthParserNL) } - p.SetState(330) + p.SetState(362) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(332) + p.SetState(364) p.WithBlock() } } - p.SetState(336) + p.SetState(368) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(335) + p.SetState(367) p.Match(EarthParserNL) } - p.SetState(338) + p.SetState(370) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(340) + p.SetState(372) p.Match(EarthParserEND) } @@ -3643,7 +4017,7 @@ func (p *EarthParser) WithBlock() (localctx IWithBlockContext) { _ = this localctx = NewWithBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 24, EarthParserRULE_withBlock) + p.EnterRule(localctx, 28, EarthParserRULE_withBlock) defer func() { p.ExitRule() @@ -3663,7 +4037,7 @@ func (p *EarthParser) WithBlock() (localctx IWithBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(342) + p.SetState(374) p.Stmts() } @@ -3764,7 +4138,7 @@ func (p *EarthParser) WithExpr() (localctx IWithExprContext) { _ = this localctx = NewWithExprContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 26, EarthParserRULE_withExpr) + p.EnterRule(localctx, 30, EarthParserRULE_withExpr) defer func() { p.ExitRule() @@ -3784,11 +4158,11 @@ func (p *EarthParser) WithExpr() (localctx IWithExprContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(344) + p.SetState(376) p.Match(EarthParserWITH) } { - p.SetState(345) + p.SetState(377) p.WithCommand() } @@ -3884,7 +4258,7 @@ func (p *EarthParser) WithCommand() (localctx IWithCommandContext) { _ = this localctx = NewWithCommandContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 28, EarthParserRULE_withCommand) + p.EnterRule(localctx, 32, EarthParserRULE_withCommand) defer func() { p.ExitRule() @@ -3904,7 +4278,7 @@ func (p *EarthParser) WithCommand() (localctx IWithCommandContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(347) + p.SetState(379) p.DockerCommand() } @@ -4005,7 +4379,7 @@ func (p *EarthParser) DockerCommand() (localctx IDockerCommandContext) { _ = this localctx = NewDockerCommandContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 30, EarthParserRULE_dockerCommand) + p.EnterRule(localctx, 34, EarthParserRULE_dockerCommand) var _la int @@ -4027,17 +4401,17 @@ func (p *EarthParser) DockerCommand() (localctx IDockerCommandContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(349) + p.SetState(381) p.Match(EarthParserDOCKER) } - p.SetState(351) + p.SetState(383) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(350) + p.SetState(382) p.StmtWords() } @@ -4210,7 +4584,7 @@ func (p *EarthParser) IfStmt() (localctx IIfStmtContext) { _ = this localctx = NewIfStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 32, EarthParserRULE_ifStmt) + p.EnterRule(localctx, 36, EarthParserRULE_ifStmt) var _la int @@ -4234,88 +4608,88 @@ func (p *EarthParser) IfStmt() (localctx IIfStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(353) + p.SetState(385) p.IfClause() } - p.SetState(362) + p.SetState(394) p.GetErrorHandler().Sync(p) - _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 28, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 32, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { - p.SetState(355) + p.SetState(387) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(354) + p.SetState(386) p.Match(EarthParserNL) } - p.SetState(357) + p.SetState(389) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(359) + p.SetState(391) p.ElseIfClause() } } - p.SetState(364) + p.SetState(396) p.GetErrorHandler().Sync(p) - _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 28, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 32, p.GetParserRuleContext()) } - p.SetState(371) + p.SetState(403) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 30, p.GetParserRuleContext()) == 1 { - p.SetState(366) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 34, p.GetParserRuleContext()) == 1 { + p.SetState(398) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(365) + p.SetState(397) p.Match(EarthParserNL) } - p.SetState(368) + p.SetState(400) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(370) + p.SetState(402) p.ElseClause() } } - p.SetState(374) + p.SetState(406) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(373) + p.SetState(405) p.Match(EarthParserNL) } - p.SetState(376) + p.SetState(408) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(378) + p.SetState(410) p.Match(EarthParserEND) } @@ -4443,7 +4817,7 @@ func (p *EarthParser) IfClause() (localctx IIfClauseContext) { _ = this localctx = NewIfClauseContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 34, EarthParserRULE_ifClause) + p.EnterRule(localctx, 38, EarthParserRULE_ifClause) var _la int @@ -4465,36 +4839,36 @@ func (p *EarthParser) IfClause() (localctx IIfClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(380) + p.SetState(412) p.Match(EarthParserIF) } { - p.SetState(381) + p.SetState(413) p.IfExpr() } - p.SetState(388) + p.SetState(420) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 33, p.GetParserRuleContext()) == 1 { - p.SetState(383) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 37, p.GetParserRuleContext()) == 1 { + p.SetState(415) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(382) + p.SetState(414) p.Match(EarthParserNL) } - p.SetState(385) + p.SetState(417) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(387) + p.SetState(419) p.IfBlock() } @@ -4593,7 +4967,7 @@ func (p *EarthParser) IfBlock() (localctx IIfBlockContext) { _ = this localctx = NewIfBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 36, EarthParserRULE_ifBlock) + p.EnterRule(localctx, 40, EarthParserRULE_ifBlock) defer func() { p.ExitRule() @@ -4613,7 +4987,7 @@ func (p *EarthParser) IfBlock() (localctx IIfBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(390) + p.SetState(422) p.Stmts() } @@ -4741,7 +5115,7 @@ func (p *EarthParser) ElseIfClause() (localctx IElseIfClauseContext) { _ = this localctx = NewElseIfClauseContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 38, EarthParserRULE_elseIfClause) + p.EnterRule(localctx, 42, EarthParserRULE_elseIfClause) var _la int @@ -4763,36 +5137,36 @@ func (p *EarthParser) ElseIfClause() (localctx IElseIfClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(392) + p.SetState(424) p.Match(EarthParserELSE_IF) } { - p.SetState(393) + p.SetState(425) p.ElseIfExpr() } - p.SetState(400) + p.SetState(432) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 35, p.GetParserRuleContext()) == 1 { - p.SetState(395) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 39, p.GetParserRuleContext()) == 1 { + p.SetState(427) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(394) + p.SetState(426) p.Match(EarthParserNL) } - p.SetState(397) + p.SetState(429) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(399) + p.SetState(431) p.ElseIfBlock() } @@ -4891,7 +5265,7 @@ func (p *EarthParser) ElseIfBlock() (localctx IElseIfBlockContext) { _ = this localctx = NewElseIfBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 40, EarthParserRULE_elseIfBlock) + p.EnterRule(localctx, 44, EarthParserRULE_elseIfBlock) defer func() { p.ExitRule() @@ -4911,7 +5285,7 @@ func (p *EarthParser) ElseIfBlock() (localctx IElseIfBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(402) + p.SetState(434) p.Stmts() } @@ -5022,7 +5396,7 @@ func (p *EarthParser) ElseClause() (localctx IElseClauseContext) { _ = this localctx = NewElseClauseContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 42, EarthParserRULE_elseClause) + p.EnterRule(localctx, 46, EarthParserRULE_elseClause) var _la int @@ -5044,32 +5418,32 @@ func (p *EarthParser) ElseClause() (localctx IElseClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(404) + p.SetState(436) p.Match(EarthParserELSE) } - p.SetState(411) + p.SetState(443) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 37, p.GetParserRuleContext()) == 1 { - p.SetState(406) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 41, p.GetParserRuleContext()) == 1 { + p.SetState(438) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(405) + p.SetState(437) p.Match(EarthParserNL) } - p.SetState(408) + p.SetState(440) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(410) + p.SetState(442) p.ElseBlock() } @@ -5168,7 +5542,7 @@ func (p *EarthParser) ElseBlock() (localctx IElseBlockContext) { _ = this localctx = NewElseBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 44, EarthParserRULE_elseBlock) + p.EnterRule(localctx, 48, EarthParserRULE_elseBlock) defer func() { p.ExitRule() @@ -5188,7 +5562,7 @@ func (p *EarthParser) ElseBlock() (localctx IElseBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(413) + p.SetState(445) p.Stmts() } @@ -5284,7 +5658,7 @@ func (p *EarthParser) IfExpr() (localctx IIfExprContext) { _ = this localctx = NewIfExprContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 46, EarthParserRULE_ifExpr) + p.EnterRule(localctx, 50, EarthParserRULE_ifExpr) defer func() { p.ExitRule() @@ -5304,7 +5678,7 @@ func (p *EarthParser) IfExpr() (localctx IIfExprContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(415) + p.SetState(447) p.Expr() } @@ -5400,7 +5774,7 @@ func (p *EarthParser) ElseIfExpr() (localctx IElseIfExprContext) { _ = this localctx = NewElseIfExprContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 48, EarthParserRULE_elseIfExpr) + p.EnterRule(localctx, 52, EarthParserRULE_elseIfExpr) defer func() { p.ExitRule() @@ -5420,7 +5794,7 @@ func (p *EarthParser) ElseIfExpr() (localctx IElseIfExprContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(417) + p.SetState(449) p.Expr() } @@ -5565,7 +5939,7 @@ func (p *EarthParser) TryStmt() (localctx ITryStmtContext) { _ = this localctx = NewTryStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 50, EarthParserRULE_tryStmt) + p.EnterRule(localctx, 54, EarthParserRULE_tryStmt) var _la int @@ -5587,83 +5961,83 @@ func (p *EarthParser) TryStmt() (localctx ITryStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(419) + p.SetState(451) p.TryClause() } - p.SetState(426) + p.SetState(458) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 39, p.GetParserRuleContext()) == 1 { - p.SetState(421) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 43, p.GetParserRuleContext()) == 1 { + p.SetState(453) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(420) + p.SetState(452) p.Match(EarthParserNL) } - p.SetState(423) + p.SetState(455) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(425) + p.SetState(457) p.CatchClause() } } - p.SetState(434) + p.SetState(466) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 41, p.GetParserRuleContext()) == 1 { - p.SetState(429) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 45, p.GetParserRuleContext()) == 1 { + p.SetState(461) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(428) + p.SetState(460) p.Match(EarthParserNL) } - p.SetState(431) + p.SetState(463) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(433) + p.SetState(465) p.FinallyClause() } } - p.SetState(437) + p.SetState(469) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(436) + p.SetState(468) p.Match(EarthParserNL) } - p.SetState(439) + p.SetState(471) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(441) + p.SetState(473) p.Match(EarthParserEND) } @@ -5774,7 +6148,7 @@ func (p *EarthParser) TryClause() (localctx ITryClauseContext) { _ = this localctx = NewTryClauseContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 52, EarthParserRULE_tryClause) + p.EnterRule(localctx, 56, EarthParserRULE_tryClause) var _la int @@ -5796,32 +6170,32 @@ func (p *EarthParser) TryClause() (localctx ITryClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(443) + p.SetState(475) p.Match(EarthParserTRY) } - p.SetState(450) + p.SetState(482) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 44, p.GetParserRuleContext()) == 1 { - p.SetState(445) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 48, p.GetParserRuleContext()) == 1 { + p.SetState(477) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(444) + p.SetState(476) p.Match(EarthParserNL) } - p.SetState(447) + p.SetState(479) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(449) + p.SetState(481) p.TryBlock() } @@ -5920,7 +6294,7 @@ func (p *EarthParser) TryBlock() (localctx ITryBlockContext) { _ = this localctx = NewTryBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 54, EarthParserRULE_tryBlock) + p.EnterRule(localctx, 58, EarthParserRULE_tryBlock) defer func() { p.ExitRule() @@ -5940,7 +6314,7 @@ func (p *EarthParser) TryBlock() (localctx ITryBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(452) + p.SetState(484) p.Stmts() } @@ -6051,7 +6425,7 @@ func (p *EarthParser) CatchClause() (localctx ICatchClauseContext) { _ = this localctx = NewCatchClauseContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 56, EarthParserRULE_catchClause) + p.EnterRule(localctx, 60, EarthParserRULE_catchClause) var _la int @@ -6073,32 +6447,32 @@ func (p *EarthParser) CatchClause() (localctx ICatchClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(454) + p.SetState(486) p.Match(EarthParserCATCH) } - p.SetState(461) + p.SetState(493) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 46, p.GetParserRuleContext()) == 1 { - p.SetState(456) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 50, p.GetParserRuleContext()) == 1 { + p.SetState(488) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(455) + p.SetState(487) p.Match(EarthParserNL) } - p.SetState(458) + p.SetState(490) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(460) + p.SetState(492) p.CatchBlock() } @@ -6197,7 +6571,7 @@ func (p *EarthParser) CatchBlock() (localctx ICatchBlockContext) { _ = this localctx = NewCatchBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 58, EarthParserRULE_catchBlock) + p.EnterRule(localctx, 62, EarthParserRULE_catchBlock) defer func() { p.ExitRule() @@ -6217,7 +6591,7 @@ func (p *EarthParser) CatchBlock() (localctx ICatchBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(463) + p.SetState(495) p.Stmts() } @@ -6328,7 +6702,7 @@ func (p *EarthParser) FinallyClause() (localctx IFinallyClauseContext) { _ = this localctx = NewFinallyClauseContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 60, EarthParserRULE_finallyClause) + p.EnterRule(localctx, 64, EarthParserRULE_finallyClause) var _la int @@ -6350,32 +6724,32 @@ func (p *EarthParser) FinallyClause() (localctx IFinallyClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(465) + p.SetState(497) p.Match(EarthParserFINALLY) } - p.SetState(472) + p.SetState(504) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 48, p.GetParserRuleContext()) == 1 { - p.SetState(467) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 52, p.GetParserRuleContext()) == 1 { + p.SetState(499) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(466) + p.SetState(498) p.Match(EarthParserNL) } - p.SetState(469) + p.SetState(501) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(471) + p.SetState(503) p.FinallyBlock() } @@ -6474,7 +6848,7 @@ func (p *EarthParser) FinallyBlock() (localctx IFinallyBlockContext) { _ = this localctx = NewFinallyBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 62, EarthParserRULE_finallyBlock) + p.EnterRule(localctx, 66, EarthParserRULE_finallyBlock) defer func() { p.ExitRule() @@ -6494,7 +6868,7 @@ func (p *EarthParser) FinallyBlock() (localctx IFinallyBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(474) + p.SetState(506) p.Stmts() } @@ -6605,7 +6979,7 @@ func (p *EarthParser) ForStmt() (localctx IForStmtContext) { _ = this localctx = NewForStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 64, EarthParserRULE_forStmt) + p.EnterRule(localctx, 68, EarthParserRULE_forStmt) var _la int @@ -6627,27 +7001,27 @@ func (p *EarthParser) ForStmt() (localctx IForStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(476) + p.SetState(508) p.ForClause() } - p.SetState(478) + p.SetState(510) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(477) + p.SetState(509) p.Match(EarthParserNL) } - p.SetState(480) + p.SetState(512) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(482) + p.SetState(514) p.Match(EarthParserEND) } @@ -6775,7 +7149,7 @@ func (p *EarthParser) ForClause() (localctx IForClauseContext) { _ = this localctx = NewForClauseContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 66, EarthParserRULE_forClause) + p.EnterRule(localctx, 70, EarthParserRULE_forClause) var _la int @@ -6797,36 +7171,36 @@ func (p *EarthParser) ForClause() (localctx IForClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(484) + p.SetState(516) p.Match(EarthParserFOR) } { - p.SetState(485) + p.SetState(517) p.ForExpr() } - p.SetState(492) + p.SetState(524) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 51, p.GetParserRuleContext()) == 1 { - p.SetState(487) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 55, p.GetParserRuleContext()) == 1 { + p.SetState(519) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(486) + p.SetState(518) p.Match(EarthParserNL) } - p.SetState(489) + p.SetState(521) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(491) + p.SetState(523) p.ForBlock() } @@ -6925,7 +7299,7 @@ func (p *EarthParser) ForBlock() (localctx IForBlockContext) { _ = this localctx = NewForBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 68, EarthParserRULE_forBlock) + p.EnterRule(localctx, 72, EarthParserRULE_forBlock) defer func() { p.ExitRule() @@ -6945,7 +7319,7 @@ func (p *EarthParser) ForBlock() (localctx IForBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(494) + p.SetState(526) p.Stmts() } @@ -7041,7 +7415,7 @@ func (p *EarthParser) ForExpr() (localctx IForExprContext) { _ = this localctx = NewForExprContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 70, EarthParserRULE_forExpr) + p.EnterRule(localctx, 74, EarthParserRULE_forExpr) defer func() { p.ExitRule() @@ -7061,7 +7435,7 @@ func (p *EarthParser) ForExpr() (localctx IForExprContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(496) + p.SetState(528) p.StmtWords() } @@ -7172,7 +7546,7 @@ func (p *EarthParser) WaitStmt() (localctx IWaitStmtContext) { _ = this localctx = NewWaitStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 72, EarthParserRULE_waitStmt) + p.EnterRule(localctx, 76, EarthParserRULE_waitStmt) var _la int @@ -7194,27 +7568,27 @@ func (p *EarthParser) WaitStmt() (localctx IWaitStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(498) + p.SetState(530) p.WaitClause() } - p.SetState(500) + p.SetState(532) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(499) + p.SetState(531) p.Match(EarthParserNL) } - p.SetState(502) + p.SetState(534) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(504) + p.SetState(536) p.Match(EarthParserEND) } @@ -7342,7 +7716,7 @@ func (p *EarthParser) WaitClause() (localctx IWaitClauseContext) { _ = this localctx = NewWaitClauseContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 74, EarthParserRULE_waitClause) + p.EnterRule(localctx, 78, EarthParserRULE_waitClause) var _la int @@ -7364,44 +7738,44 @@ func (p *EarthParser) WaitClause() (localctx IWaitClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(506) + p.SetState(538) p.Match(EarthParserWAIT) } - p.SetState(508) + p.SetState(540) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(507) + p.SetState(539) p.WaitExpr() } } - p.SetState(516) + p.SetState(548) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 55, p.GetParserRuleContext()) == 1 { - p.SetState(511) + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 59, p.GetParserRuleContext()) == 1 { + p.SetState(543) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for ok := true; ok; ok = _la == EarthParserNL { { - p.SetState(510) + p.SetState(542) p.Match(EarthParserNL) } - p.SetState(513) + p.SetState(545) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } { - p.SetState(515) + p.SetState(547) p.WaitBlock() } @@ -7500,7 +7874,7 @@ func (p *EarthParser) WaitBlock() (localctx IWaitBlockContext) { _ = this localctx = NewWaitBlockContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 76, EarthParserRULE_waitBlock) + p.EnterRule(localctx, 80, EarthParserRULE_waitBlock) defer func() { p.ExitRule() @@ -7520,7 +7894,7 @@ func (p *EarthParser) WaitBlock() (localctx IWaitBlockContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(518) + p.SetState(550) p.Stmts() } @@ -7616,7 +7990,7 @@ func (p *EarthParser) WaitExpr() (localctx IWaitExprContext) { _ = this localctx = NewWaitExprContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 78, EarthParserRULE_waitExpr) + p.EnterRule(localctx, 82, EarthParserRULE_waitExpr) defer func() { p.ExitRule() @@ -7636,7 +8010,7 @@ func (p *EarthParser) WaitExpr() (localctx IWaitExprContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(520) + p.SetState(552) p.StmtWords() } @@ -7737,7 +8111,7 @@ func (p *EarthParser) FromStmt() (localctx IFromStmtContext) { _ = this localctx = NewFromStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 80, EarthParserRULE_fromStmt) + p.EnterRule(localctx, 84, EarthParserRULE_fromStmt) var _la int @@ -7759,17 +8133,17 @@ func (p *EarthParser) FromStmt() (localctx IFromStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(522) + p.SetState(554) p.Match(EarthParserFROM) } - p.SetState(524) + p.SetState(556) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(523) + p.SetState(555) p.StmtWords() } @@ -7872,7 +8246,7 @@ func (p *EarthParser) FromDockerfileStmt() (localctx IFromDockerfileStmtContext) _ = this localctx = NewFromDockerfileStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 82, EarthParserRULE_fromDockerfileStmt) + p.EnterRule(localctx, 86, EarthParserRULE_fromDockerfileStmt) var _la int @@ -7894,17 +8268,17 @@ func (p *EarthParser) FromDockerfileStmt() (localctx IFromDockerfileStmtContext) p.EnterOuterAlt(localctx, 1) { - p.SetState(526) + p.SetState(558) p.Match(EarthParserFROM_DOCKERFILE) } - p.SetState(528) + p.SetState(560) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(527) + p.SetState(559) p.StmtWords() } @@ -8007,7 +8381,7 @@ func (p *EarthParser) LocallyStmt() (localctx ILocallyStmtContext) { _ = this localctx = NewLocallyStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 84, EarthParserRULE_locallyStmt) + p.EnterRule(localctx, 88, EarthParserRULE_locallyStmt) var _la int @@ -8029,17 +8403,17 @@ func (p *EarthParser) LocallyStmt() (localctx ILocallyStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(530) + p.SetState(562) p.Match(EarthParserLOCALLY) } - p.SetState(532) + p.SetState(564) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(531) + p.SetState(563) p.StmtWords() } @@ -8142,7 +8516,7 @@ func (p *EarthParser) CopyStmt() (localctx ICopyStmtContext) { _ = this localctx = NewCopyStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 86, EarthParserRULE_copyStmt) + p.EnterRule(localctx, 90, EarthParserRULE_copyStmt) var _la int @@ -8164,17 +8538,17 @@ func (p *EarthParser) CopyStmt() (localctx ICopyStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(534) + p.SetState(566) p.Match(EarthParserCOPY) } - p.SetState(536) + p.SetState(568) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(535) + p.SetState(567) p.StmtWords() } @@ -8289,7 +8663,7 @@ func (p *EarthParser) SaveStmt() (localctx ISaveStmtContext) { _ = this localctx = NewSaveStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 88, EarthParserRULE_saveStmt) + p.EnterRule(localctx, 92, EarthParserRULE_saveStmt) defer func() { p.ExitRule() @@ -8307,14 +8681,14 @@ func (p *EarthParser) SaveStmt() (localctx ISaveStmtContext) { } }() - p.SetState(540) + p.SetState(572) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case EarthParserSAVE_ARTIFACT: p.EnterOuterAlt(localctx, 1) { - p.SetState(538) + p.SetState(570) p.SaveArtifact() } @@ -8322,7 +8696,7 @@ func (p *EarthParser) SaveStmt() (localctx ISaveStmtContext) { case EarthParserSAVE_IMAGE: p.EnterOuterAlt(localctx, 2) { - p.SetState(539) + p.SetState(571) p.SaveImage() } @@ -8428,7 +8802,7 @@ func (p *EarthParser) SaveImage() (localctx ISaveImageContext) { _ = this localctx = NewSaveImageContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 90, EarthParserRULE_saveImage) + p.EnterRule(localctx, 94, EarthParserRULE_saveImage) var _la int @@ -8450,17 +8824,17 @@ func (p *EarthParser) SaveImage() (localctx ISaveImageContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(542) + p.SetState(574) p.Match(EarthParserSAVE_IMAGE) } - p.SetState(544) + p.SetState(576) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(543) + p.SetState(575) p.StmtWords() } @@ -8563,7 +8937,7 @@ func (p *EarthParser) SaveArtifact() (localctx ISaveArtifactContext) { _ = this localctx = NewSaveArtifactContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 92, EarthParserRULE_saveArtifact) + p.EnterRule(localctx, 96, EarthParserRULE_saveArtifact) var _la int @@ -8585,17 +8959,17 @@ func (p *EarthParser) SaveArtifact() (localctx ISaveArtifactContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(546) + p.SetState(578) p.Match(EarthParserSAVE_ARTIFACT) } - p.SetState(548) + p.SetState(580) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(547) + p.SetState(579) p.StmtWords() } @@ -8698,7 +9072,7 @@ func (p *EarthParser) RunStmt() (localctx IRunStmtContext) { _ = this localctx = NewRunStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 94, EarthParserRULE_runStmt) + p.EnterRule(localctx, 98, EarthParserRULE_runStmt) var _la int @@ -8720,17 +9094,17 @@ func (p *EarthParser) RunStmt() (localctx IRunStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(550) + p.SetState(582) p.Match(EarthParserRUN) } - p.SetState(552) + p.SetState(584) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(551) + p.SetState(583) p.StmtWordsMaybeJSON() } @@ -8833,7 +9207,7 @@ func (p *EarthParser) BuildStmt() (localctx IBuildStmtContext) { _ = this localctx = NewBuildStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 96, EarthParserRULE_buildStmt) + p.EnterRule(localctx, 100, EarthParserRULE_buildStmt) var _la int @@ -8855,17 +9229,17 @@ func (p *EarthParser) BuildStmt() (localctx IBuildStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(554) + p.SetState(586) p.Match(EarthParserBUILD) } - p.SetState(556) + p.SetState(588) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(555) + p.SetState(587) p.StmtWords() } @@ -8968,7 +9342,7 @@ func (p *EarthParser) WorkdirStmt() (localctx IWorkdirStmtContext) { _ = this localctx = NewWorkdirStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 98, EarthParserRULE_workdirStmt) + p.EnterRule(localctx, 102, EarthParserRULE_workdirStmt) var _la int @@ -8990,17 +9364,17 @@ func (p *EarthParser) WorkdirStmt() (localctx IWorkdirStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(558) + p.SetState(590) p.Match(EarthParserWORKDIR) } - p.SetState(560) + p.SetState(592) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(559) + p.SetState(591) p.StmtWords() } @@ -9103,7 +9477,7 @@ func (p *EarthParser) UserStmt() (localctx IUserStmtContext) { _ = this localctx = NewUserStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 100, EarthParserRULE_userStmt) + p.EnterRule(localctx, 104, EarthParserRULE_userStmt) var _la int @@ -9125,17 +9499,17 @@ func (p *EarthParser) UserStmt() (localctx IUserStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(562) + p.SetState(594) p.Match(EarthParserUSER) } - p.SetState(564) + p.SetState(596) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(563) + p.SetState(595) p.StmtWords() } @@ -9238,7 +9612,7 @@ func (p *EarthParser) CmdStmt() (localctx ICmdStmtContext) { _ = this localctx = NewCmdStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 102, EarthParserRULE_cmdStmt) + p.EnterRule(localctx, 106, EarthParserRULE_cmdStmt) var _la int @@ -9260,17 +9634,17 @@ func (p *EarthParser) CmdStmt() (localctx ICmdStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(566) + p.SetState(598) p.Match(EarthParserCMD) } - p.SetState(568) + p.SetState(600) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(567) + p.SetState(599) p.StmtWordsMaybeJSON() } @@ -9373,7 +9747,7 @@ func (p *EarthParser) EntrypointStmt() (localctx IEntrypointStmtContext) { _ = this localctx = NewEntrypointStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 104, EarthParserRULE_entrypointStmt) + p.EnterRule(localctx, 108, EarthParserRULE_entrypointStmt) var _la int @@ -9395,17 +9769,17 @@ func (p *EarthParser) EntrypointStmt() (localctx IEntrypointStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(570) + p.SetState(602) p.Match(EarthParserENTRYPOINT) } - p.SetState(572) + p.SetState(604) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(571) + p.SetState(603) p.StmtWordsMaybeJSON() } @@ -9508,7 +9882,7 @@ func (p *EarthParser) ExposeStmt() (localctx IExposeStmtContext) { _ = this localctx = NewExposeStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 106, EarthParserRULE_exposeStmt) + p.EnterRule(localctx, 110, EarthParserRULE_exposeStmt) var _la int @@ -9530,17 +9904,17 @@ func (p *EarthParser) ExposeStmt() (localctx IExposeStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(574) + p.SetState(606) p.Match(EarthParserEXPOSE) } - p.SetState(576) + p.SetState(608) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(575) + p.SetState(607) p.StmtWords() } @@ -9643,7 +10017,7 @@ func (p *EarthParser) VolumeStmt() (localctx IVolumeStmtContext) { _ = this localctx = NewVolumeStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 108, EarthParserRULE_volumeStmt) + p.EnterRule(localctx, 112, EarthParserRULE_volumeStmt) var _la int @@ -9665,17 +10039,17 @@ func (p *EarthParser) VolumeStmt() (localctx IVolumeStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(578) + p.SetState(610) p.Match(EarthParserVOLUME) } - p.SetState(580) + p.SetState(612) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(579) + p.SetState(611) p.StmtWordsMaybeJSON() } @@ -9805,7 +10179,7 @@ func (p *EarthParser) EnvStmt() (localctx IEnvStmtContext) { _ = this localctx = NewEnvStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 110, EarthParserRULE_envStmt) + p.EnterRule(localctx, 114, EarthParserRULE_envStmt) var _la int @@ -9827,45 +10201,45 @@ func (p *EarthParser) EnvStmt() (localctx IEnvStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(582) + p.SetState(614) p.Match(EarthParserENV) } { - p.SetState(583) + p.SetState(615) p.EnvArgKey() } - p.SetState(585) + p.SetState(617) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserEQUALS { { - p.SetState(584) + p.SetState(616) p.Match(EarthParserEQUALS) } } - p.SetState(591) + p.SetState(623) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserWS || _la == EarthParserAtom { - p.SetState(588) + p.SetState(620) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserWS { { - p.SetState(587) + p.SetState(619) p.Match(EarthParserWS) } } { - p.SetState(590) + p.SetState(622) p.EnvArgValue() } @@ -10012,7 +10386,7 @@ func (p *EarthParser) ArgStmt() (localctx IArgStmtContext) { _ = this localctx = NewArgStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 112, EarthParserRULE_argStmt) + p.EnterRule(localctx, 116, EarthParserRULE_argStmt) var _la int @@ -10034,47 +10408,47 @@ func (p *EarthParser) ArgStmt() (localctx IArgStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(593) + p.SetState(625) p.Match(EarthParserARG) } { - p.SetState(594) + p.SetState(626) p.OptionalFlag() } { - p.SetState(595) + p.SetState(627) p.EnvArgKey() } - p.SetState(603) + p.SetState(635) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserEQUALS { { - p.SetState(596) + p.SetState(628) p.Match(EarthParserEQUALS) } - p.SetState(601) + p.SetState(633) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserWS || _la == EarthParserAtom { - p.SetState(598) + p.SetState(630) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserWS { { - p.SetState(597) + p.SetState(629) p.Match(EarthParserWS) } } { - p.SetState(600) + p.SetState(632) p.EnvArgValue() } @@ -10206,7 +10580,7 @@ func (p *EarthParser) SetStmt() (localctx ISetStmtContext) { _ = this localctx = NewSetStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 114, EarthParserRULE_setStmt) + p.EnterRule(localctx, 118, EarthParserRULE_setStmt) var _la int @@ -10228,31 +10602,31 @@ func (p *EarthParser) SetStmt() (localctx ISetStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(605) + p.SetState(637) p.Match(EarthParserSET) } { - p.SetState(606) + p.SetState(638) p.EnvArgKey() } { - p.SetState(607) + p.SetState(639) p.Match(EarthParserEQUALS) } - p.SetState(609) + p.SetState(641) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserWS { { - p.SetState(608) + p.SetState(640) p.Match(EarthParserWS) } } { - p.SetState(611) + p.SetState(643) p.EnvArgValue() } @@ -10397,7 +10771,7 @@ func (p *EarthParser) LetStmt() (localctx ILetStmtContext) { _ = this localctx = NewLetStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 116, EarthParserRULE_letStmt) + p.EnterRule(localctx, 120, EarthParserRULE_letStmt) var _la int @@ -10419,35 +10793,35 @@ func (p *EarthParser) LetStmt() (localctx ILetStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(613) + p.SetState(645) p.Match(EarthParserLET) } { - p.SetState(614) + p.SetState(646) p.OptionalFlag() } { - p.SetState(615) + p.SetState(647) p.EnvArgKey() } { - p.SetState(616) + p.SetState(648) p.Match(EarthParserEQUALS) } - p.SetState(618) + p.SetState(650) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserWS { { - p.SetState(617) + p.SetState(649) p.Match(EarthParserWS) } } { - p.SetState(620) + p.SetState(652) p.EnvArgValue() } @@ -10543,7 +10917,7 @@ func (p *EarthParser) OptionalFlag() (localctx IOptionalFlagContext) { _ = this localctx = NewOptionalFlagContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 118, EarthParserRULE_optionalFlag) + p.EnterRule(localctx, 122, EarthParserRULE_optionalFlag) defer func() { p.ExitRule() @@ -10562,13 +10936,13 @@ func (p *EarthParser) OptionalFlag() (localctx IOptionalFlagContext) { }() p.EnterOuterAlt(localctx, 1) - p.SetState(623) + p.SetState(655) p.GetErrorHandler().Sync(p) - if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 79, p.GetParserRuleContext()) == 1 { + if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 83, p.GetParserRuleContext()) == 1 { { - p.SetState(622) + p.SetState(654) p.StmtWords() } @@ -10655,7 +11029,7 @@ func (p *EarthParser) EnvArgKey() (localctx IEnvArgKeyContext) { _ = this localctx = NewEnvArgKeyContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 120, EarthParserRULE_envArgKey) + p.EnterRule(localctx, 124, EarthParserRULE_envArgKey) defer func() { p.ExitRule() @@ -10675,7 +11049,7 @@ func (p *EarthParser) EnvArgKey() (localctx IEnvArgKeyContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(625) + p.SetState(657) p.Match(EarthParserAtom) } @@ -10774,7 +11148,7 @@ func (p *EarthParser) EnvArgValue() (localctx IEnvArgValueContext) { _ = this localctx = NewEnvArgValueContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 122, EarthParserRULE_envArgValue) + p.EnterRule(localctx, 126, EarthParserRULE_envArgValue) var _la int @@ -10796,34 +11170,34 @@ func (p *EarthParser) EnvArgValue() (localctx IEnvArgValueContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(627) + p.SetState(659) p.Match(EarthParserAtom) } - p.SetState(634) + p.SetState(666) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == EarthParserWS || _la == EarthParserAtom { - p.SetState(629) + p.SetState(661) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserWS { { - p.SetState(628) + p.SetState(660) p.Match(EarthParserWS) } } { - p.SetState(631) + p.SetState(663) p.Match(EarthParserAtom) } - p.SetState(636) + p.SetState(668) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } @@ -11004,7 +11378,7 @@ func (p *EarthParser) LabelStmt() (localctx ILabelStmtContext) { _ = this localctx = NewLabelStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 124, EarthParserRULE_labelStmt) + p.EnterRule(localctx, 128, EarthParserRULE_labelStmt) var _la int @@ -11026,30 +11400,30 @@ func (p *EarthParser) LabelStmt() (localctx ILabelStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(637) + p.SetState(669) p.Match(EarthParserLABEL) } - p.SetState(644) + p.SetState(676) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == EarthParserAtom { { - p.SetState(638) + p.SetState(670) p.LabelKey() } { - p.SetState(639) + p.SetState(671) p.Match(EarthParserEQUALS) } { - p.SetState(640) + p.SetState(672) p.LabelValue() } - p.SetState(646) + p.SetState(678) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } @@ -11134,7 +11508,7 @@ func (p *EarthParser) LabelKey() (localctx ILabelKeyContext) { _ = this localctx = NewLabelKeyContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 126, EarthParserRULE_labelKey) + p.EnterRule(localctx, 130, EarthParserRULE_labelKey) defer func() { p.ExitRule() @@ -11154,7 +11528,7 @@ func (p *EarthParser) LabelKey() (localctx ILabelKeyContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(647) + p.SetState(679) p.Match(EarthParserAtom) } @@ -11238,7 +11612,7 @@ func (p *EarthParser) LabelValue() (localctx ILabelValueContext) { _ = this localctx = NewLabelValueContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 128, EarthParserRULE_labelValue) + p.EnterRule(localctx, 132, EarthParserRULE_labelValue) defer func() { p.ExitRule() @@ -11258,7 +11632,7 @@ func (p *EarthParser) LabelValue() (localctx ILabelValueContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(649) + p.SetState(681) p.Match(EarthParserAtom) } @@ -11359,7 +11733,7 @@ func (p *EarthParser) GitCloneStmt() (localctx IGitCloneStmtContext) { _ = this localctx = NewGitCloneStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 130, EarthParserRULE_gitCloneStmt) + p.EnterRule(localctx, 134, EarthParserRULE_gitCloneStmt) var _la int @@ -11381,17 +11755,17 @@ func (p *EarthParser) GitCloneStmt() (localctx IGitCloneStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(651) + p.SetState(683) p.Match(EarthParserGIT_CLONE) } - p.SetState(653) + p.SetState(685) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(652) + p.SetState(684) p.StmtWords() } @@ -11494,7 +11868,7 @@ func (p *EarthParser) AddStmt() (localctx IAddStmtContext) { _ = this localctx = NewAddStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 132, EarthParserRULE_addStmt) + p.EnterRule(localctx, 136, EarthParserRULE_addStmt) var _la int @@ -11516,17 +11890,17 @@ func (p *EarthParser) AddStmt() (localctx IAddStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(655) + p.SetState(687) p.Match(EarthParserADD) } - p.SetState(657) + p.SetState(689) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(656) + p.SetState(688) p.StmtWords() } @@ -11629,7 +12003,7 @@ func (p *EarthParser) StopsignalStmt() (localctx IStopsignalStmtContext) { _ = this localctx = NewStopsignalStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 134, EarthParserRULE_stopsignalStmt) + p.EnterRule(localctx, 138, EarthParserRULE_stopsignalStmt) var _la int @@ -11651,17 +12025,17 @@ func (p *EarthParser) StopsignalStmt() (localctx IStopsignalStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(659) + p.SetState(691) p.Match(EarthParserSTOPSIGNAL) } - p.SetState(661) + p.SetState(693) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(660) + p.SetState(692) p.StmtWords() } @@ -11764,7 +12138,7 @@ func (p *EarthParser) OnbuildStmt() (localctx IOnbuildStmtContext) { _ = this localctx = NewOnbuildStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 136, EarthParserRULE_onbuildStmt) + p.EnterRule(localctx, 140, EarthParserRULE_onbuildStmt) var _la int @@ -11786,17 +12160,17 @@ func (p *EarthParser) OnbuildStmt() (localctx IOnbuildStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(663) + p.SetState(695) p.Match(EarthParserONBUILD) } - p.SetState(665) + p.SetState(697) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(664) + p.SetState(696) p.StmtWords() } @@ -11899,7 +12273,7 @@ func (p *EarthParser) HealthcheckStmt() (localctx IHealthcheckStmtContext) { _ = this localctx = NewHealthcheckStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 138, EarthParserRULE_healthcheckStmt) + p.EnterRule(localctx, 142, EarthParserRULE_healthcheckStmt) var _la int @@ -11921,17 +12295,17 @@ func (p *EarthParser) HealthcheckStmt() (localctx IHealthcheckStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(667) + p.SetState(699) p.Match(EarthParserHEALTHCHECK) } - p.SetState(669) + p.SetState(701) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(668) + p.SetState(700) p.StmtWords() } @@ -12034,7 +12408,7 @@ func (p *EarthParser) ShellStmt() (localctx IShellStmtContext) { _ = this localctx = NewShellStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 140, EarthParserRULE_shellStmt) + p.EnterRule(localctx, 144, EarthParserRULE_shellStmt) var _la int @@ -12056,17 +12430,17 @@ func (p *EarthParser) ShellStmt() (localctx IShellStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(671) + p.SetState(703) p.Match(EarthParserSHELL) } - p.SetState(673) + p.SetState(705) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(672) + p.SetState(704) p.StmtWords() } @@ -12169,7 +12543,7 @@ func (p *EarthParser) UserCommandStmt() (localctx IUserCommandStmtContext) { _ = this localctx = NewUserCommandStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 142, EarthParserRULE_userCommandStmt) + p.EnterRule(localctx, 146, EarthParserRULE_userCommandStmt) var _la int @@ -12191,17 +12565,152 @@ func (p *EarthParser) UserCommandStmt() (localctx IUserCommandStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(675) + p.SetState(707) p.Match(EarthParserCOMMAND) } - p.SetState(677) + p.SetState(709) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + + if _la == EarthParserAtom { + { + p.SetState(708) + p.StmtWords() + } + + } + + + + return localctx +} + + +// IFunctionStmtContext is an interface to support dynamic dispatch. +type IFunctionStmtContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // Getter signatures + FUNCTION() antlr.TerminalNode + StmtWords() IStmtWordsContext + + // IsFunctionStmtContext differentiates from other interfaces. + IsFunctionStmtContext() +} + +type FunctionStmtContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyFunctionStmtContext() *FunctionStmtContext { + var p = new(FunctionStmtContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = EarthParserRULE_functionStmt + return p +} + +func (*FunctionStmtContext) IsFunctionStmtContext() {} + +func NewFunctionStmtContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *FunctionStmtContext { + var p = new(FunctionStmtContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = EarthParserRULE_functionStmt + + return p +} + +func (s *FunctionStmtContext) GetParser() antlr.Parser { return s.parser } + +func (s *FunctionStmtContext) FUNCTION() antlr.TerminalNode { + return s.GetToken(EarthParserFUNCTION, 0) +} + +func (s *FunctionStmtContext) StmtWords() IStmtWordsContext { + var t antlr.RuleContext; + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IStmtWordsContext); ok { + t = ctx.(antlr.RuleContext); + break + } + } + + if t == nil { + return nil + } + + return t.(IStmtWordsContext) +} + +func (s *FunctionStmtContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *FunctionStmtContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + + +func (s *FunctionStmtContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(EarthParserListener); ok { + listenerT.EnterFunctionStmt(s) + } +} + +func (s *FunctionStmtContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(EarthParserListener); ok { + listenerT.ExitFunctionStmt(s) + } +} + + + + +func (p *EarthParser) FunctionStmt() (localctx IFunctionStmtContext) { + this := p + _ = this + + localctx = NewFunctionStmtContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 148, EarthParserRULE_functionStmt) + var _la int + + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(711) + p.Match(EarthParserFUNCTION) + } + p.SetState(713) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(676) + p.SetState(712) p.StmtWords() } @@ -12304,7 +12813,7 @@ func (p *EarthParser) DoStmt() (localctx IDoStmtContext) { _ = this localctx = NewDoStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 144, EarthParserRULE_doStmt) + p.EnterRule(localctx, 150, EarthParserRULE_doStmt) var _la int @@ -12326,17 +12835,17 @@ func (p *EarthParser) DoStmt() (localctx IDoStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(679) + p.SetState(715) p.Match(EarthParserDO) } - p.SetState(681) + p.SetState(717) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(680) + p.SetState(716) p.StmtWords() } @@ -12439,7 +12948,7 @@ func (p *EarthParser) ImportStmt() (localctx IImportStmtContext) { _ = this localctx = NewImportStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 146, EarthParserRULE_importStmt) + p.EnterRule(localctx, 152, EarthParserRULE_importStmt) var _la int @@ -12461,17 +12970,17 @@ func (p *EarthParser) ImportStmt() (localctx IImportStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(683) + p.SetState(719) p.Match(EarthParserIMPORT) } - p.SetState(685) + p.SetState(721) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(684) + p.SetState(720) p.StmtWords() } @@ -12574,7 +13083,7 @@ func (p *EarthParser) CacheStmt() (localctx ICacheStmtContext) { _ = this localctx = NewCacheStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 148, EarthParserRULE_cacheStmt) + p.EnterRule(localctx, 154, EarthParserRULE_cacheStmt) var _la int @@ -12596,17 +13105,17 @@ func (p *EarthParser) CacheStmt() (localctx ICacheStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(687) + p.SetState(723) p.Match(EarthParserCACHE) } - p.SetState(689) + p.SetState(725) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(688) + p.SetState(724) p.StmtWords() } @@ -12709,7 +13218,7 @@ func (p *EarthParser) HostStmt() (localctx IHostStmtContext) { _ = this localctx = NewHostStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 150, EarthParserRULE_hostStmt) + p.EnterRule(localctx, 156, EarthParserRULE_hostStmt) var _la int @@ -12731,17 +13240,17 @@ func (p *EarthParser) HostStmt() (localctx IHostStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(691) + p.SetState(727) p.Match(EarthParserHOST) } - p.SetState(693) + p.SetState(729) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(692) + p.SetState(728) p.StmtWords() } @@ -12844,7 +13353,7 @@ func (p *EarthParser) ProjectStmt() (localctx IProjectStmtContext) { _ = this localctx = NewProjectStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 152, EarthParserRULE_projectStmt) + p.EnterRule(localctx, 158, EarthParserRULE_projectStmt) var _la int @@ -12866,17 +13375,17 @@ func (p *EarthParser) ProjectStmt() (localctx IProjectStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(695) + p.SetState(731) p.Match(EarthParserPROJECT) } - p.SetState(697) + p.SetState(733) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(696) + p.SetState(732) p.StmtWords() } @@ -12979,7 +13488,7 @@ func (p *EarthParser) PipelineStmt() (localctx IPipelineStmtContext) { _ = this localctx = NewPipelineStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 154, EarthParserRULE_pipelineStmt) + p.EnterRule(localctx, 160, EarthParserRULE_pipelineStmt) var _la int @@ -13001,17 +13510,17 @@ func (p *EarthParser) PipelineStmt() (localctx IPipelineStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(699) + p.SetState(735) p.Match(EarthParserPIPELINE) } - p.SetState(701) + p.SetState(737) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(700) + p.SetState(736) p.StmtWords() } @@ -13114,7 +13623,7 @@ func (p *EarthParser) TriggerStmt() (localctx ITriggerStmtContext) { _ = this localctx = NewTriggerStmtContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 156, EarthParserRULE_triggerStmt) + p.EnterRule(localctx, 162, EarthParserRULE_triggerStmt) var _la int @@ -13136,17 +13645,17 @@ func (p *EarthParser) TriggerStmt() (localctx ITriggerStmtContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(703) + p.SetState(739) p.Match(EarthParserTRIGGER) } - p.SetState(705) + p.SetState(741) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == EarthParserAtom { { - p.SetState(704) + p.SetState(740) p.StmtWords() } @@ -13244,7 +13753,7 @@ func (p *EarthParser) Expr() (localctx IExprContext) { _ = this localctx = NewExprContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 158, EarthParserRULE_expr) + p.EnterRule(localctx, 164, EarthParserRULE_expr) defer func() { p.ExitRule() @@ -13264,7 +13773,7 @@ func (p *EarthParser) Expr() (localctx IExprContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(707) + p.SetState(743) p.StmtWordsMaybeJSON() } @@ -13360,7 +13869,7 @@ func (p *EarthParser) StmtWordsMaybeJSON() (localctx IStmtWordsMaybeJSONContext) _ = this localctx = NewStmtWordsMaybeJSONContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 160, EarthParserRULE_stmtWordsMaybeJSON) + p.EnterRule(localctx, 166, EarthParserRULE_stmtWordsMaybeJSON) defer func() { p.ExitRule() @@ -13380,7 +13889,7 @@ func (p *EarthParser) StmtWordsMaybeJSON() (localctx IStmtWordsMaybeJSONContext) p.EnterOuterAlt(localctx, 1) { - p.SetState(709) + p.SetState(745) p.StmtWords() } @@ -13502,7 +14011,7 @@ func (p *EarthParser) StmtWords() (localctx IStmtWordsContext) { _ = this localctx = NewStmtWordsContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 162, EarthParserRULE_stmtWords) + p.EnterRule(localctx, 168, EarthParserRULE_stmtWords) defer func() { p.ExitRule() @@ -13523,14 +14032,14 @@ func (p *EarthParser) StmtWords() (localctx IStmtWordsContext) { var _alt int p.EnterOuterAlt(localctx, 1) - p.SetState(712) + p.SetState(748) p.GetErrorHandler().Sync(p) _alt = 1 for ok := true; ok; ok = _alt != 2 && _alt != antlr.ATNInvalidAltNumber { switch _alt { case 1: { - p.SetState(711) + p.SetState(747) p.StmtWord() } @@ -13541,9 +14050,9 @@ func (p *EarthParser) StmtWords() (localctx IStmtWordsContext) { panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) } - p.SetState(714) + p.SetState(750) p.GetErrorHandler().Sync(p) - _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 97, p.GetParserRuleContext()) + _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 102, p.GetParserRuleContext()) } @@ -13626,7 +14135,7 @@ func (p *EarthParser) StmtWord() (localctx IStmtWordContext) { _ = this localctx = NewStmtWordContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 164, EarthParserRULE_stmtWord) + p.EnterRule(localctx, 170, EarthParserRULE_stmtWord) defer func() { p.ExitRule() @@ -13646,7 +14155,7 @@ func (p *EarthParser) StmtWord() (localctx IStmtWordContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(716) + p.SetState(752) p.Match(EarthParserAtom) } diff --git a/ast/parser/earthparser_base_listener.go b/ast/parser/earthparser_base_listener.go index 78999c3d..dfb42b0d 100644 --- a/ast/parser/earthparser_base_listener.go +++ b/ast/parser/earthparser_base_listener.go @@ -63,6 +63,18 @@ func (s *BaseEarthParserListener) EnterUserCommandHeader(ctx *UserCommandHeaderC // ExitUserCommandHeader is called when production userCommandHeader is exited. func (s *BaseEarthParserListener) ExitUserCommandHeader(ctx *UserCommandHeaderContext) {} +// EnterFunction is called when production function is entered. +func (s *BaseEarthParserListener) EnterFunction(ctx *FunctionContext) {} + +// ExitFunction is called when production function is exited. +func (s *BaseEarthParserListener) ExitFunction(ctx *FunctionContext) {} + +// EnterFunctionHeader is called when production functionHeader is entered. +func (s *BaseEarthParserListener) EnterFunctionHeader(ctx *FunctionHeaderContext) {} + +// ExitFunctionHeader is called when production functionHeader is exited. +func (s *BaseEarthParserListener) ExitFunctionHeader(ctx *FunctionHeaderContext) {} + // EnterStmts is called when production stmts is entered. func (s *BaseEarthParserListener) EnterStmts(ctx *StmtsContext) {} @@ -453,6 +465,12 @@ func (s *BaseEarthParserListener) EnterUserCommandStmt(ctx *UserCommandStmtConte // ExitUserCommandStmt is called when production userCommandStmt is exited. func (s *BaseEarthParserListener) ExitUserCommandStmt(ctx *UserCommandStmtContext) {} +// EnterFunctionStmt is called when production functionStmt is entered. +func (s *BaseEarthParserListener) EnterFunctionStmt(ctx *FunctionStmtContext) {} + +// ExitFunctionStmt is called when production functionStmt is exited. +func (s *BaseEarthParserListener) ExitFunctionStmt(ctx *FunctionStmtContext) {} + // EnterDoStmt is called when production doStmt is entered. func (s *BaseEarthParserListener) EnterDoStmt(ctx *DoStmtContext) {} diff --git a/ast/parser/earthparser_listener.go b/ast/parser/earthparser_listener.go index 379ec44a..117d399d 100644 --- a/ast/parser/earthparser_listener.go +++ b/ast/parser/earthparser_listener.go @@ -29,6 +29,12 @@ type EarthParserListener interface { // EnterUserCommandHeader is called when entering the userCommandHeader production. EnterUserCommandHeader(c *UserCommandHeaderContext) + // EnterFunction is called when entering the function production. + EnterFunction(c *FunctionContext) + + // EnterFunctionHeader is called when entering the functionHeader production. + EnterFunctionHeader(c *FunctionHeaderContext) + // EnterStmts is called when entering the stmts production. EnterStmts(c *StmtsContext) @@ -224,6 +230,9 @@ type EarthParserListener interface { // EnterUserCommandStmt is called when entering the userCommandStmt production. EnterUserCommandStmt(c *UserCommandStmtContext) + // EnterFunctionStmt is called when entering the functionStmt production. + EnterFunctionStmt(c *FunctionStmtContext) + // EnterDoStmt is called when entering the doStmt production. EnterDoStmt(c *DoStmtContext) @@ -278,6 +287,12 @@ type EarthParserListener interface { // ExitUserCommandHeader is called when exiting the userCommandHeader production. ExitUserCommandHeader(c *UserCommandHeaderContext) + // ExitFunction is called when exiting the function production. + ExitFunction(c *FunctionContext) + + // ExitFunctionHeader is called when exiting the functionHeader production. + ExitFunctionHeader(c *FunctionHeaderContext) + // ExitStmts is called when exiting the stmts production. ExitStmts(c *StmtsContext) @@ -473,6 +488,9 @@ type EarthParserListener interface { // ExitUserCommandStmt is called when exiting the userCommandStmt production. ExitUserCommandStmt(c *UserCommandStmtContext) + // ExitFunctionStmt is called when exiting the functionStmt production. + ExitFunctionStmt(c *FunctionStmtContext) + // ExitDoStmt is called when exiting the doStmt production. ExitDoStmt(c *DoStmtContext) diff --git a/ast/spec/earthfile.go b/ast/spec/earthfile.go index d7e76890..d7a2e93d 100644 --- a/ast/spec/earthfile.go +++ b/ast/spec/earthfile.go @@ -5,7 +5,7 @@ type Earthfile struct { Version *Version `json:"version,omitempty"` BaseRecipe Block `json:"baseRecipe"` Targets []Target `json:"targets,omitempty"` - UserCommands []UserCommand `json:"userCommands,omitempty"` + Functions []Function `json:"functions,omitempty"` SourceLocation *SourceLocation `json:"sourceLocation,omitempty"` } @@ -17,8 +17,8 @@ type Target struct { SourceLocation *SourceLocation `json:"sourceLocation,omitempty"` } -// UserCommand is the AST representation of an Earthfile user command definition. -type UserCommand struct { +// Function is the AST representation of an Earthfile function definition. +type Function struct { Name string `json:"name"` Recipe Block `json:"recipe"` SourceLocation *SourceLocation `json:"sourceLocation,omitempty"` diff --git a/ast/tests/Earthfile b/ast/tests/Earthfile index 91814886..dbce6833 100644 --- a/ast/tests/Earthfile +++ b/ast/tests/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM alpine:3.18 RUN apk add jq WORKDIR /test @@ -135,7 +135,7 @@ update-expected: SAVE ARTIFACT ./expected.pretty.json AS LOCAL ./${TEST}.ast.json INPUT_COPY: - COMMAND + FUNCTION ARG TEST ARG INPUT_FROM_DIR ARG INPUT_FROM_TARGET diff --git a/ast/tests/command.ast.json b/ast/tests/command.ast.json index 0f7720eb..3884db68 100644 --- a/ast/tests/command.ast.json +++ b/ast/tests/command.ast.json @@ -28,9 +28,301 @@ } } ], + "functions": [ + { + "name": "TOUCH", + "recipe": [ + { + "command": { + "args": [], + "name": "COMMAND" + } + }, + { + "command": { + "args": [ + "touch", + "a.txt" + ], + "name": "RUN" + } + } + ] + }, + { + "name": "COMMANDCEPTION", + "recipe": [ + { + "command": { + "args": [], + "name": "COMMAND" + } + }, + { + "command": { + "args": [ + "+ANOTHER_COMMAND" + ], + "name": "DO" + } + } + ] + }, + { + "name": "ANOTHER_COMMAND", + "recipe": [ + { + "command": { + "args": [], + "name": "COMMAND" + } + }, + { + "command": { + "args": [ + "+TOUCH" + ], + "name": "DO" + } + } + ] + }, + { + "name": "COMMAND_ARGS", + "recipe": [ + { + "command": { + "args": [], + "name": "COMMAND" + } + }, + { + "command": { + "args": [ + "arg1", + "=", + "default" + ], + "name": "ARG" + } + }, + { + "command": { + "args": [ + "touch", + "\"./$arg1\"" + ], + "name": "RUN" + } + } + ] + }, + { + "name": "RECURSIVE", + "recipe": [ + { + "command": { + "args": [], + "name": "COMMAND" + } + }, + { + "command": { + "args": [ + "level", + "=", + "5" + ], + "name": "ARG" + } + }, + { + "if": { + "expression": [ + "[", + "\"$level\"", + "-gt", + "\"0\"", + "]" + ], + "ifBody": [ + { + "command": { + "args": [ + "touch", + "$level" + ], + "name": "RUN" + } + }, + { + "command": { + "args": [ + "newlevel", + "=", + "\"$(echo $((level-1)))\"" + ], + "name": "ARG" + } + }, + { + "command": { + "args": [ + "+RECURSIVE", + "--level=$newlevel" + ], + "name": "DO" + } + } + ] + } + } + ] + }, + { + "name": "TEST_SCOPE", + "recipe": [ + { + "command": { + "args": [], + "name": "COMMAND" + } + }, + { + "command": { + "args": [ + "incommand", + "=", + "true" + ], + "name": "ARG" + } + }, + { + "command": { + "args": [ + "test", + "\"$incommand\"", + "=", + "\"true\"" + ], + "name": "RUN" + } + }, + { + "command": { + "args": [ + "!", + "test", + "\"$notincommand\"", + "=", + "\"true\"" + ], + "name": "RUN" + } + }, + { + "command": { + "args": [ + "test", + "\"$envincommand\"", + "=", + "\"true\"" + ], + "name": "RUN" + } + } + ] + }, + { + "name": "TEST_BUILTIN", + "recipe": [ + { + "command": { + "args": [], + "name": "COMMAND" + } + }, + { + "command": { + "args": [ + "EARTHLY_TARGET_NAME" + ], + "name": "ARG" + } + }, + { + "command": { + "args": [ + "test", + "\"$EARTHLY_TARGET_NAME\"", + "=", + "\"test-builtin\"" + ], + "name": "RUN" + } + } + ] + }, + { + "name": "TOUCH_GLOBAL", + "recipe": [ + { + "command": { + "args": [], + "name": "COMMAND" + } + }, + { + "command": { + "args": [ + "test", + "\"$global_var\"", + "!=", + "\"\"" + ], + "name": "RUN" + } + }, + { + "command": { + "args": [ + "touch", + "$global_var" + ], + "name": "RUN" + } + } + ] + }, + { + "name": "TEST_FUNCTION_FAILS", + "recipe": [ + { + "command": { + "args": [], + "name": "FUNCTION" + } + }, + { + "command": { + "args": [ + "echo", + "this", + "should", + "not", + "be", + "printed" + ], + "name": "RUN" + } + } + ] + } + ], "targets": [ { - "name": "all", + "name": "all-positive", "recipe": [ { "command": { @@ -477,274 +769,19 @@ } } ] - } - ], - "userCommands": [ - { - "name": "TOUCH", - "recipe": [ - { - "command": { - "args": [], - "name": "COMMAND" - } - }, - { - "command": { - "args": [ - "touch", - "a.txt" - ], - "name": "RUN" - } - } - ] - }, - { - "name": "COMMANDCEPTION", - "recipe": [ - { - "command": { - "args": [], - "name": "COMMAND" - } - }, - { - "command": { - "args": [ - "+ANOTHER_COMMAND" - ], - "name": "DO" - } - } - ] }, { - "name": "ANOTHER_COMMAND", + "name": "test-function-fails", "recipe": [ - { - "command": { - "args": [], - "name": "COMMAND" - } - }, { "command": { "args": [ - "+TOUCH" + "+TEST_FUNCTION_FAILS" ], "name": "DO" } } ] - }, - { - "name": "COMMAND_ARGS", - "recipe": [ - { - "command": { - "args": [], - "name": "COMMAND" - } - }, - { - "command": { - "args": [ - "arg1", - "=", - "default" - ], - "name": "ARG" - } - }, - { - "command": { - "args": [ - "touch", - "\"./$arg1\"" - ], - "name": "RUN" - } - } - ] - }, - { - "name": "RECURSIVE", - "recipe": [ - { - "command": { - "args": [], - "name": "COMMAND" - } - }, - { - "command": { - "args": [ - "level", - "=", - "5" - ], - "name": "ARG" - } - }, - { - "if": { - "expression": [ - "[", - "\"$level\"", - "-gt", - "\"0\"", - "]" - ], - "ifBody": [ - { - "command": { - "args": [ - "touch", - "$level" - ], - "name": "RUN" - } - }, - { - "command": { - "args": [ - "newlevel", - "=", - "\"$(echo $((level-1)))\"" - ], - "name": "ARG" - } - }, - { - "command": { - "args": [ - "+RECURSIVE", - "--level=$newlevel" - ], - "name": "DO" - } - } - ] - } - } - ] - }, - { - "name": "TEST_SCOPE", - "recipe": [ - { - "command": { - "args": [], - "name": "COMMAND" - } - }, - { - "command": { - "args": [ - "incommand", - "=", - "true" - ], - "name": "ARG" - } - }, - { - "command": { - "args": [ - "test", - "\"$incommand\"", - "=", - "\"true\"" - ], - "name": "RUN" - } - }, - { - "command": { - "args": [ - "!", - "test", - "\"$notincommand\"", - "=", - "\"true\"" - ], - "name": "RUN" - } - }, - { - "command": { - "args": [ - "test", - "\"$envincommand\"", - "=", - "\"true\"" - ], - "name": "RUN" - } - } - ] - }, - { - "name": "TEST_BUILTIN", - "recipe": [ - { - "command": { - "args": [], - "name": "COMMAND" - } - }, - { - "command": { - "args": [ - "EARTHLY_TARGET_NAME" - ], - "name": "ARG" - } - }, - { - "command": { - "args": [ - "test", - "\"$EARTHLY_TARGET_NAME\"", - "=", - "\"test-builtin\"" - ], - "name": "RUN" - } - } - ] - }, - { - "name": "TOUCH_GLOBAL", - "recipe": [ - { - "command": { - "args": [], - "name": "COMMAND" - } - }, - { - "command": { - "args": [ - "test", - "\"$global_var\"", - "!=", - "\"\"" - ], - "name": "RUN" - } - }, - { - "command": { - "args": [ - "touch", - "$global_var" - ], - "name": "RUN" - } - } - ] } ], "version": { diff --git a/earthfile2llb/interpreter.go b/earthfile2llb/interpreter.go index f83782d1..9263d7ce 100644 --- a/earthfile2llb/interpreter.go +++ b/earthfile2llb/interpreter.go @@ -278,6 +278,8 @@ func (i *Interpreter) handleCommand(ctx context.Context, cmd spec.Command) (err return i.handleShell(ctx, cmd) case command.Command: return i.handleUserCommand(ctx, cmd) + case command.Function: + return i.handleFunction(ctx, cmd) case command.Do: return i.handleDo(ctx, cmd) case command.Import: @@ -1727,10 +1729,14 @@ func (i *Interpreter) handleShell(ctx context.Context, cmd spec.Command) error { return i.errorf(cmd.SourceLocation, "command SHELL not yet supported") } -func (i *Interpreter) handleUserCommand(ctx context.Context, cmd spec.Command) error { +func (i *Interpreter) handleUserCommand(_ context.Context, cmd spec.Command) error { return i.errorf(cmd.SourceLocation, "command COMMAND not allowed in a target definition") } +func (i *Interpreter) handleFunction(_ context.Context, cmd spec.Command) error { + return i.errorf(cmd.SourceLocation, "command FUNCTION not allowed in a target definition") +} + func (i *Interpreter) handleDo(ctx context.Context, cmd spec.Command) error { opts := commandflag.DoOpts{} args, err := flagutil.ParseArgsCleaned("DO", &opts, flagutil.GetArgsCopy(cmd)) @@ -1779,9 +1785,9 @@ func (i *Interpreter) handleDo(ctx context.Context, cmd spec.Command) error { return i.errorf(cmd.SourceLocation, "the DO --pass-args flag must be enabled with the VERSION --pass-args feature flag.") } - for _, uc := range bc.Earthfile.UserCommands { + for _, uc := range bc.Earthfile.Functions { if uc.Name == command.Command { - return i.handleDoUserCommand(ctx, command, relCommand, uc, cmd, parsedFlagArgs, allowPrivileged, opts.PassArgs) + return i.handleDoFunction(ctx, command, relCommand, uc, cmd, parsedFlagArgs, allowPrivileged, opts.PassArgs, bc.Features.UseFunctionKeyword) } } return i.errorf(cmd.SourceLocation, "user command %s not found", ucName) @@ -1970,15 +1976,25 @@ func (i *Interpreter) handleHost(ctx context.Context, cmd spec.Command) error { // ---------------------------------------------------------------------------- -func (i *Interpreter) handleDoUserCommand(ctx context.Context, command domain.Command, relCommand domain.Command, uc spec.UserCommand, do spec.Command, buildArgs []string, allowPrivileged, passArgs bool) error { +func (i *Interpreter) handleDoFunction(ctx context.Context, command domain.Command, relCommand domain.Command, uc spec.Function, do spec.Command, buildArgs []string, allowPrivileged, passArgs bool, useFunctionCmd bool) error { + cmdName := "FUNCTION" + if !useFunctionCmd { + cmdName = "COMMAND" + } if allowPrivileged && !i.allowPrivileged { - return i.errorf(uc.SourceLocation, "invalid privileged in COMMAND") // this shouldn't happen, but check just in case + return i.errorf(uc.SourceLocation, "invalid privileged in %s", cmdName) // this shouldn't happen, but check just in case + } + if len(uc.Recipe) == 0 || uc.Recipe[0].Command == nil || uc.Recipe[0].Command.Name != cmdName { + return i.errorf(uc.SourceLocation, "%s recipes must start with %s", strings.ToLower(cmdName), cmdName) } - if len(uc.Recipe) == 0 || uc.Recipe[0].Command == nil || uc.Recipe[0].Command.Name != "COMMAND" { - return i.errorf(uc.SourceLocation, "command recipes must start with COMMAND") + if !useFunctionCmd { + i.console.Warnf( + `Note that the COMMAND keyword will be replaced by FUNCTION starting with VERSION 0.8. +To start using the FUNCTION keyword now (experimental) please use VERSION --use-function-keyword 0.7. Note that switching now may cause breakages for your colleagues if they are using older Earthly versions. +`) } if len(uc.Recipe[0].Command.Args) > 0 { - return i.errorf(uc.Recipe[0].SourceLocation, "COMMAND takes no arguments") + return i.errorf(uc.Recipe[0].SourceLocation, "%s takes no arguments", cmdName) } scopeName := fmt.Sprintf( "%s (%s line %d:%d)", diff --git a/examples/aws-sso/Earthfile b/examples/aws-sso/Earthfile index 80d5adb3..6f435c45 100644 --- a/examples/aws-sso/Earthfile +++ b/examples/aws-sso/Earthfile @@ -1,4 +1,4 @@ -VERSION 0.7 +VERSION --use-function-keyword 0.7 FROM amazon/aws-cli target: @@ -67,7 +67,7 @@ run: # Installs the AWS CLI INSTALL_CLI: - COMMAND + FUNCTION ARG TARGETARCH IF [ "$TARGETARCH" = "amd64" ] ARG aws_architecture="x86_64" @@ -82,7 +82,7 @@ INSTALL_CLI: rm -rf awscliv2.zip aws LOGIN: - COMMAND + FUNCTION ARG --required sso_region BUILD +login --sso_region=$sso_region COPY (+login/credentials --sso_region=$sso_region) /root/.aws/credentials diff --git a/examples/import/some/local/path/Earthfile b/examples/import/some/local/path/Earthfile index 0314bfdd..876eebba 100644 --- a/examples/import/some/local/path/Earthfile +++ b/examples/import/some/local/path/Earthfile @@ -1,4 +1,4 @@ -VERSION 0.7 +VERSION --use-function-keyword 0.7 base-image: FROM busybox:1.32.0 @@ -9,6 +9,6 @@ get-file: SAVE ARTIFACT ./file.txt file.txt PRINT: - COMMAND + FUNCTION ARG text RUN echo $text diff --git a/features/features.go b/features/features.go index 0a7ab699..6547b4d3 100644 --- a/features/features.go +++ b/features/features.go @@ -64,6 +64,7 @@ type Features struct { CachePersistOption bool `long:"cache-persist-option" description:"Adds option to persist caches, Changes default CACHE behaviour to not persist"` GitRefs bool `long:"git-refs" description:"includes EARTHLY_GIT_REFS ARG"` UseVisitedUpfrontHashCollection bool `long:"use-visited-upfront-hash-collection" description:"Uses a new target visitor implementation that computes upfront the hash of the visited targets and adds support for running all targets with the same name but different args in parallel"` + UseFunctionKeyword bool `long:"use-function-keyword" description:"Use the FUNCTION key word instead of COMMAND"` Major int Minor int diff --git a/tests/Earthfile b/tests/Earthfile index 03a7bd64..d75f77d1 100644 --- a/tests/Earthfile +++ b/tests/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ..+earthly-integration-test-base WORKDIR /test @@ -19,6 +19,8 @@ ga-no-qemu-group1: BUILD ./dockerfile+test BUILD ./dockerfile2/subdir+test BUILD --pass-args ./locally-in-command+all + BUILD --pass-args ./locally-in-function+all + BUILD ./command-to-function-rename+all BUILD ./import+build BUILD ./import+build-imported BUILD +privileged-test @@ -93,6 +95,9 @@ ga-no-qemu-group2: BUILD +command BUILD +command-explicit-global BUILD +command-nested-global + BUILD +function + BUILD +function-explicit-global + BUILD +function-nested-global BUILD +duplicate BUILD +reserved BUILD +quotes-test @@ -1034,7 +1039,8 @@ platform-output: command: RUN echo "hello command" >./message.txt - DO +RUN_EARTHLY --earthfile=command.earth + DO +RUN_EARTHLY --earthfile=command.earth --target=+all-positive + DO +RUN_EARTHLY --earthfile=command.earth --should_fail=true --target=+test-function-fails command-explicit-global: DO +RUN_EARTHLY --earthfile=command-explicit-global.earth @@ -1042,6 +1048,17 @@ command-explicit-global: command-nested-global: DO +RUN_EARTHLY --earthfile=command-nested-global.earth --target="+test-overriding --foo=expected" +function: + RUN echo "hello command" >./message.txt + DO +RUN_EARTHLY --earthfile=function.earth --target=+all-positive + DO +RUN_EARTHLY --earthfile=function.earth --should_fail=true --target=+test-command-fails + +function-explicit-global: + DO +RUN_EARTHLY --earthfile=function-explicit-global.earth + +function-nested-global: + DO +RUN_EARTHLY --earthfile=function-nested-global.earth --target="+test-overriding --foo=expected" + duplicate: DO +RUN_EARTHLY --earthfile=duplicate-target-names.earth --should_fail=true --target=+duplicate @@ -1484,7 +1501,7 @@ test-exec-stats: --output_contains="total CPU:.*total memory:.*" RUN_EARTHLY: - COMMAND + FUNCTION ARG earthfile= ARG earthfile_dest="./Earthfile" ARG target=+all diff --git a/tests/autocompletion/Earthfile b/tests/autocompletion/Earthfile index 60b448d3..637ce894 100644 --- a/tests/autocompletion/Earthfile +++ b/tests/autocompletion/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../..+earthly-integration-test-base ENV EARTHLY_SHOW_HIDDEN=0 @@ -207,7 +207,7 @@ test-no-errors-are-displayed: RUN diff expected actual COMPLETION_TEST: - COMMAND + FUNCTION ARG --required COMP_LINE ARG COMP_POINT="$(echo -n "$COMP_LINE" | wc -m)" ARG expected_file='expected' diff --git a/tests/autocompletion/install/Earthfile b/tests/autocompletion/install/Earthfile index 735a2b79..f2beeb3a 100644 --- a/tests/autocompletion/install/Earthfile +++ b/tests/autocompletion/install/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../../+base RUN adduser -h /home/bambi -D bambi @@ -63,7 +63,7 @@ test-all: BUILD +test-bash-root-no-home-entries RUN_EARTHLY: - COMMAND + FUNCTION ARG exec_cmd=/tmp/bootstrap-script DO --pass-args ../../+RUN_EARTHLY \ --should_fail=false \ diff --git a/tests/autoskip/Earthfile b/tests/autoskip/Earthfile index 8ef954e2..87077b9e 100644 --- a/tests/autoskip/Earthfile +++ b/tests/autoskip/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../..+earthly-integration-test-base @@ -214,7 +214,7 @@ test-from-dockerfile: DO --pass-args +RUN_EARTHLY_ARGS --earthfile=from-dockerfile.earth --target=+remote --output_contains="target .* has already been run; exiting" RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG target ARG should_fail=false diff --git a/tests/command-to-function-rename/Earthfile b/tests/command-to-function-rename/Earthfile new file mode 100644 index 00000000..16b2b0a9 --- /dev/null +++ b/tests/command-to-function-rename/Earthfile @@ -0,0 +1,38 @@ +VERSION --pass-args 0.7 +FROM --pass-args ../..+earthly-integration-test-base + +IMPORT .. AS tests + +WORKDIR /test + +all: + BUILD +test-calls-from-other-file + BUILD +test-failed-calls + +test-calls-from-other-file: + WORKDIR /my/test + RUN mkdir -p some/subdir + COPY caller.earth Earthfile + COPY command.earth some/subdir/Earthfile + DO --pass-args +RUN_EARTHLY_ARGS --target=+test-successful-command + COPY function.earth some/subdir/Earthfile + DO --pass-args +RUN_EARTHLY_ARGS --target=+test-successful-function + +test-failed-calls: + WORKDIR /my/test + RUN mkdir -p some/subdir + COPY caller.earth Earthfile + COPY function.earth some/subdir/Earthfile + DO --pass-args +RUN_EARTHLY_ARGS --should_fail=true --target=+test-failed-command + COPY command.earth some/subdir/Earthfile + DO --pass-args +RUN_EARTHLY_ARGS --should_fail=true --target=+test-failed-function + +RUN_EARTHLY_ARGS: + COMMAND + ARG earthfile + ARG target + ARG should_fail=false + DO --pass-args tests+RUN_EARTHLY \ + --earthfile=$earthfile \ + --target=$target \ + --should_fail=$should_fail diff --git a/tests/command-to-function-rename/caller.earth b/tests/command-to-function-rename/caller.earth new file mode 100644 index 00000000..7cf5ef01 --- /dev/null +++ b/tests/command-to-function-rename/caller.earth @@ -0,0 +1,15 @@ +VERSION 0.7 + +FROM alpine:3.18 + +test-successful-command: + DO ./some/subdir+COMMAND_THAT_SUCCEEDS + +test-successful-function: + DO ./some/subdir+FUNCTION_THAT_SUCCEEDS + +test-failed-command: + DO ./some/subdir+COMMAND_THAT_FAILS + +test-failed-function: + DO ./some/subdir+FUNCTION_THAT_FAILS diff --git a/tests/command-to-function-rename/command.earth b/tests/command-to-function-rename/command.earth new file mode 100644 index 00000000..54b7d80b --- /dev/null +++ b/tests/command-to-function-rename/command.earth @@ -0,0 +1,9 @@ +VERSION 0.7 + +COMMAND_THAT_SUCCEEDS: + COMMAND + RUN echo hello world + +FUNCTION_THAT_FAILS: + FUNCTION + RUN echo "I am running in $(pwd)" > data diff --git a/tests/command-to-function-rename/function.earth b/tests/command-to-function-rename/function.earth new file mode 100644 index 00000000..d439ef77 --- /dev/null +++ b/tests/command-to-function-rename/function.earth @@ -0,0 +1,9 @@ +VERSION --use-function-keyword 0.7 + +FUNCTION_THAT_SUCCEEDS: + FUNCTION + RUN echo hello world + +COMMAND_THAT_FAILS: + COMMAND + RUN echo this should never be printed diff --git a/tests/command.earth b/tests/command.earth index 3607f708..c38f5b7c 100644 --- a/tests/command.earth +++ b/tests/command.earth @@ -5,7 +5,7 @@ WORKDIR /test ARG --global global_var=default -all: +all-positive: BUILD +test-basic BUILD +test-remote-no-context BUILD +test-nested @@ -70,6 +70,9 @@ test-global-override: DO +TOUCH_GLOBAL --global_var=override RUN test -f ./override +test-function-fails: + DO +TEST_FUNCTION_FAILS + TOUCH: COMMAND RUN touch a.txt @@ -112,3 +115,7 @@ TOUCH_GLOBAL: COMMAND RUN test "$global_var" != "" RUN touch $global_var + +TEST_FUNCTION_FAILS: + FUNCTION + RUN echo this should not be printed diff --git a/tests/config/Earthfile b/tests/config/Earthfile index 650fc525..7350c148 100644 --- a/tests/config/Earthfile +++ b/tests/config/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../..+earthly-integration-test-base @@ -113,7 +113,7 @@ test: RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG target="+all" ARG extra_args diff --git a/tests/do-not-track/Earthfile b/tests/do-not-track/Earthfile index 32d0d670..9acabb6d 100644 --- a/tests/do-not-track/Earthfile +++ b/tests/do-not-track/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../..+earthly-integration-test-base @@ -21,7 +21,7 @@ test-do-not-track: DO --pass-args +RUN_EARTHLY_ARGS --pre_command=/bin/api-earthly-stub-server --post_command=" && api-earthly-stub-server-shutdown" --earthfile=true.earth --target=+true RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG target ARG should_fail=false diff --git a/tests/function-explicit-global.earth b/tests/function-explicit-global.earth new file mode 100644 index 00000000..6824a1d2 --- /dev/null +++ b/tests/function-explicit-global.earth @@ -0,0 +1,25 @@ +VERSION --use-function-keyword 0.7 + +FROM alpine:3.18 +WORKDIR /test + +ARG --global global_var=default +ARG local_var=default + +all: + BUILD +test-global-default + BUILD +test-global-override + +test-global-default: + DO +TOUCH_GLOBAL + RUN test -f ./default + +test-global-override: + DO +TOUCH_GLOBAL --global_var=override + RUN test -f ./override + +TOUCH_GLOBAL: + FUNCTION + RUN test "$global_var" != "" + RUN test "$local_var" == "" + RUN touch $global_var diff --git a/tests/function-nested-global.earth b/tests/function-nested-global.earth new file mode 100644 index 00000000..693056d7 --- /dev/null +++ b/tests/function-nested-global.earth @@ -0,0 +1,32 @@ +VERSION --arg-scope-and-set --use-function-keyword 0.7 + +FROM alpine:3.18 +WORKDIR /test + +# foo should be overridden with the value "expected" to run this test. +# This asserts that the overriding scope impacts the global scope through nested +# DO calls. +ARG --global foo=default + +SHARED: + FUNCTION + # Note that foo has not yet been declared in the command, therefore we reference the globally declared arg + RUN test "$foo" == "expected" + + # foo should be passed in as "baz" when DO +SHARED is called for the + # purposes of this test. This ensures that DO args do not impact globals but + # do impact ARGs that are declared in the COMMAND. + ARG foo + RUN test "$foo" == "baz" + +CALLER: + FUNCTION + RUN test "$foo" == "expected" + + ARG foo = "bar" + RUN test "$foo" == "bar" + DO +SHARED --foo="baz" + +test-overriding: + RUN test "$foo" == "expected" + DO +CALLER diff --git a/tests/function.earth b/tests/function.earth new file mode 100644 index 00000000..5d364616 --- /dev/null +++ b/tests/function.earth @@ -0,0 +1,121 @@ +VERSION --use-function-keyword 0.7 + +FROM alpine:3.18 +WORKDIR /test + +ARG --global global_var=default + +all-positive: + BUILD +test-basic + BUILD +test-remote-no-context + BUILD +test-nested + BUILD +test-args + BUILD +test-recursive + BUILD +test-remote-touch + BUILD +test-scope + BUILD +test-builtin + BUILD +test-global-default + BUILD +test-global-override + +test-basic: + DO +TOUCH + RUN test -f a.txt + +test-remote-no-context: + DO github.com/earthly/earthly-function-example:main+COPY_CAT + RUN test -f message.txt + +test-nested: + DO +FUNCTIONCEPTION + RUN test -f a.txt + +test-args: + DO +FUNCTION_ARGS --arg1=foo + RUN test -f ./foo + RUN ! test -f ./default + DO +FUNCTION_ARGS + RUN test -f ./default + +test-recursive: + DO +RECURSIVE + RUN test -f ./5 + RUN test -f ./4 + RUN test -f ./3 + RUN test -f ./2 + RUN test -f ./1 + RUN ! test -f ./0 + +test-remote-touch: + DO github.com/earthly/earthly-function-example:main+TOUCH --file=something + RUN test -f ./something + RUN ! test -f ./touched + DO github.com/earthly/earthly-function-example:main+TOUCH + RUN test -f ./touched + +test-scope: + ARG notinfunction=true + ENV envinfunction=true + RUN test "$notinfunction" = "true" + RUN test "$envinfunction" = "true" + DO +TEST_SCOPE + +test-builtin: + DO +TEST_BUILTIN + +test-global-default: + DO +TOUCH_GLOBAL + RUN test -f ./default + +test-global-override: + DO +TOUCH_GLOBAL --global_var=override + RUN test -f ./override + +test-command-fails: + DO +TEST_COMMAND_FAILS + +TOUCH: + FUNCTION + RUN touch a.txt + +FUNCTIONCEPTION: + FUNCTION + DO +ANOTHER_FUNCTION + +ANOTHER_FUNCTION: + FUNCTION + DO +TOUCH + +FUNCTION_ARGS: + FUNCTION + ARG arg1=default + RUN touch "./$arg1" + +RECURSIVE: + FUNCTION + ARG level=5 + IF [ "$level" -gt "0" ] + RUN touch $level + ARG newlevel="$(echo $((level-1)))" + DO +RECURSIVE --level=$newlevel + END + +TEST_SCOPE: + FUNCTION + ARG infunction=true + RUN test "$infunction" = "true" + RUN ! test "$notinfunction" = "true" + RUN test "$envinfunction" = "true" + +TEST_BUILTIN: + FUNCTION + ARG EARTHLY_TARGET_NAME + RUN test "$EARTHLY_TARGET_NAME" = "test-builtin" + +TOUCH_GLOBAL: + FUNCTION + RUN test "$global_var" != "" + RUN touch $global_var + +TEST_COMMAND_FAILS: + COMMAND + RUN echo this should not be printed diff --git a/tests/git-ssh-server/Earthfile b/tests/git-ssh-server/Earthfile index fced6a98..e3631dcc 100644 --- a/tests/git-ssh-server/Earthfile +++ b/tests/git-ssh-server/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 test-rsa-only: FROM --pass-args ./setup+server \ @@ -390,7 +390,7 @@ all: BUILD +test-custom-matcher-non-standard-port-and-no-host-checking RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG pre_command ARG exec_cmd diff --git a/tests/import/Earthfile b/tests/import/Earthfile index 1e59486a..f44ea36c 100644 --- a/tests/import/Earthfile +++ b/tests/import/Earthfile @@ -1,4 +1,4 @@ -VERSION 0.7 +VERSION --use-function-keyword 0.7 build: BUILD ./lib1+build @@ -7,7 +7,7 @@ build-imported: BUILD ./lib1+build-imported INSTALL_WHLS: - COMMAND + FUNCTION ARG wheels FOR wheel IN $wheels diff --git a/tests/invalid/Earthfile b/tests/invalid/Earthfile index 1fbd0e84..46842e67 100644 --- a/tests/invalid/Earthfile +++ b/tests/invalid/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../..+earthly-integration-test-base IMPORT .. AS tests @@ -16,7 +16,7 @@ test-all: BUILD +test-leading-whitespace RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG target ARG should_fail=false diff --git a/tests/locally-in-command/Earthfile b/tests/locally-in-command/Earthfile index 352a1cb5..bfa34c51 100644 --- a/tests/locally-in-command/Earthfile +++ b/tests/locally-in-command/Earthfile @@ -18,6 +18,7 @@ test-command-in-sub-dir: RUN touch /this-file-exists-locally DO --pass-args +RUN_EARTHLY_ARGS --target=/the-test+test RUN test "$(cat /the-test/data)" = "I am running in /the-test" + DO --pass-args +RUN_EARTHLY_ARGS --target=/the-test+test --should-fail=true # cleanup RUN rm /the-test/data diff --git a/tests/locally-in-command/target-that-calls-command.earth b/tests/locally-in-command/target-that-calls-command.earth index 75297105..3d1c9f81 100644 --- a/tests/locally-in-command/target-that-calls-command.earth +++ b/tests/locally-in-command/target-that-calls-command.earth @@ -14,3 +14,7 @@ test-other: test-both: BUILD +test BUILD ./other/path+test + +test-fails: + FROM alpine + DO imported-name+UDC_THAT_SAVES_FILE_LOCALLY diff --git a/tests/locally-in-function/Earthfile b/tests/locally-in-function/Earthfile new file mode 100644 index 00000000..d2df112a --- /dev/null +++ b/tests/locally-in-function/Earthfile @@ -0,0 +1,58 @@ +VERSION --pass-args --use-function-keyword 0.7 +FROM --pass-args ../..+earthly-integration-test-base + +IMPORT .. AS tests + +WORKDIR /test + +all: + BUILD +test-function-in-sub-dir + BUILD +test-function-that-calls-other-function + +test-function-in-sub-dir: + RUN mkdir -p /the-test/some/subdir + RUN mkdir -p /the-test/other/path + COPY function.earth /the-test/some/subdir/Earthfile + COPY target-that-calls-function.earth /the-test/Earthfile + COPY other-target-that-calls-function.earth /the-test/other/path/Earthfile + RUN touch /this-file-exists-locally + DO --pass-args +RUN_EARTHLY_ARGS --target=/the-test+test + RUN test "$(cat /the-test/data)" = "I am running in /the-test" + DO --pass-args +RUN_EARTHLY_ARGS --target=/the-test+test --should-fail=true + + # cleanup + RUN rm /the-test/data + RUN find /the-test | grep -v data + + # next test a target that calls the same function from a different location + DO --pass-args +RUN_EARTHLY_ARGS --target=/the-test+test-other + RUN ! test -f /the-test/data + RUN test "$(cat /the-test/other/path/data)" = "I am running in /the-test/other/path" + + # cleanup + RUN rm /the-test/other/path/data + RUN find /the-test | grep -v data + + # finally test both targets that call the same locally function result in both files being created + DO --pass-args +RUN_EARTHLY_ARGS --target=/the-test+test-both + RUN test "$(cat /the-test/data)" = "I am running in /the-test" + RUN test "$(cat /the-test/other/path/data)" = "I am running in /the-test/other/path" + +test-function-that-calls-other-function: + WORKDIR /my/test + RUN mkdir -p some/subdir/submarine + COPY function.earth some/subdir/Earthfile + COPY function-that-calls-function.earth some/subdir/submarine/Earthfile + COPY target-that-calls-function-that-calls-function.earth Earthfile + DO --pass-args +RUN_EARTHLY_ARGS --target=+test + RUN test "$(cat data)" = "I am running in /my/test" + +RUN_EARTHLY_ARGS: + FUNCTION + ARG earthfile + ARG target + ARG should_fail=false + DO --pass-args tests+RUN_EARTHLY \ + --earthfile=$earthfile \ + --target=$target \ + --should_fail=$should_fail diff --git a/tests/locally-in-function/function-that-calls-function.earth b/tests/locally-in-function/function-that-calls-function.earth new file mode 100644 index 00000000..407be56d --- /dev/null +++ b/tests/locally-in-function/function-that-calls-function.earth @@ -0,0 +1,6 @@ +VERSION --use-function-keyword 0.7 +IMPORT .. AS imported-name + +FUNCTION_THAT_CALLS_OTHER_FUNCTION: + FUNCTION + DO imported-name+FUNCTION_THAT_SAVES_FILE_LOCALLY diff --git a/tests/locally-in-function/function.earth b/tests/locally-in-function/function.earth new file mode 100644 index 00000000..4d6e4d71 --- /dev/null +++ b/tests/locally-in-function/function.earth @@ -0,0 +1,6 @@ +VERSION --use-function-keyword 0.7 + +FUNCTION_THAT_SAVES_FILE_LOCALLY: + FUNCTION + LOCALLY + RUN echo "I am running in $(pwd)" > data diff --git a/tests/locally-in-function/other-target-that-calls-function.earth b/tests/locally-in-function/other-target-that-calls-function.earth new file mode 100644 index 00000000..6d43dd5e --- /dev/null +++ b/tests/locally-in-function/other-target-that-calls-function.earth @@ -0,0 +1,7 @@ +VERSION 0.7 +IMPORT ../../some/subdir AS imported-name + +test: + DO imported-name+FUNCTION_THAT_SAVES_FILE_LOCALLY + RUN test "$(cat data)" = "I am running in /the-test/other/path" + RUN test -f /this-file-exists-locally diff --git a/tests/locally-in-function/target-that-calls-function-that-calls-function.earth b/tests/locally-in-function/target-that-calls-function-that-calls-function.earth new file mode 100644 index 00000000..fdf20d96 --- /dev/null +++ b/tests/locally-in-function/target-that-calls-function-that-calls-function.earth @@ -0,0 +1,7 @@ +VERSION 0.7 +IMPORT ./some/subdir/submarine + +test: + FROM alpine:3.18 + DO submarine+FUNCTION_THAT_CALLS_OTHER_FUNCTION + RUN test "$(cat data)" = "I am running in /my/test" diff --git a/tests/locally-in-function/target-that-calls-function.earth b/tests/locally-in-function/target-that-calls-function.earth new file mode 100644 index 00000000..549d8f1b --- /dev/null +++ b/tests/locally-in-function/target-that-calls-function.earth @@ -0,0 +1,20 @@ +VERSION 0.7 +IMPORT ./some/subdir AS imported-name + +test: + FROM alpine + RUN ! test -f /this-file-exists-locally + DO imported-name+FUNCTION_THAT_SAVES_FILE_LOCALLY + RUN test "$(cat data)" = "I am running in /the-test" + RUN test -f /this-file-exists-locally + +test-other: + BUILD ./other/path+test + +test-both: + BUILD +test + BUILD ./other/path+test + +test-fails: + FROM alpine + DO imported-name+FUNCTION_THAT_SAVES_FILE_LOCALLY diff --git a/tests/pass-args-root.earth b/tests/pass-args-root.earth index 11cb8673..f2226f91 100644 --- a/tests/pass-args-root.earth +++ b/tests/pass-args-root.earth @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 parent-target-wants-bar: FROM alpine:3.18 @@ -15,6 +15,6 @@ parent-target-wants-empty: SAVE ARTIFACT data PARENTCMD: - COMMAND + FUNCTION ARG foo RUN echo "foo=$foo" > data diff --git a/tests/private-https/Earthfile b/tests/private-https/Earthfile index bd697c18..565d7574 100644 --- a/tests/private-https/Earthfile +++ b/tests/private-https/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ..+base all: @@ -78,7 +78,7 @@ earthly --config \$earthly_config --verbose -D selfsigned.example.com/testuser/r DO --pass-args +RUN_EARTHLY_ARGS --pre_command=start-nginx-with-git --earthfile=git-clone-private-https.earth --exec_cmd=/tmp/test-earthly-script RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG pre_command ARG exec_cmd diff --git a/tests/public-https/Earthfile b/tests/public-https/Earthfile index decdcc1b..9243a8e0 100644 --- a/tests/public-https/Earthfile +++ b/tests/public-https/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ..+base all: @@ -34,7 +34,7 @@ earthly --config \$earthly_config --verbose -D selfsigned.example.com/testuser/r DO --pass-args +RUN_EARTHLY_ARGS --pre_command=start-nginx-with-git --earthfile=git-clone-public-https.earth --exec_cmd=/tmp/test-earthly-script RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG pre_command ARG exec_cmd diff --git a/tests/registry-certs/Earthfile b/tests/registry-certs/Earthfile index 38fe34ed..e9371bbe 100644 --- a/tests/registry-certs/Earthfile +++ b/tests/registry-certs/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 ARG --global REGISTRY ARG --global REGISTRY_IP @@ -47,7 +47,7 @@ test-connect: # Work around the lack of variable overriding, since the base image already includes EARTHLY_ADDITIONAL_BUILDKIT_CONFIG DO_REMOTE_CACHE_EARTHLY: - COMMAND + FUNCTION ARG EARTHLY_ADDITIONAL_BUILDKIT_CONFIG ARG REGISTRY_CONFIG diff --git a/tests/remote-cache/Earthfile b/tests/remote-cache/Earthfile index c9b44ab2..a1a6a16b 100644 --- a/tests/remote-cache/Earthfile +++ b/tests/remote-cache/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../..+earthly-integration-test-base @@ -68,7 +68,7 @@ test3: # Work around the lack of variable overriding, since the base image already includes EARTHLY_ADDITIONAL_BUILDKIT_CONFIG DO_REMOTE_CACHE_EARTHLY: - COMMAND + FUNCTION ARG EARTHLY_ADDITIONAL_BUILDKIT_CONFIG ARG REGISTRY_CONFIG diff --git a/tests/save-artifact-selective.earth b/tests/save-artifact-selective.earth index 2434503b..74f8784f 100644 --- a/tests/save-artifact-selective.earth +++ b/tests/save-artifact-selective.earth @@ -1,4 +1,4 @@ -VERSION 0.7 +VERSION --use-function-keyword 0.7 savea: FROM alpine:3.18 @@ -51,7 +51,7 @@ test5: DO +SAVE_CMD --name test5 SAVE_CMD: - COMMAND + FUNCTION ARG name RUN echo $name > data SAVE ARTIFACT data AS LOCAL "$name" diff --git a/tests/scrub-https-credentials/Earthfile b/tests/scrub-https-credentials/Earthfile index 39a4f852..c315ed27 100644 --- a/tests/scrub-https-credentials/Earthfile +++ b/tests/scrub-https-credentials/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ..+base all: @@ -95,7 +95,7 @@ fi fi RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG pre_command ARG exec_cmd diff --git a/tests/secret-provider-config/Earthfile b/tests/secret-provider-config/Earthfile index 6723f378..5b3e26b9 100644 --- a/tests/secret-provider-config/Earthfile +++ b/tests/secret-provider-config/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ..+base @@ -60,7 +60,7 @@ test-all: BUILD +test-with-project-secrets RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG pre_command ARG exec_cmd diff --git a/tests/shell-out/Earthfile b/tests/shell-out/Earthfile index ac0014aa..76cc0531 100644 --- a/tests/shell-out/Earthfile +++ b/tests/shell-out/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../..+earthly-integration-test-base @@ -37,7 +37,7 @@ test-new: DO --pass-args +RUN_EARTHLY_ARGS --earthfile=new.earth --target=+test RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG target ARG should_fail=false diff --git a/tests/version/Earthfile b/tests/version/Earthfile index 121934fd..12b3b810 100644 --- a/tests/version/Earthfile +++ b/tests/version/Earthfile @@ -1,4 +1,4 @@ -VERSION --pass-args 0.7 +VERSION --pass-args --use-function-keyword 0.7 FROM --pass-args ../..+earthly-integration-test-base @@ -84,7 +84,7 @@ test-all: BUILD +test-no-feature-flag-overrides RUN_EARTHLY_ARGS: - COMMAND + FUNCTION ARG earthfile ARG target ARG should_fail=false diff --git a/tests/with-docker-via-command/Earthfile b/tests/with-docker-via-command/Earthfile index 8c453fe3..93dff290 100644 --- a/tests/with-docker-via-command/Earthfile +++ b/tests/with-docker-via-command/Earthfile @@ -1,10 +1,10 @@ -VERSION 0.7 +VERSION --use-function-keyword 0.7 my-image: FROM alpine SAVE IMAGE my/image:test MY_COMMAND_WITH_DOCKER: - COMMAND + FUNCTION ARG MY_ARG="default" WITH DOCKER --load +my-image RUN echo "got $MY_ARG"