From 6cfe12434b99eef2d6c3d9f2705b342663d818ef Mon Sep 17 00:00:00 2001 From: Alexandr Kozlenkov Date: Fri, 1 Jan 2021 19:49:20 +0300 Subject: [PATCH 1/4] added ANTLR grammar --- internal/Makefile | 7 + internal/README.md | 3 + internal/qasm3.g4 | 486 + internal/qasm3/qasm3.interp | 324 + internal/qasm3/qasm3.tokens | 218 + internal/qasm3/qasm3Lexer.interp | 369 + internal/qasm3/qasm3Lexer.tokens | 218 + internal/qasm3/qasm3_base_listener.go | 542 ++ internal/qasm3/qasm3_lexer.go | 583 ++ internal/qasm3/qasm3_listener.go | 520 ++ internal/qasm3/qasm3_parser.go | 11874 ++++++++++++++++++++++++ internal/qasm3_old.g4 | 98 + 12 files changed, 15242 insertions(+) create mode 100644 internal/Makefile create mode 100644 internal/README.md create mode 100644 internal/qasm3.g4 create mode 100644 internal/qasm3/qasm3.interp create mode 100644 internal/qasm3/qasm3.tokens create mode 100644 internal/qasm3/qasm3Lexer.interp create mode 100644 internal/qasm3/qasm3Lexer.tokens create mode 100644 internal/qasm3/qasm3_base_listener.go create mode 100644 internal/qasm3/qasm3_lexer.go create mode 100644 internal/qasm3/qasm3_listener.go create mode 100644 internal/qasm3/qasm3_parser.go create mode 100644 internal/qasm3_old.g4 diff --git a/internal/Makefile b/internal/Makefile new file mode 100644 index 0000000..b28b4e7 --- /dev/null +++ b/internal/Makefile @@ -0,0 +1,7 @@ +CLASSPATH=".:/usr/local/lib/antlr-4.9-complete.jar:$${CLASSPATH}" +antlr4=java -jar /usr/local/lib/antlr-4.9-complete.jar +grun=java org.antlr.v4.gui.TestRig + +.PHONY: qasm3 +qasm3: + $(antlr4) -Dlanguage=Go -o $@ ./$@.g4 diff --git a/internal/README.md b/internal/README.md new file mode 100644 index 0000000..21920d2 --- /dev/null +++ b/internal/README.md @@ -0,0 +1,3 @@ +# Grammar OpenQAMS3 + +Source [there](https://github.com/Qiskit/openqasm/blob/master/source/grammar/qasm3.g4) diff --git a/internal/qasm3.g4 b/internal/qasm3.g4 new file mode 100644 index 0000000..7634db8 --- /dev/null +++ b/internal/qasm3.g4 @@ -0,0 +1,486 @@ +/**** ANTLRv4 grammar for OpenQASM3.0. ****/ + +grammar qasm3; + +/** Parser grammar **/ + +program + : header statement* + ; + +header + : version? include* + ; + +version + : 'OPENQASM' Integer (DOT Integer)? SEMICOLON + ; + +include + : 'include' StringLiteral SEMICOLON + ; + +statement + : globalStatement + | expressionStatement + | declarationStatement + | branchingStatement + | loopStatement + | controlDirectiveStatement + | aliasStatement + | quantumStatement + | timeStatement + | pragma + | comment + ; + +globalStatement: subroutineDefinition + | kernelDeclaration + | quantumGateDefinition + | calibrationDefinition + ; + +declarationStatement + : ( quantumDeclaration | classicalDeclaration | constantDeclaration) SEMICOLON + ; + +comment : LineComment | BlockComment ; + +returnSignature + : ARROW classicalDeclaration + ; + +programBlock + : LBRACE ( programBlock | statement ) RBRACE + ; + +/* Types and Casting */ + +designator + : LBRACKET expression RBRACKET + ; + +doubleDesignator + : LBRACKET expression COMMA expression RBRACKET + ; + +identifierList + : ( Identifier COMMA )* Identifier + ; + +indexIdentifier + : Identifier ( designator | doubleDesignator | rangeDefinition )? + ; + +indexIdentifierList + : ( indexIdentifier COMMA )* indexIdentifier + ; + +association + : COLON Identifier + ; + +// Quantum Types +quantumType + : 'qubit' + | 'qreg' + ; + +quantumDeclaration + : quantumType indexIdentifierList + ; + +quantumArgument + : quantumType designator? association + ; + +quantumArgumentList + : ( quantumArgument COMMA )* quantumArgument + ; + +// Classical Types +bitType + : 'bit' + | 'creg' + ; + +singleDesignatorType + : 'int' + | 'uint' + | 'float' + | 'angle' + ; + +doubleDesignatorType + : 'fixed' + ; + +noDesignatorType + : 'bool' + | timingType + ; + +classicalType + : singleDesignatorType designator? + | doubleDesignatorType doubleDesignator? + | noDesignatorType + | bitType designator? + ; + +constantDeclaration + : 'const' Identifier ASSIGN expression + ; + +singleDesignatorDeclaration + : singleDesignatorType designator Identifier + ; + +doubleDesignatorDeclaration + : doubleDesignatorType doubleDesignator Identifier + ; + +noDesignatorDeclaration + : noDesignatorType Identifier + ; + +bitDeclaration + : bitType Identifier designator + ; + +classicalVariableDeclaration + : singleDesignatorDeclaration + | doubleDesignatorDeclaration + | noDesignatorDeclaration + | bitDeclaration + ; + +classicalDeclaration + : classicalVariableDeclaration assignmentExpression? + ; + +classicalTypeList + : ( classicalType COMMA )* classicalType + ; + +classicalArgument + : classicalType association + ; + +classicalArgumentList + : ( classicalArgument COMMA )* classicalArgument + ; + +// Aliasing +aliasStatement + : 'let' Identifier ASSIGN concatenateExpression + ; + +// Register Concatenation and Slicing +concatenateExpression + : ASSIGN + ( Identifier rangeDefinition + | Identifier '||' Identifier + | Identifier LBRACKET expressionList RBRACKET ) + ; + +rangeDefinition + : LBRACKET expression? COLON expression? ( COLON expression )? RBRACKET + ; + +/* Gates and Built-in Quantum Instructions */ + +quantumGateDefinition + : 'gate' quantumGateSignature quantumBlock + ; + +quantumGateSignature + : Identifier ( LPAREN classicalArgumentList? RPAREN )? identifierList + ; + +quantumBlock + : LBRACE quantumStatement* RBRACE + ; + +quantumStatement + : ( quantumInstruction | quantumMeasurementDeclaration ) SEMICOLON + ; + +quantumInstruction + : quantumGateCall + | quantumMeasurement + | quantumBarrier + ; + +quantumMeasurement + : 'measure' indexIdentifierList + ; + +quantumMeasurementDeclaration + : quantumMeasurement ARROW indexIdentifierList + | indexIdentifierList ASSIGN quantumMeasurement + ; + +quantumBarrier + : 'barrier' indexIdentifierList + ; + +quantumGateModifier + : ( 'inv' | 'pow' LPAREN Integer RPAREN | 'ctrl' ) '@' + ; + +quantumGateCall + : quantumGateName ( LPAREN expressionList? RPAREN )? indexIdentifierList + ; + +quantumGateName + : 'CX' + | 'U' + | 'reset' + | Identifier + | quantumGateModifier quantumGateName + ; + +/* Classical Instructions */ + +unaryOperator + : '~' | '!' + ; + +binaryOperator + : '+' | '-' | '*' | '/' | '<<' | '>>' | 'rotl' | 'rotr' | '&&' | '||' | '&' | '|' | '^' + | '>' | '<' | '>=' | '<=' | '==' | '!=' + ; + +expressionStatement + : expression SEMICOLON + | 'return' expressionStatement + ; + +expression + : expression binaryOperator expression + | unaryOperator expression + | membershipTest + | expression LBRACKET expression RBRACKET + | call LPAREN expressionList? RPAREN + | expression incrementor + | quantumMeasurement + | expressionTerminator + ; + +expressionTerminator + : Constant + | Integer + | RealNumber + | Identifier + | StringLiteral + | timeTerminator + ; + +expressionList + : ( expression COMMA )* expression + ; + +call + : Identifier + | builtInMath + | castOperator + ; + +builtInMath + : 'sin' | 'cos' | 'tan' | 'exp' | 'ln' | 'sqrt' | 'popcount' | 'lengthof' + ; + +castOperator + : classicalType + ; + +incrementor + : '++' + | '--' + ; + +assignmentExpression + : assignmentOperator expression + ; + +assignmentOperator + : ASSIGN + | ARROW + | '+=' | '-=' | '*=' | '/=' | '&=' | '|=' | '~=' | '^=' | '<<=' | '>>=' + ; + +membershipTest + : Identifier 'in' setDeclaration + ; + +setDeclaration + : LBRACE expressionList RBRACE + | rangeDefinition + ; + +loopBranchBlock + : statement + | programBlock + ; + +branchingStatement + : 'if' LPAREN expression RPAREN loopBranchBlock ( 'else' loopBranchBlock )? + ; + +loopStatement: ( 'for' membershipTest | 'while' LPAREN expression RPAREN ) loopBranchBlock + ; + +controlDirectiveStatement + : controlDirective SEMICOLON + ; + +controlDirective + : 'break' + | 'continue' + | 'end' + ; + +kernelDeclaration + : 'kernel' Identifier ( LPAREN classicalTypeList? RPAREN )? returnSignature? + classicalType? SEMICOLON + ; + +/* Subroutines */ + +subroutineDefinition + : 'def' Identifier ( LPAREN subroutineArgumentList? RPAREN )? returnSignature? programBlock + ; + +subroutineArgumentList + : classicalArgumentList | quantumArgumentList + ; + +/* Directives */ + +pragma + : '#pragma' LBRACE . RBRACE + ; + +/* Circuit Timing */ + +timeUnit + : 'dt' | 'ns' | 'us' | 'ms' | 's' + ; + +timingType + : 'length' + | 'stretch' Integer? + ; + +timingBox + : 'boxas' Identifier quantumBlock + | 'boxto' timeUnit quantumBlock + ; + +timeTerminator + : timeIdentifier | 'stretchinf' + ; + +timeIdentifier + : Identifier timeUnit? + | 'lengthof' LPAREN Identifier RPAREN + ; + + +timeInstructionName + : 'delay' + | 'rotary' + ; + +timeInstruction + : timeInstructionName ( LPAREN expressionList? RPAREN )? designator + ( rangeDefinition | indexIdentifierList ) + ; + +timeStatement + : timeInstruction SEMICOLON + | timingBox + ; + +/* Pulse Level Descriptions of Gates and Measurement */ + +calibration + : calibrationGrammarDeclaration + | calibrationDefinition + ; + +calibrationGrammarDeclaration + : 'defcalgrammar' calibrationGrammar SEMICOLON + ; + +calibrationDefinition + : 'defcal' calibrationGrammar? Identifier + ( LPAREN calibrationArgumentList? RPAREN )? identifierList + returnSignature? LBRACE . RBRACE + ; + +calibrationGrammar + : 'openpulse' | Identifier + ; + +calibrationArgumentList + : classicalArgumentList | expressionList + ; + +/** Lexer grammar **/ + +LBRACKET : '[' ; +RBRACKET : ']' ; + +LBRACE : '{' ; +RBRACE : '}' ; + +LPAREN : '(' ; +RPAREN : ')' ; + +COLON: ':' ; +SEMICOLON : ';' ; + +DOT : '.' ; +COMMA : ',' ; + +ASSIGN : '=' ; +ARROW : '->' ; + +Constant : 'pi' | 'π' | 'tau' | '𝜏' | 'euler' | 'e' ; + +Whitespace : [ \t]+ -> skip ; +Newline : [\r\n]+ -> skip ; + +fragment Digit : [0-9] ; +Integer : Digit+ ; + +fragment LowerCaseCharacter : [a-z] ; +fragment UpperCaseCharacter : [A-Z] ; + +fragment SciNotation : [eE] ; +fragment PlusMinus : [-+] ; + +Float : Integer* DOT Integer+ ; + +RealNumber : Float (SciNotation PlusMinus? Float)? ; + +fragment NumericalCharacter + : LowerCaseCharacter + | UpperCaseCharacter + | '_' + | Integer + ; + +Identifier : LowerCaseCharacter ( NumericalCharacter )* ; + +fragment Quotation : '"' | '\'' ; + +StringLiteral : Quotation Any Quotation ; + +fragment AnyString : ~[ \t\r\n]+? ; +fragment Any : ( AnyString | Whitespace | Newline )+ ; +fragment AnyBlock : LBRACE Any? RBRACE ; + +LineComment : '//' Any ; // Token because Any matches all strings +BlockComment : '/*' Any '*/' ; // Token because Any matches all strings diff --git a/internal/qasm3/qasm3.interp b/internal/qasm3/qasm3.interp new file mode 100644 index 0000000..3c28134 --- /dev/null +++ b/internal/qasm3/qasm3.interp @@ -0,0 +1,324 @@ +token literal names: +null +'OPENQASM' +'include' +'qubit' +'qreg' +'bit' +'creg' +'int' +'uint' +'float' +'angle' +'fixed' +'bool' +'const' +'let' +'||' +'gate' +'measure' +'barrier' +'inv' +'pow' +'ctrl' +'@' +'CX' +'U' +'reset' +'~' +'!' +'+' +'-' +'*' +'/' +'<<' +'>>' +'rotl' +'rotr' +'&&' +'&' +'|' +'^' +'>' +'<' +'>=' +'<=' +'==' +'!=' +'return' +'sin' +'cos' +'tan' +'exp' +'ln' +'sqrt' +'popcount' +'lengthof' +'++' +'--' +'+=' +'-=' +'*=' +'/=' +'&=' +'|=' +'~=' +'^=' +'<<=' +'>>=' +'in' +'if' +'else' +'for' +'while' +'break' +'continue' +'end' +'kernel' +'def' +'#pragma' +'dt' +'ns' +'us' +'ms' +'s' +'length' +'stretch' +'boxas' +'boxto' +'stretchinf' +'delay' +'rotary' +'defcalgrammar' +'defcal' +'openpulse' +'[' +']' +'{' +'}' +'(' +')' +':' +';' +'.' +',' +'=' +'->' +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +LBRACKET +RBRACKET +LBRACE +RBRACE +LPAREN +RPAREN +COLON +SEMICOLON +DOT +COMMA +ASSIGN +ARROW +Constant +Whitespace +Newline +Integer +Float +RealNumber +Identifier +StringLiteral +LineComment +BlockComment + +rule names: +program +header +version +include +statement +globalStatement +declarationStatement +comment +returnSignature +programBlock +designator +doubleDesignator +identifierList +indexIdentifier +indexIdentifierList +association +quantumType +quantumDeclaration +quantumArgument +quantumArgumentList +bitType +singleDesignatorType +doubleDesignatorType +noDesignatorType +classicalType +constantDeclaration +singleDesignatorDeclaration +doubleDesignatorDeclaration +noDesignatorDeclaration +bitDeclaration +classicalVariableDeclaration +classicalDeclaration +classicalTypeList +classicalArgument +classicalArgumentList +aliasStatement +concatenateExpression +rangeDefinition +quantumGateDefinition +quantumGateSignature +quantumBlock +quantumStatement +quantumInstruction +quantumMeasurement +quantumMeasurementDeclaration +quantumBarrier +quantumGateModifier +quantumGateCall +quantumGateName +unaryOperator +binaryOperator +expressionStatement +expression +expressionTerminator +expressionList +call +builtInMath +castOperator +incrementor +assignmentExpression +assignmentOperator +membershipTest +setDeclaration +loopBranchBlock +branchingStatement +loopStatement +controlDirectiveStatement +controlDirective +kernelDeclaration +subroutineDefinition +subroutineArgumentList +pragma +timeUnit +timingType +timingBox +timeTerminator +timeIdentifier +timeInstructionName +timeInstruction +timeStatement +calibration +calibrationGrammarDeclaration +calibrationDefinition +calibrationGrammar +calibrationArgumentList + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 116, 731, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 3, 2, 3, 2, 7, 2, 175, 10, 2, 12, 2, 14, 2, 178, 11, 2, 3, 3, 5, 3, 181, 10, 3, 3, 3, 7, 3, 184, 10, 3, 12, 3, 14, 3, 187, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 193, 10, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 212, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 218, 10, 7, 3, 8, 3, 8, 3, 8, 5, 8, 223, 10, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 5, 11, 235, 10, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 7, 14, 251, 10, 14, 12, 14, 14, 14, 254, 11, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 262, 10, 15, 3, 16, 3, 16, 3, 16, 7, 16, 267, 10, 16, 12, 16, 14, 16, 270, 11, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 284, 10, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 7, 21, 291, 10, 21, 12, 21, 14, 21, 294, 11, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 306, 10, 25, 3, 26, 3, 26, 5, 26, 310, 10, 26, 3, 26, 3, 26, 5, 26, 314, 10, 26, 3, 26, 3, 26, 3, 26, 5, 26, 319, 10, 26, 5, 26, 321, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 347, 10, 32, 3, 33, 3, 33, 5, 33, 351, 10, 33, 3, 34, 3, 34, 3, 34, 7, 34, 356, 10, 34, 12, 34, 14, 34, 359, 11, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 7, 36, 369, 10, 36, 12, 36, 14, 36, 372, 11, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 392, 10, 38, 3, 39, 3, 39, 5, 39, 396, 10, 39, 3, 39, 3, 39, 5, 39, 400, 10, 39, 3, 39, 3, 39, 5, 39, 404, 10, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 5, 41, 415, 10, 41, 3, 41, 5, 41, 418, 10, 41, 3, 41, 3, 41, 3, 42, 3, 42, 7, 42, 424, 10, 42, 12, 42, 14, 42, 427, 11, 42, 3, 42, 3, 42, 3, 43, 3, 43, 5, 43, 433, 10, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 5, 44, 440, 10, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 5, 46, 453, 10, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 464, 10, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 5, 49, 471, 10, 49, 3, 49, 5, 49, 474, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 485, 10, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 496, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 506, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 512, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 525, 10, 54, 12, 54, 14, 54, 528, 11, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 536, 10, 55, 3, 56, 3, 56, 3, 56, 7, 56, 541, 10, 56, 12, 56, 14, 56, 544, 11, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 5, 57, 551, 10, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 5, 64, 573, 10, 64, 3, 65, 3, 65, 5, 65, 577, 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 5, 66, 586, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 595, 10, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 5, 70, 608, 10, 70, 3, 70, 5, 70, 611, 10, 70, 3, 70, 5, 70, 614, 10, 70, 3, 70, 5, 70, 617, 10, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 5, 71, 625, 10, 71, 3, 71, 5, 71, 628, 10, 71, 3, 71, 5, 71, 631, 10, 71, 3, 71, 3, 71, 3, 72, 3, 72, 5, 72, 637, 10, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 5, 75, 649, 10, 75, 5, 75, 651, 10, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 5, 76, 660, 10, 76, 3, 77, 3, 77, 5, 77, 664, 10, 77, 3, 78, 3, 78, 5, 78, 668, 10, 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 674, 10, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 5, 80, 681, 10, 80, 3, 80, 5, 80, 684, 10, 80, 3, 80, 3, 80, 3, 80, 5, 80, 689, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 695, 10, 81, 3, 82, 3, 82, 5, 82, 699, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 5, 84, 707, 10, 84, 3, 84, 3, 84, 3, 84, 5, 84, 712, 10, 84, 3, 84, 5, 84, 715, 10, 84, 3, 84, 3, 84, 5, 84, 719, 10, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 5, 86, 729, 10, 86, 3, 86, 2, 3, 106, 87, 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, 2, 15, 3, 2, 115, 116, 3, 2, 5, 6, 3, 2, 7, 8, 3, 2, 9, 12, 3, 2, 28, 29, 4, 2, 17, 17, 30, 47, 3, 2, 49, 56, 3, 2, 57, 58, 4, 2, 59, 68, 105, 106, 3, 2, 74, 76, 3, 2, 80, 84, 3, 2, 90, 91, 4, 2, 94, 94, 113, 113, 2, 750, 2, 172, 3, 2, 2, 2, 4, 180, 3, 2, 2, 2, 6, 188, 3, 2, 2, 2, 8, 196, 3, 2, 2, 2, 10, 211, 3, 2, 2, 2, 12, 217, 3, 2, 2, 2, 14, 222, 3, 2, 2, 2, 16, 226, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 231, 3, 2, 2, 2, 22, 238, 3, 2, 2, 2, 24, 242, 3, 2, 2, 2, 26, 252, 3, 2, 2, 2, 28, 257, 3, 2, 2, 2, 30, 268, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 276, 3, 2, 2, 2, 36, 278, 3, 2, 2, 2, 38, 281, 3, 2, 2, 2, 40, 292, 3, 2, 2, 2, 42, 297, 3, 2, 2, 2, 44, 299, 3, 2, 2, 2, 46, 301, 3, 2, 2, 2, 48, 305, 3, 2, 2, 2, 50, 320, 3, 2, 2, 2, 52, 322, 3, 2, 2, 2, 54, 327, 3, 2, 2, 2, 56, 331, 3, 2, 2, 2, 58, 335, 3, 2, 2, 2, 60, 338, 3, 2, 2, 2, 62, 346, 3, 2, 2, 2, 64, 348, 3, 2, 2, 2, 66, 357, 3, 2, 2, 2, 68, 362, 3, 2, 2, 2, 70, 370, 3, 2, 2, 2, 72, 375, 3, 2, 2, 2, 74, 380, 3, 2, 2, 2, 76, 393, 3, 2, 2, 2, 78, 407, 3, 2, 2, 2, 80, 411, 3, 2, 2, 2, 82, 421, 3, 2, 2, 2, 84, 432, 3, 2, 2, 2, 86, 439, 3, 2, 2, 2, 88, 441, 3, 2, 2, 2, 90, 452, 3, 2, 2, 2, 92, 454, 3, 2, 2, 2, 94, 463, 3, 2, 2, 2, 96, 467, 3, 2, 2, 2, 98, 484, 3, 2, 2, 2, 100, 486, 3, 2, 2, 2, 102, 488, 3, 2, 2, 2, 104, 495, 3, 2, 2, 2, 106, 511, 3, 2, 2, 2, 108, 535, 3, 2, 2, 2, 110, 542, 3, 2, 2, 2, 112, 550, 3, 2, 2, 2, 114, 552, 3, 2, 2, 2, 116, 554, 3, 2, 2, 2, 118, 556, 3, 2, 2, 2, 120, 558, 3, 2, 2, 2, 122, 561, 3, 2, 2, 2, 124, 563, 3, 2, 2, 2, 126, 572, 3, 2, 2, 2, 128, 576, 3, 2, 2, 2, 130, 578, 3, 2, 2, 2, 132, 594, 3, 2, 2, 2, 134, 598, 3, 2, 2, 2, 136, 601, 3, 2, 2, 2, 138, 603, 3, 2, 2, 2, 140, 620, 3, 2, 2, 2, 142, 636, 3, 2, 2, 2, 144, 638, 3, 2, 2, 2, 146, 643, 3, 2, 2, 2, 148, 650, 3, 2, 2, 2, 150, 659, 3, 2, 2, 2, 152, 663, 3, 2, 2, 2, 154, 673, 3, 2, 2, 2, 156, 675, 3, 2, 2, 2, 158, 677, 3, 2, 2, 2, 160, 694, 3, 2, 2, 2, 162, 698, 3, 2, 2, 2, 164, 700, 3, 2, 2, 2, 166, 704, 3, 2, 2, 2, 168, 724, 3, 2, 2, 2, 170, 728, 3, 2, 2, 2, 172, 176, 5, 4, 3, 2, 173, 175, 5, 10, 6, 2, 174, 173, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 3, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, 6, 4, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 185, 3, 2, 2, 2, 182, 184, 5, 8, 5, 2, 183, 182, 3, 2, 2, 2, 184, 187, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 5, 3, 2, 2, 2, 187, 185, 3, 2, 2, 2, 188, 189, 7, 3, 2, 2, 189, 192, 7, 110, 2, 2, 190, 191, 7, 103, 2, 2, 191, 193, 7, 110, 2, 2, 192, 190, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 102, 2, 2, 195, 7, 3, 2, 2, 2, 196, 197, 7, 4, 2, 2, 197, 198, 7, 114, 2, 2, 198, 199, 7, 102, 2, 2, 199, 9, 3, 2, 2, 2, 200, 212, 5, 12, 7, 2, 201, 212, 5, 104, 53, 2, 202, 212, 5, 14, 8, 2, 203, 212, 5, 130, 66, 2, 204, 212, 5, 132, 67, 2, 205, 212, 5, 134, 68, 2, 206, 212, 5, 72, 37, 2, 207, 212, 5, 84, 43, 2, 208, 212, 5, 160, 81, 2, 209, 212, 5, 144, 73, 2, 210, 212, 5, 16, 9, 2, 211, 200, 3, 2, 2, 2, 211, 201, 3, 2, 2, 2, 211, 202, 3, 2, 2, 2, 211, 203, 3, 2, 2, 2, 211, 204, 3, 2, 2, 2, 211, 205, 3, 2, 2, 2, 211, 206, 3, 2, 2, 2, 211, 207, 3, 2, 2, 2, 211, 208, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 210, 3, 2, 2, 2, 212, 11, 3, 2, 2, 2, 213, 218, 5, 140, 71, 2, 214, 218, 5, 138, 70, 2, 215, 218, 5, 78, 40, 2, 216, 218, 5, 166, 84, 2, 217, 213, 3, 2, 2, 2, 217, 214, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 217, 216, 3, 2, 2, 2, 218, 13, 3, 2, 2, 2, 219, 223, 5, 36, 19, 2, 220, 223, 5, 64, 33, 2, 221, 223, 5, 52, 27, 2, 222, 219, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, 222, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 7, 102, 2, 2, 225, 15, 3, 2, 2, 2, 226, 227, 9, 2, 2, 2, 227, 17, 3, 2, 2, 2, 228, 229, 7, 106, 2, 2, 229, 230, 5, 64, 33, 2, 230, 19, 3, 2, 2, 2, 231, 234, 7, 97, 2, 2, 232, 235, 5, 20, 11, 2, 233, 235, 5, 10, 6, 2, 234, 232, 3, 2, 2, 2, 234, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 237, 7, 98, 2, 2, 237, 21, 3, 2, 2, 2, 238, 239, 7, 95, 2, 2, 239, 240, 5, 106, 54, 2, 240, 241, 7, 96, 2, 2, 241, 23, 3, 2, 2, 2, 242, 243, 7, 95, 2, 2, 243, 244, 5, 106, 54, 2, 244, 245, 7, 104, 2, 2, 245, 246, 5, 106, 54, 2, 246, 247, 7, 96, 2, 2, 247, 25, 3, 2, 2, 2, 248, 249, 7, 113, 2, 2, 249, 251, 7, 104, 2, 2, 250, 248, 3, 2, 2, 2, 251, 254, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 255, 3, 2, 2, 2, 254, 252, 3, 2, 2, 2, 255, 256, 7, 113, 2, 2, 256, 27, 3, 2, 2, 2, 257, 261, 7, 113, 2, 2, 258, 262, 5, 22, 12, 2, 259, 262, 5, 24, 13, 2, 260, 262, 5, 76, 39, 2, 261, 258, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 29, 3, 2, 2, 2, 263, 264, 5, 28, 15, 2, 264, 265, 7, 104, 2, 2, 265, 267, 3, 2, 2, 2, 266, 263, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 268, 3, 2, 2, 2, 271, 272, 5, 28, 15, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 101, 2, 2, 274, 275, 7, 113, 2, 2, 275, 33, 3, 2, 2, 2, 276, 277, 9, 3, 2, 2, 277, 35, 3, 2, 2, 2, 278, 279, 5, 34, 18, 2, 279, 280, 5, 30, 16, 2, 280, 37, 3, 2, 2, 2, 281, 283, 5, 34, 18, 2, 282, 284, 5, 22, 12, 2, 283, 282, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 286, 5, 32, 17, 2, 286, 39, 3, 2, 2, 2, 287, 288, 5, 38, 20, 2, 288, 289, 7, 104, 2, 2, 289, 291, 3, 2, 2, 2, 290, 287, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 295, 296, 5, 38, 20, 2, 296, 41, 3, 2, 2, 2, 297, 298, 9, 4, 2, 2, 298, 43, 3, 2, 2, 2, 299, 300, 9, 5, 2, 2, 300, 45, 3, 2, 2, 2, 301, 302, 7, 13, 2, 2, 302, 47, 3, 2, 2, 2, 303, 306, 7, 14, 2, 2, 304, 306, 5, 148, 75, 2, 305, 303, 3, 2, 2, 2, 305, 304, 3, 2, 2, 2, 306, 49, 3, 2, 2, 2, 307, 309, 5, 44, 23, 2, 308, 310, 5, 22, 12, 2, 309, 308, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 321, 3, 2, 2, 2, 311, 313, 5, 46, 24, 2, 312, 314, 5, 24, 13, 2, 313, 312, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 321, 3, 2, 2, 2, 315, 321, 5, 48, 25, 2, 316, 318, 5, 42, 22, 2, 317, 319, 5, 22, 12, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 321, 3, 2, 2, 2, 320, 307, 3, 2, 2, 2, 320, 311, 3, 2, 2, 2, 320, 315, 3, 2, 2, 2, 320, 316, 3, 2, 2, 2, 321, 51, 3, 2, 2, 2, 322, 323, 7, 15, 2, 2, 323, 324, 7, 113, 2, 2, 324, 325, 7, 105, 2, 2, 325, 326, 5, 106, 54, 2, 326, 53, 3, 2, 2, 2, 327, 328, 5, 44, 23, 2, 328, 329, 5, 22, 12, 2, 329, 330, 7, 113, 2, 2, 330, 55, 3, 2, 2, 2, 331, 332, 5, 46, 24, 2, 332, 333, 5, 24, 13, 2, 333, 334, 7, 113, 2, 2, 334, 57, 3, 2, 2, 2, 335, 336, 5, 48, 25, 2, 336, 337, 7, 113, 2, 2, 337, 59, 3, 2, 2, 2, 338, 339, 5, 42, 22, 2, 339, 340, 7, 113, 2, 2, 340, 341, 5, 22, 12, 2, 341, 61, 3, 2, 2, 2, 342, 347, 5, 54, 28, 2, 343, 347, 5, 56, 29, 2, 344, 347, 5, 58, 30, 2, 345, 347, 5, 60, 31, 2, 346, 342, 3, 2, 2, 2, 346, 343, 3, 2, 2, 2, 346, 344, 3, 2, 2, 2, 346, 345, 3, 2, 2, 2, 347, 63, 3, 2, 2, 2, 348, 350, 5, 62, 32, 2, 349, 351, 5, 120, 61, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 65, 3, 2, 2, 2, 352, 353, 5, 50, 26, 2, 353, 354, 7, 104, 2, 2, 354, 356, 3, 2, 2, 2, 355, 352, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 360, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, 360, 361, 5, 50, 26, 2, 361, 67, 3, 2, 2, 2, 362, 363, 5, 50, 26, 2, 363, 364, 5, 32, 17, 2, 364, 69, 3, 2, 2, 2, 365, 366, 5, 68, 35, 2, 366, 367, 7, 104, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 373, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 68, 35, 2, 374, 71, 3, 2, 2, 2, 375, 376, 7, 16, 2, 2, 376, 377, 7, 113, 2, 2, 377, 378, 7, 105, 2, 2, 378, 379, 5, 74, 38, 2, 379, 73, 3, 2, 2, 2, 380, 391, 7, 105, 2, 2, 381, 382, 7, 113, 2, 2, 382, 392, 5, 76, 39, 2, 383, 384, 7, 113, 2, 2, 384, 385, 7, 17, 2, 2, 385, 392, 7, 113, 2, 2, 386, 387, 7, 113, 2, 2, 387, 388, 7, 95, 2, 2, 388, 389, 5, 110, 56, 2, 389, 390, 7, 96, 2, 2, 390, 392, 3, 2, 2, 2, 391, 381, 3, 2, 2, 2, 391, 383, 3, 2, 2, 2, 391, 386, 3, 2, 2, 2, 392, 75, 3, 2, 2, 2, 393, 395, 7, 95, 2, 2, 394, 396, 5, 106, 54, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 399, 7, 101, 2, 2, 398, 400, 5, 106, 54, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 403, 3, 2, 2, 2, 401, 402, 7, 101, 2, 2, 402, 404, 5, 106, 54, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 7, 96, 2, 2, 406, 77, 3, 2, 2, 2, 407, 408, 7, 18, 2, 2, 408, 409, 5, 80, 41, 2, 409, 410, 5, 82, 42, 2, 410, 79, 3, 2, 2, 2, 411, 417, 7, 113, 2, 2, 412, 414, 7, 99, 2, 2, 413, 415, 5, 70, 36, 2, 414, 413, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 418, 7, 100, 2, 2, 417, 412, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 420, 5, 26, 14, 2, 420, 81, 3, 2, 2, 2, 421, 425, 7, 97, 2, 2, 422, 424, 5, 84, 43, 2, 423, 422, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 7, 98, 2, 2, 429, 83, 3, 2, 2, 2, 430, 433, 5, 86, 44, 2, 431, 433, 5, 90, 46, 2, 432, 430, 3, 2, 2, 2, 432, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 435, 7, 102, 2, 2, 435, 85, 3, 2, 2, 2, 436, 440, 5, 96, 49, 2, 437, 440, 5, 88, 45, 2, 438, 440, 5, 92, 47, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 87, 3, 2, 2, 2, 441, 442, 7, 19, 2, 2, 442, 443, 5, 30, 16, 2, 443, 89, 3, 2, 2, 2, 444, 445, 5, 88, 45, 2, 445, 446, 7, 106, 2, 2, 446, 447, 5, 30, 16, 2, 447, 453, 3, 2, 2, 2, 448, 449, 5, 30, 16, 2, 449, 450, 7, 105, 2, 2, 450, 451, 5, 88, 45, 2, 451, 453, 3, 2, 2, 2, 452, 444, 3, 2, 2, 2, 452, 448, 3, 2, 2, 2, 453, 91, 3, 2, 2, 2, 454, 455, 7, 20, 2, 2, 455, 456, 5, 30, 16, 2, 456, 93, 3, 2, 2, 2, 457, 464, 7, 21, 2, 2, 458, 459, 7, 22, 2, 2, 459, 460, 7, 99, 2, 2, 460, 461, 7, 110, 2, 2, 461, 464, 7, 100, 2, 2, 462, 464, 7, 23, 2, 2, 463, 457, 3, 2, 2, 2, 463, 458, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 24, 2, 2, 466, 95, 3, 2, 2, 2, 467, 473, 5, 98, 50, 2, 468, 470, 7, 99, 2, 2, 469, 471, 5, 110, 56, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 7, 100, 2, 2, 473, 468, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 5, 30, 16, 2, 476, 97, 3, 2, 2, 2, 477, 485, 7, 25, 2, 2, 478, 485, 7, 26, 2, 2, 479, 485, 7, 27, 2, 2, 480, 485, 7, 113, 2, 2, 481, 482, 5, 94, 48, 2, 482, 483, 5, 98, 50, 2, 483, 485, 3, 2, 2, 2, 484, 477, 3, 2, 2, 2, 484, 478, 3, 2, 2, 2, 484, 479, 3, 2, 2, 2, 484, 480, 3, 2, 2, 2, 484, 481, 3, 2, 2, 2, 485, 99, 3, 2, 2, 2, 486, 487, 9, 6, 2, 2, 487, 101, 3, 2, 2, 2, 488, 489, 9, 7, 2, 2, 489, 103, 3, 2, 2, 2, 490, 491, 5, 106, 54, 2, 491, 492, 7, 102, 2, 2, 492, 496, 3, 2, 2, 2, 493, 494, 7, 48, 2, 2, 494, 496, 5, 104, 53, 2, 495, 490, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 496, 105, 3, 2, 2, 2, 497, 498, 8, 54, 1, 2, 498, 499, 5, 100, 51, 2, 499, 500, 5, 106, 54, 9, 500, 512, 3, 2, 2, 2, 501, 512, 5, 124, 63, 2, 502, 503, 5, 112, 57, 2, 503, 505, 7, 99, 2, 2, 504, 506, 5, 110, 56, 2, 505, 504, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 100, 2, 2, 508, 512, 3, 2, 2, 2, 509, 512, 5, 88, 45, 2, 510, 512, 5, 108, 55, 2, 511, 497, 3, 2, 2, 2, 511, 501, 3, 2, 2, 2, 511, 502, 3, 2, 2, 2, 511, 509, 3, 2, 2, 2, 511, 510, 3, 2, 2, 2, 512, 526, 3, 2, 2, 2, 513, 514, 12, 10, 2, 2, 514, 515, 5, 102, 52, 2, 515, 516, 5, 106, 54, 11, 516, 525, 3, 2, 2, 2, 517, 518, 12, 7, 2, 2, 518, 519, 7, 95, 2, 2, 519, 520, 5, 106, 54, 2, 520, 521, 7, 96, 2, 2, 521, 525, 3, 2, 2, 2, 522, 523, 12, 5, 2, 2, 523, 525, 5, 118, 60, 2, 524, 513, 3, 2, 2, 2, 524, 517, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 107, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 529, 536, 7, 107, 2, 2, 530, 536, 7, 110, 2, 2, 531, 536, 7, 112, 2, 2, 532, 536, 7, 113, 2, 2, 533, 536, 7, 114, 2, 2, 534, 536, 5, 152, 77, 2, 535, 529, 3, 2, 2, 2, 535, 530, 3, 2, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 109, 3, 2, 2, 2, 537, 538, 5, 106, 54, 2, 538, 539, 7, 104, 2, 2, 539, 541, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 541, 544, 3, 2, 2, 2, 542, 540, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 545, 3, 2, 2, 2, 544, 542, 3, 2, 2, 2, 545, 546, 5, 106, 54, 2, 546, 111, 3, 2, 2, 2, 547, 551, 7, 113, 2, 2, 548, 551, 5, 114, 58, 2, 549, 551, 5, 116, 59, 2, 550, 547, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 549, 3, 2, 2, 2, 551, 113, 3, 2, 2, 2, 552, 553, 9, 8, 2, 2, 553, 115, 3, 2, 2, 2, 554, 555, 5, 50, 26, 2, 555, 117, 3, 2, 2, 2, 556, 557, 9, 9, 2, 2, 557, 119, 3, 2, 2, 2, 558, 559, 5, 122, 62, 2, 559, 560, 5, 106, 54, 2, 560, 121, 3, 2, 2, 2, 561, 562, 9, 10, 2, 2, 562, 123, 3, 2, 2, 2, 563, 564, 7, 113, 2, 2, 564, 565, 7, 69, 2, 2, 565, 566, 5, 126, 64, 2, 566, 125, 3, 2, 2, 2, 567, 568, 7, 97, 2, 2, 568, 569, 5, 110, 56, 2, 569, 570, 7, 98, 2, 2, 570, 573, 3, 2, 2, 2, 571, 573, 5, 76, 39, 2, 572, 567, 3, 2, 2, 2, 572, 571, 3, 2, 2, 2, 573, 127, 3, 2, 2, 2, 574, 577, 5, 10, 6, 2, 575, 577, 5, 20, 11, 2, 576, 574, 3, 2, 2, 2, 576, 575, 3, 2, 2, 2, 577, 129, 3, 2, 2, 2, 578, 579, 7, 70, 2, 2, 579, 580, 7, 99, 2, 2, 580, 581, 5, 106, 54, 2, 581, 582, 7, 100, 2, 2, 582, 585, 5, 128, 65, 2, 583, 584, 7, 71, 2, 2, 584, 586, 5, 128, 65, 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 131, 3, 2, 2, 2, 587, 588, 7, 72, 2, 2, 588, 595, 5, 124, 63, 2, 589, 590, 7, 73, 2, 2, 590, 591, 7, 99, 2, 2, 591, 592, 5, 106, 54, 2, 592, 593, 7, 100, 2, 2, 593, 595, 3, 2, 2, 2, 594, 587, 3, 2, 2, 2, 594, 589, 3, 2, 2, 2, 595, 596, 3, 2, 2, 2, 596, 597, 5, 128, 65, 2, 597, 133, 3, 2, 2, 2, 598, 599, 5, 136, 69, 2, 599, 600, 7, 102, 2, 2, 600, 135, 3, 2, 2, 2, 601, 602, 9, 11, 2, 2, 602, 137, 3, 2, 2, 2, 603, 604, 7, 77, 2, 2, 604, 610, 7, 113, 2, 2, 605, 607, 7, 99, 2, 2, 606, 608, 5, 66, 34, 2, 607, 606, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 611, 7, 100, 2, 2, 610, 605, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 613, 3, 2, 2, 2, 612, 614, 5, 18, 10, 2, 613, 612, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 616, 3, 2, 2, 2, 615, 617, 5, 50, 26, 2, 616, 615, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 619, 7, 102, 2, 2, 619, 139, 3, 2, 2, 2, 620, 621, 7, 78, 2, 2, 621, 627, 7, 113, 2, 2, 622, 624, 7, 99, 2, 2, 623, 625, 5, 142, 72, 2, 624, 623, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 628, 7, 100, 2, 2, 627, 622, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 630, 3, 2, 2, 2, 629, 631, 5, 18, 10, 2, 630, 629, 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 633, 5, 20, 11, 2, 633, 141, 3, 2, 2, 2, 634, 637, 5, 70, 36, 2, 635, 637, 5, 40, 21, 2, 636, 634, 3, 2, 2, 2, 636, 635, 3, 2, 2, 2, 637, 143, 3, 2, 2, 2, 638, 639, 7, 79, 2, 2, 639, 640, 7, 97, 2, 2, 640, 641, 11, 2, 2, 2, 641, 642, 7, 98, 2, 2, 642, 145, 3, 2, 2, 2, 643, 644, 9, 12, 2, 2, 644, 147, 3, 2, 2, 2, 645, 651, 7, 85, 2, 2, 646, 648, 7, 86, 2, 2, 647, 649, 7, 110, 2, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 3, 2, 2, 2, 650, 645, 3, 2, 2, 2, 650, 646, 3, 2, 2, 2, 651, 149, 3, 2, 2, 2, 652, 653, 7, 87, 2, 2, 653, 654, 7, 113, 2, 2, 654, 660, 5, 82, 42, 2, 655, 656, 7, 88, 2, 2, 656, 657, 5, 146, 74, 2, 657, 658, 5, 82, 42, 2, 658, 660, 3, 2, 2, 2, 659, 652, 3, 2, 2, 2, 659, 655, 3, 2, 2, 2, 660, 151, 3, 2, 2, 2, 661, 664, 5, 154, 78, 2, 662, 664, 7, 89, 2, 2, 663, 661, 3, 2, 2, 2, 663, 662, 3, 2, 2, 2, 664, 153, 3, 2, 2, 2, 665, 667, 7, 113, 2, 2, 666, 668, 5, 146, 74, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 674, 3, 2, 2, 2, 669, 670, 7, 56, 2, 2, 670, 671, 7, 99, 2, 2, 671, 672, 7, 113, 2, 2, 672, 674, 7, 100, 2, 2, 673, 665, 3, 2, 2, 2, 673, 669, 3, 2, 2, 2, 674, 155, 3, 2, 2, 2, 675, 676, 9, 13, 2, 2, 676, 157, 3, 2, 2, 2, 677, 683, 5, 156, 79, 2, 678, 680, 7, 99, 2, 2, 679, 681, 5, 110, 56, 2, 680, 679, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 684, 7, 100, 2, 2, 683, 678, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 685, 3, 2, 2, 2, 685, 688, 5, 22, 12, 2, 686, 689, 5, 76, 39, 2, 687, 689, 5, 30, 16, 2, 688, 686, 3, 2, 2, 2, 688, 687, 3, 2, 2, 2, 689, 159, 3, 2, 2, 2, 690, 691, 5, 158, 80, 2, 691, 692, 7, 102, 2, 2, 692, 695, 3, 2, 2, 2, 693, 695, 5, 150, 76, 2, 694, 690, 3, 2, 2, 2, 694, 693, 3, 2, 2, 2, 695, 161, 3, 2, 2, 2, 696, 699, 5, 164, 83, 2, 697, 699, 5, 166, 84, 2, 698, 696, 3, 2, 2, 2, 698, 697, 3, 2, 2, 2, 699, 163, 3, 2, 2, 2, 700, 701, 7, 92, 2, 2, 701, 702, 5, 168, 85, 2, 702, 703, 7, 102, 2, 2, 703, 165, 3, 2, 2, 2, 704, 706, 7, 93, 2, 2, 705, 707, 5, 168, 85, 2, 706, 705, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 714, 7, 113, 2, 2, 709, 711, 7, 99, 2, 2, 710, 712, 5, 170, 86, 2, 711, 710, 3, 2, 2, 2, 711, 712, 3, 2, 2, 2, 712, 713, 3, 2, 2, 2, 713, 715, 7, 100, 2, 2, 714, 709, 3, 2, 2, 2, 714, 715, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 718, 5, 26, 14, 2, 717, 719, 5, 18, 10, 2, 718, 717, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 7, 97, 2, 2, 721, 722, 11, 2, 2, 2, 722, 723, 7, 98, 2, 2, 723, 167, 3, 2, 2, 2, 724, 725, 9, 14, 2, 2, 725, 169, 3, 2, 2, 2, 726, 729, 5, 70, 36, 2, 727, 729, 5, 110, 56, 2, 728, 726, 3, 2, 2, 2, 728, 727, 3, 2, 2, 2, 729, 171, 3, 2, 2, 2, 74, 176, 180, 185, 192, 211, 217, 222, 234, 252, 261, 268, 283, 292, 305, 309, 313, 318, 320, 346, 350, 357, 370, 391, 395, 399, 403, 414, 417, 425, 432, 439, 452, 463, 470, 473, 484, 495, 505, 511, 524, 526, 535, 542, 550, 572, 576, 585, 594, 607, 610, 613, 616, 624, 627, 630, 636, 648, 650, 659, 663, 667, 673, 680, 683, 688, 694, 698, 706, 711, 714, 718, 728] \ No newline at end of file diff --git a/internal/qasm3/qasm3.tokens b/internal/qasm3/qasm3.tokens new file mode 100644 index 0000000..b3b4a84 --- /dev/null +++ b/internal/qasm3/qasm3.tokens @@ -0,0 +1,218 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +T__11=12 +T__12=13 +T__13=14 +T__14=15 +T__15=16 +T__16=17 +T__17=18 +T__18=19 +T__19=20 +T__20=21 +T__21=22 +T__22=23 +T__23=24 +T__24=25 +T__25=26 +T__26=27 +T__27=28 +T__28=29 +T__29=30 +T__30=31 +T__31=32 +T__32=33 +T__33=34 +T__34=35 +T__35=36 +T__36=37 +T__37=38 +T__38=39 +T__39=40 +T__40=41 +T__41=42 +T__42=43 +T__43=44 +T__44=45 +T__45=46 +T__46=47 +T__47=48 +T__48=49 +T__49=50 +T__50=51 +T__51=52 +T__52=53 +T__53=54 +T__54=55 +T__55=56 +T__56=57 +T__57=58 +T__58=59 +T__59=60 +T__60=61 +T__61=62 +T__62=63 +T__63=64 +T__64=65 +T__65=66 +T__66=67 +T__67=68 +T__68=69 +T__69=70 +T__70=71 +T__71=72 +T__72=73 +T__73=74 +T__74=75 +T__75=76 +T__76=77 +T__77=78 +T__78=79 +T__79=80 +T__80=81 +T__81=82 +T__82=83 +T__83=84 +T__84=85 +T__85=86 +T__86=87 +T__87=88 +T__88=89 +T__89=90 +T__90=91 +T__91=92 +LBRACKET=93 +RBRACKET=94 +LBRACE=95 +RBRACE=96 +LPAREN=97 +RPAREN=98 +COLON=99 +SEMICOLON=100 +DOT=101 +COMMA=102 +ASSIGN=103 +ARROW=104 +Constant=105 +Whitespace=106 +Newline=107 +Integer=108 +Float=109 +RealNumber=110 +Identifier=111 +StringLiteral=112 +LineComment=113 +BlockComment=114 +'OPENQASM'=1 +'include'=2 +'qubit'=3 +'qreg'=4 +'bit'=5 +'creg'=6 +'int'=7 +'uint'=8 +'float'=9 +'angle'=10 +'fixed'=11 +'bool'=12 +'const'=13 +'let'=14 +'||'=15 +'gate'=16 +'measure'=17 +'barrier'=18 +'inv'=19 +'pow'=20 +'ctrl'=21 +'@'=22 +'CX'=23 +'U'=24 +'reset'=25 +'~'=26 +'!'=27 +'+'=28 +'-'=29 +'*'=30 +'/'=31 +'<<'=32 +'>>'=33 +'rotl'=34 +'rotr'=35 +'&&'=36 +'&'=37 +'|'=38 +'^'=39 +'>'=40 +'<'=41 +'>='=42 +'<='=43 +'=='=44 +'!='=45 +'return'=46 +'sin'=47 +'cos'=48 +'tan'=49 +'exp'=50 +'ln'=51 +'sqrt'=52 +'popcount'=53 +'lengthof'=54 +'++'=55 +'--'=56 +'+='=57 +'-='=58 +'*='=59 +'/='=60 +'&='=61 +'|='=62 +'~='=63 +'^='=64 +'<<='=65 +'>>='=66 +'in'=67 +'if'=68 +'else'=69 +'for'=70 +'while'=71 +'break'=72 +'continue'=73 +'end'=74 +'kernel'=75 +'def'=76 +'#pragma'=77 +'dt'=78 +'ns'=79 +'us'=80 +'ms'=81 +'s'=82 +'length'=83 +'stretch'=84 +'boxas'=85 +'boxto'=86 +'stretchinf'=87 +'delay'=88 +'rotary'=89 +'defcalgrammar'=90 +'defcal'=91 +'openpulse'=92 +'['=93 +']'=94 +'{'=95 +'}'=96 +'('=97 +')'=98 +':'=99 +';'=100 +'.'=101 +','=102 +'='=103 +'->'=104 diff --git a/internal/qasm3/qasm3Lexer.interp b/internal/qasm3/qasm3Lexer.interp new file mode 100644 index 0000000..55adbac --- /dev/null +++ b/internal/qasm3/qasm3Lexer.interp @@ -0,0 +1,369 @@ +token literal names: +null +'OPENQASM' +'include' +'qubit' +'qreg' +'bit' +'creg' +'int' +'uint' +'float' +'angle' +'fixed' +'bool' +'const' +'let' +'||' +'gate' +'measure' +'barrier' +'inv' +'pow' +'ctrl' +'@' +'CX' +'U' +'reset' +'~' +'!' +'+' +'-' +'*' +'/' +'<<' +'>>' +'rotl' +'rotr' +'&&' +'&' +'|' +'^' +'>' +'<' +'>=' +'<=' +'==' +'!=' +'return' +'sin' +'cos' +'tan' +'exp' +'ln' +'sqrt' +'popcount' +'lengthof' +'++' +'--' +'+=' +'-=' +'*=' +'/=' +'&=' +'|=' +'~=' +'^=' +'<<=' +'>>=' +'in' +'if' +'else' +'for' +'while' +'break' +'continue' +'end' +'kernel' +'def' +'#pragma' +'dt' +'ns' +'us' +'ms' +'s' +'length' +'stretch' +'boxas' +'boxto' +'stretchinf' +'delay' +'rotary' +'defcalgrammar' +'defcal' +'openpulse' +'[' +']' +'{' +'}' +'(' +')' +':' +';' +'.' +',' +'=' +'->' +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +LBRACKET +RBRACKET +LBRACE +RBRACE +LPAREN +RPAREN +COLON +SEMICOLON +DOT +COMMA +ASSIGN +ARROW +Constant +Whitespace +Newline +Integer +Float +RealNumber +Identifier +StringLiteral +LineComment +BlockComment + +rule names: +T__0 +T__1 +T__2 +T__3 +T__4 +T__5 +T__6 +T__7 +T__8 +T__9 +T__10 +T__11 +T__12 +T__13 +T__14 +T__15 +T__16 +T__17 +T__18 +T__19 +T__20 +T__21 +T__22 +T__23 +T__24 +T__25 +T__26 +T__27 +T__28 +T__29 +T__30 +T__31 +T__32 +T__33 +T__34 +T__35 +T__36 +T__37 +T__38 +T__39 +T__40 +T__41 +T__42 +T__43 +T__44 +T__45 +T__46 +T__47 +T__48 +T__49 +T__50 +T__51 +T__52 +T__53 +T__54 +T__55 +T__56 +T__57 +T__58 +T__59 +T__60 +T__61 +T__62 +T__63 +T__64 +T__65 +T__66 +T__67 +T__68 +T__69 +T__70 +T__71 +T__72 +T__73 +T__74 +T__75 +T__76 +T__77 +T__78 +T__79 +T__80 +T__81 +T__82 +T__83 +T__84 +T__85 +T__86 +T__87 +T__88 +T__89 +T__90 +T__91 +LBRACKET +RBRACKET +LBRACE +RBRACE +LPAREN +RPAREN +COLON +SEMICOLON +DOT +COMMA +ASSIGN +ARROW +Constant +Whitespace +Newline +Digit +Integer +LowerCaseCharacter +UpperCaseCharacter +SciNotation +PlusMinus +Float +RealNumber +NumericalCharacter +Identifier +Quotation +StringLiteral +AnyString +Any +AnyBlock +LineComment +BlockComment + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 116, 814, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 714, 10, 106, 3, 107, 6, 107, 717, 10, 107, 13, 107, 14, 107, 718, 3, 107, 3, 107, 3, 108, 6, 108, 724, 10, 108, 13, 108, 14, 108, 725, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 6, 110, 733, 10, 110, 13, 110, 14, 110, 734, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 7, 115, 746, 10, 115, 12, 115, 14, 115, 749, 11, 115, 3, 115, 3, 115, 6, 115, 753, 10, 115, 13, 115, 14, 115, 754, 3, 116, 3, 116, 3, 116, 5, 116, 760, 10, 116, 3, 116, 3, 116, 5, 116, 764, 10, 116, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 770, 10, 117, 3, 118, 3, 118, 7, 118, 774, 10, 118, 12, 118, 14, 118, 777, 11, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 6, 121, 786, 10, 121, 13, 121, 14, 121, 787, 3, 122, 3, 122, 3, 122, 6, 122, 793, 10, 122, 13, 122, 14, 122, 794, 3, 123, 3, 123, 5, 123, 799, 10, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 787, 2, 126, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 2, 219, 110, 221, 2, 223, 2, 225, 2, 227, 2, 229, 111, 231, 112, 233, 2, 235, 113, 237, 2, 239, 114, 241, 2, 243, 2, 245, 2, 247, 115, 249, 116, 3, 2, 11, 4, 2, 11, 11, 34, 34, 4, 2, 12, 12, 15, 15, 3, 2, 50, 59, 3, 2, 99, 124, 3, 2, 67, 92, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 36, 36, 41, 41, 5, 2, 11, 12, 15, 15, 34, 34, 3, 3, 2, 55057, 3, 55057, 3, 824, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 3, 251, 3, 2, 2, 2, 5, 260, 3, 2, 2, 2, 7, 268, 3, 2, 2, 2, 9, 274, 3, 2, 2, 2, 11, 279, 3, 2, 2, 2, 13, 283, 3, 2, 2, 2, 15, 288, 3, 2, 2, 2, 17, 292, 3, 2, 2, 2, 19, 297, 3, 2, 2, 2, 21, 303, 3, 2, 2, 2, 23, 309, 3, 2, 2, 2, 25, 315, 3, 2, 2, 2, 27, 320, 3, 2, 2, 2, 29, 326, 3, 2, 2, 2, 31, 330, 3, 2, 2, 2, 33, 333, 3, 2, 2, 2, 35, 338, 3, 2, 2, 2, 37, 346, 3, 2, 2, 2, 39, 354, 3, 2, 2, 2, 41, 358, 3, 2, 2, 2, 43, 362, 3, 2, 2, 2, 45, 367, 3, 2, 2, 2, 47, 369, 3, 2, 2, 2, 49, 372, 3, 2, 2, 2, 51, 374, 3, 2, 2, 2, 53, 380, 3, 2, 2, 2, 55, 382, 3, 2, 2, 2, 57, 384, 3, 2, 2, 2, 59, 386, 3, 2, 2, 2, 61, 388, 3, 2, 2, 2, 63, 390, 3, 2, 2, 2, 65, 392, 3, 2, 2, 2, 67, 395, 3, 2, 2, 2, 69, 398, 3, 2, 2, 2, 71, 403, 3, 2, 2, 2, 73, 408, 3, 2, 2, 2, 75, 411, 3, 2, 2, 2, 77, 413, 3, 2, 2, 2, 79, 415, 3, 2, 2, 2, 81, 417, 3, 2, 2, 2, 83, 419, 3, 2, 2, 2, 85, 421, 3, 2, 2, 2, 87, 424, 3, 2, 2, 2, 89, 427, 3, 2, 2, 2, 91, 430, 3, 2, 2, 2, 93, 433, 3, 2, 2, 2, 95, 440, 3, 2, 2, 2, 97, 444, 3, 2, 2, 2, 99, 448, 3, 2, 2, 2, 101, 452, 3, 2, 2, 2, 103, 456, 3, 2, 2, 2, 105, 459, 3, 2, 2, 2, 107, 464, 3, 2, 2, 2, 109, 473, 3, 2, 2, 2, 111, 482, 3, 2, 2, 2, 113, 485, 3, 2, 2, 2, 115, 488, 3, 2, 2, 2, 117, 491, 3, 2, 2, 2, 119, 494, 3, 2, 2, 2, 121, 497, 3, 2, 2, 2, 123, 500, 3, 2, 2, 2, 125, 503, 3, 2, 2, 2, 127, 506, 3, 2, 2, 2, 129, 509, 3, 2, 2, 2, 131, 512, 3, 2, 2, 2, 133, 516, 3, 2, 2, 2, 135, 520, 3, 2, 2, 2, 137, 523, 3, 2, 2, 2, 139, 526, 3, 2, 2, 2, 141, 531, 3, 2, 2, 2, 143, 535, 3, 2, 2, 2, 145, 541, 3, 2, 2, 2, 147, 547, 3, 2, 2, 2, 149, 556, 3, 2, 2, 2, 151, 560, 3, 2, 2, 2, 153, 567, 3, 2, 2, 2, 155, 571, 3, 2, 2, 2, 157, 579, 3, 2, 2, 2, 159, 582, 3, 2, 2, 2, 161, 585, 3, 2, 2, 2, 163, 588, 3, 2, 2, 2, 165, 591, 3, 2, 2, 2, 167, 593, 3, 2, 2, 2, 169, 600, 3, 2, 2, 2, 171, 608, 3, 2, 2, 2, 173, 614, 3, 2, 2, 2, 175, 620, 3, 2, 2, 2, 177, 631, 3, 2, 2, 2, 179, 637, 3, 2, 2, 2, 181, 644, 3, 2, 2, 2, 183, 658, 3, 2, 2, 2, 185, 665, 3, 2, 2, 2, 187, 675, 3, 2, 2, 2, 189, 677, 3, 2, 2, 2, 191, 679, 3, 2, 2, 2, 193, 681, 3, 2, 2, 2, 195, 683, 3, 2, 2, 2, 197, 685, 3, 2, 2, 2, 199, 687, 3, 2, 2, 2, 201, 689, 3, 2, 2, 2, 203, 691, 3, 2, 2, 2, 205, 693, 3, 2, 2, 2, 207, 695, 3, 2, 2, 2, 209, 697, 3, 2, 2, 2, 211, 713, 3, 2, 2, 2, 213, 716, 3, 2, 2, 2, 215, 723, 3, 2, 2, 2, 217, 729, 3, 2, 2, 2, 219, 732, 3, 2, 2, 2, 221, 736, 3, 2, 2, 2, 223, 738, 3, 2, 2, 2, 225, 740, 3, 2, 2, 2, 227, 742, 3, 2, 2, 2, 229, 747, 3, 2, 2, 2, 231, 756, 3, 2, 2, 2, 233, 769, 3, 2, 2, 2, 235, 771, 3, 2, 2, 2, 237, 778, 3, 2, 2, 2, 239, 780, 3, 2, 2, 2, 241, 785, 3, 2, 2, 2, 243, 792, 3, 2, 2, 2, 245, 796, 3, 2, 2, 2, 247, 802, 3, 2, 2, 2, 249, 807, 3, 2, 2, 2, 251, 252, 7, 81, 2, 2, 252, 253, 7, 82, 2, 2, 253, 254, 7, 71, 2, 2, 254, 255, 7, 80, 2, 2, 255, 256, 7, 83, 2, 2, 256, 257, 7, 67, 2, 2, 257, 258, 7, 85, 2, 2, 258, 259, 7, 79, 2, 2, 259, 4, 3, 2, 2, 2, 260, 261, 7, 107, 2, 2, 261, 262, 7, 112, 2, 2, 262, 263, 7, 101, 2, 2, 263, 264, 7, 110, 2, 2, 264, 265, 7, 119, 2, 2, 265, 266, 7, 102, 2, 2, 266, 267, 7, 103, 2, 2, 267, 6, 3, 2, 2, 2, 268, 269, 7, 115, 2, 2, 269, 270, 7, 119, 2, 2, 270, 271, 7, 100, 2, 2, 271, 272, 7, 107, 2, 2, 272, 273, 7, 118, 2, 2, 273, 8, 3, 2, 2, 2, 274, 275, 7, 115, 2, 2, 275, 276, 7, 116, 2, 2, 276, 277, 7, 103, 2, 2, 277, 278, 7, 105, 2, 2, 278, 10, 3, 2, 2, 2, 279, 280, 7, 100, 2, 2, 280, 281, 7, 107, 2, 2, 281, 282, 7, 118, 2, 2, 282, 12, 3, 2, 2, 2, 283, 284, 7, 101, 2, 2, 284, 285, 7, 116, 2, 2, 285, 286, 7, 103, 2, 2, 286, 287, 7, 105, 2, 2, 287, 14, 3, 2, 2, 2, 288, 289, 7, 107, 2, 2, 289, 290, 7, 112, 2, 2, 290, 291, 7, 118, 2, 2, 291, 16, 3, 2, 2, 2, 292, 293, 7, 119, 2, 2, 293, 294, 7, 107, 2, 2, 294, 295, 7, 112, 2, 2, 295, 296, 7, 118, 2, 2, 296, 18, 3, 2, 2, 2, 297, 298, 7, 104, 2, 2, 298, 299, 7, 110, 2, 2, 299, 300, 7, 113, 2, 2, 300, 301, 7, 99, 2, 2, 301, 302, 7, 118, 2, 2, 302, 20, 3, 2, 2, 2, 303, 304, 7, 99, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 105, 2, 2, 306, 307, 7, 110, 2, 2, 307, 308, 7, 103, 2, 2, 308, 22, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 107, 2, 2, 311, 312, 7, 122, 2, 2, 312, 313, 7, 103, 2, 2, 313, 314, 7, 102, 2, 2, 314, 24, 3, 2, 2, 2, 315, 316, 7, 100, 2, 2, 316, 317, 7, 113, 2, 2, 317, 318, 7, 113, 2, 2, 318, 319, 7, 110, 2, 2, 319, 26, 3, 2, 2, 2, 320, 321, 7, 101, 2, 2, 321, 322, 7, 113, 2, 2, 322, 323, 7, 112, 2, 2, 323, 324, 7, 117, 2, 2, 324, 325, 7, 118, 2, 2, 325, 28, 3, 2, 2, 2, 326, 327, 7, 110, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 118, 2, 2, 329, 30, 3, 2, 2, 2, 330, 331, 7, 126, 2, 2, 331, 332, 7, 126, 2, 2, 332, 32, 3, 2, 2, 2, 333, 334, 7, 105, 2, 2, 334, 335, 7, 99, 2, 2, 335, 336, 7, 118, 2, 2, 336, 337, 7, 103, 2, 2, 337, 34, 3, 2, 2, 2, 338, 339, 7, 111, 2, 2, 339, 340, 7, 103, 2, 2, 340, 341, 7, 99, 2, 2, 341, 342, 7, 117, 2, 2, 342, 343, 7, 119, 2, 2, 343, 344, 7, 116, 2, 2, 344, 345, 7, 103, 2, 2, 345, 36, 3, 2, 2, 2, 346, 347, 7, 100, 2, 2, 347, 348, 7, 99, 2, 2, 348, 349, 7, 116, 2, 2, 349, 350, 7, 116, 2, 2, 350, 351, 7, 107, 2, 2, 351, 352, 7, 103, 2, 2, 352, 353, 7, 116, 2, 2, 353, 38, 3, 2, 2, 2, 354, 355, 7, 107, 2, 2, 355, 356, 7, 112, 2, 2, 356, 357, 7, 120, 2, 2, 357, 40, 3, 2, 2, 2, 358, 359, 7, 114, 2, 2, 359, 360, 7, 113, 2, 2, 360, 361, 7, 121, 2, 2, 361, 42, 3, 2, 2, 2, 362, 363, 7, 101, 2, 2, 363, 364, 7, 118, 2, 2, 364, 365, 7, 116, 2, 2, 365, 366, 7, 110, 2, 2, 366, 44, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 46, 3, 2, 2, 2, 369, 370, 7, 69, 2, 2, 370, 371, 7, 90, 2, 2, 371, 48, 3, 2, 2, 2, 372, 373, 7, 87, 2, 2, 373, 50, 3, 2, 2, 2, 374, 375, 7, 116, 2, 2, 375, 376, 7, 103, 2, 2, 376, 377, 7, 117, 2, 2, 377, 378, 7, 103, 2, 2, 378, 379, 7, 118, 2, 2, 379, 52, 3, 2, 2, 2, 380, 381, 7, 128, 2, 2, 381, 54, 3, 2, 2, 2, 382, 383, 7, 35, 2, 2, 383, 56, 3, 2, 2, 2, 384, 385, 7, 45, 2, 2, 385, 58, 3, 2, 2, 2, 386, 387, 7, 47, 2, 2, 387, 60, 3, 2, 2, 2, 388, 389, 7, 44, 2, 2, 389, 62, 3, 2, 2, 2, 390, 391, 7, 49, 2, 2, 391, 64, 3, 2, 2, 2, 392, 393, 7, 62, 2, 2, 393, 394, 7, 62, 2, 2, 394, 66, 3, 2, 2, 2, 395, 396, 7, 64, 2, 2, 396, 397, 7, 64, 2, 2, 397, 68, 3, 2, 2, 2, 398, 399, 7, 116, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 118, 2, 2, 401, 402, 7, 110, 2, 2, 402, 70, 3, 2, 2, 2, 403, 404, 7, 116, 2, 2, 404, 405, 7, 113, 2, 2, 405, 406, 7, 118, 2, 2, 406, 407, 7, 116, 2, 2, 407, 72, 3, 2, 2, 2, 408, 409, 7, 40, 2, 2, 409, 410, 7, 40, 2, 2, 410, 74, 3, 2, 2, 2, 411, 412, 7, 40, 2, 2, 412, 76, 3, 2, 2, 2, 413, 414, 7, 126, 2, 2, 414, 78, 3, 2, 2, 2, 415, 416, 7, 96, 2, 2, 416, 80, 3, 2, 2, 2, 417, 418, 7, 64, 2, 2, 418, 82, 3, 2, 2, 2, 419, 420, 7, 62, 2, 2, 420, 84, 3, 2, 2, 2, 421, 422, 7, 64, 2, 2, 422, 423, 7, 63, 2, 2, 423, 86, 3, 2, 2, 2, 424, 425, 7, 62, 2, 2, 425, 426, 7, 63, 2, 2, 426, 88, 3, 2, 2, 2, 427, 428, 7, 63, 2, 2, 428, 429, 7, 63, 2, 2, 429, 90, 3, 2, 2, 2, 430, 431, 7, 35, 2, 2, 431, 432, 7, 63, 2, 2, 432, 92, 3, 2, 2, 2, 433, 434, 7, 116, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 118, 2, 2, 436, 437, 7, 119, 2, 2, 437, 438, 7, 116, 2, 2, 438, 439, 7, 112, 2, 2, 439, 94, 3, 2, 2, 2, 440, 441, 7, 117, 2, 2, 441, 442, 7, 107, 2, 2, 442, 443, 7, 112, 2, 2, 443, 96, 3, 2, 2, 2, 444, 445, 7, 101, 2, 2, 445, 446, 7, 113, 2, 2, 446, 447, 7, 117, 2, 2, 447, 98, 3, 2, 2, 2, 448, 449, 7, 118, 2, 2, 449, 450, 7, 99, 2, 2, 450, 451, 7, 112, 2, 2, 451, 100, 3, 2, 2, 2, 452, 453, 7, 103, 2, 2, 453, 454, 7, 122, 2, 2, 454, 455, 7, 114, 2, 2, 455, 102, 3, 2, 2, 2, 456, 457, 7, 110, 2, 2, 457, 458, 7, 112, 2, 2, 458, 104, 3, 2, 2, 2, 459, 460, 7, 117, 2, 2, 460, 461, 7, 115, 2, 2, 461, 462, 7, 116, 2, 2, 462, 463, 7, 118, 2, 2, 463, 106, 3, 2, 2, 2, 464, 465, 7, 114, 2, 2, 465, 466, 7, 113, 2, 2, 466, 467, 7, 114, 2, 2, 467, 468, 7, 101, 2, 2, 468, 469, 7, 113, 2, 2, 469, 470, 7, 119, 2, 2, 470, 471, 7, 112, 2, 2, 471, 472, 7, 118, 2, 2, 472, 108, 3, 2, 2, 2, 473, 474, 7, 110, 2, 2, 474, 475, 7, 103, 2, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 105, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 106, 2, 2, 479, 480, 7, 113, 2, 2, 480, 481, 7, 104, 2, 2, 481, 110, 3, 2, 2, 2, 482, 483, 7, 45, 2, 2, 483, 484, 7, 45, 2, 2, 484, 112, 3, 2, 2, 2, 485, 486, 7, 47, 2, 2, 486, 487, 7, 47, 2, 2, 487, 114, 3, 2, 2, 2, 488, 489, 7, 45, 2, 2, 489, 490, 7, 63, 2, 2, 490, 116, 3, 2, 2, 2, 491, 492, 7, 47, 2, 2, 492, 493, 7, 63, 2, 2, 493, 118, 3, 2, 2, 2, 494, 495, 7, 44, 2, 2, 495, 496, 7, 63, 2, 2, 496, 120, 3, 2, 2, 2, 497, 498, 7, 49, 2, 2, 498, 499, 7, 63, 2, 2, 499, 122, 3, 2, 2, 2, 500, 501, 7, 40, 2, 2, 501, 502, 7, 63, 2, 2, 502, 124, 3, 2, 2, 2, 503, 504, 7, 126, 2, 2, 504, 505, 7, 63, 2, 2, 505, 126, 3, 2, 2, 2, 506, 507, 7, 128, 2, 2, 507, 508, 7, 63, 2, 2, 508, 128, 3, 2, 2, 2, 509, 510, 7, 96, 2, 2, 510, 511, 7, 63, 2, 2, 511, 130, 3, 2, 2, 2, 512, 513, 7, 62, 2, 2, 513, 514, 7, 62, 2, 2, 514, 515, 7, 63, 2, 2, 515, 132, 3, 2, 2, 2, 516, 517, 7, 64, 2, 2, 517, 518, 7, 64, 2, 2, 518, 519, 7, 63, 2, 2, 519, 134, 3, 2, 2, 2, 520, 521, 7, 107, 2, 2, 521, 522, 7, 112, 2, 2, 522, 136, 3, 2, 2, 2, 523, 524, 7, 107, 2, 2, 524, 525, 7, 104, 2, 2, 525, 138, 3, 2, 2, 2, 526, 527, 7, 103, 2, 2, 527, 528, 7, 110, 2, 2, 528, 529, 7, 117, 2, 2, 529, 530, 7, 103, 2, 2, 530, 140, 3, 2, 2, 2, 531, 532, 7, 104, 2, 2, 532, 533, 7, 113, 2, 2, 533, 534, 7, 116, 2, 2, 534, 142, 3, 2, 2, 2, 535, 536, 7, 121, 2, 2, 536, 537, 7, 106, 2, 2, 537, 538, 7, 107, 2, 2, 538, 539, 7, 110, 2, 2, 539, 540, 7, 103, 2, 2, 540, 144, 3, 2, 2, 2, 541, 542, 7, 100, 2, 2, 542, 543, 7, 116, 2, 2, 543, 544, 7, 103, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 7, 109, 2, 2, 546, 146, 3, 2, 2, 2, 547, 548, 7, 101, 2, 2, 548, 549, 7, 113, 2, 2, 549, 550, 7, 112, 2, 2, 550, 551, 7, 118, 2, 2, 551, 552, 7, 107, 2, 2, 552, 553, 7, 112, 2, 2, 553, 554, 7, 119, 2, 2, 554, 555, 7, 103, 2, 2, 555, 148, 3, 2, 2, 2, 556, 557, 7, 103, 2, 2, 557, 558, 7, 112, 2, 2, 558, 559, 7, 102, 2, 2, 559, 150, 3, 2, 2, 2, 560, 561, 7, 109, 2, 2, 561, 562, 7, 103, 2, 2, 562, 563, 7, 116, 2, 2, 563, 564, 7, 112, 2, 2, 564, 565, 7, 103, 2, 2, 565, 566, 7, 110, 2, 2, 566, 152, 3, 2, 2, 2, 567, 568, 7, 102, 2, 2, 568, 569, 7, 103, 2, 2, 569, 570, 7, 104, 2, 2, 570, 154, 3, 2, 2, 2, 571, 572, 7, 37, 2, 2, 572, 573, 7, 114, 2, 2, 573, 574, 7, 116, 2, 2, 574, 575, 7, 99, 2, 2, 575, 576, 7, 105, 2, 2, 576, 577, 7, 111, 2, 2, 577, 578, 7, 99, 2, 2, 578, 156, 3, 2, 2, 2, 579, 580, 7, 102, 2, 2, 580, 581, 7, 118, 2, 2, 581, 158, 3, 2, 2, 2, 582, 583, 7, 112, 2, 2, 583, 584, 7, 117, 2, 2, 584, 160, 3, 2, 2, 2, 585, 586, 7, 119, 2, 2, 586, 587, 7, 117, 2, 2, 587, 162, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 117, 2, 2, 590, 164, 3, 2, 2, 2, 591, 592, 7, 117, 2, 2, 592, 166, 3, 2, 2, 2, 593, 594, 7, 110, 2, 2, 594, 595, 7, 103, 2, 2, 595, 596, 7, 112, 2, 2, 596, 597, 7, 105, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 106, 2, 2, 599, 168, 3, 2, 2, 2, 600, 601, 7, 117, 2, 2, 601, 602, 7, 118, 2, 2, 602, 603, 7, 116, 2, 2, 603, 604, 7, 103, 2, 2, 604, 605, 7, 118, 2, 2, 605, 606, 7, 101, 2, 2, 606, 607, 7, 106, 2, 2, 607, 170, 3, 2, 2, 2, 608, 609, 7, 100, 2, 2, 609, 610, 7, 113, 2, 2, 610, 611, 7, 122, 2, 2, 611, 612, 7, 99, 2, 2, 612, 613, 7, 117, 2, 2, 613, 172, 3, 2, 2, 2, 614, 615, 7, 100, 2, 2, 615, 616, 7, 113, 2, 2, 616, 617, 7, 122, 2, 2, 617, 618, 7, 118, 2, 2, 618, 619, 7, 113, 2, 2, 619, 174, 3, 2, 2, 2, 620, 621, 7, 117, 2, 2, 621, 622, 7, 118, 2, 2, 622, 623, 7, 116, 2, 2, 623, 624, 7, 103, 2, 2, 624, 625, 7, 118, 2, 2, 625, 626, 7, 101, 2, 2, 626, 627, 7, 106, 2, 2, 627, 628, 7, 107, 2, 2, 628, 629, 7, 112, 2, 2, 629, 630, 7, 104, 2, 2, 630, 176, 3, 2, 2, 2, 631, 632, 7, 102, 2, 2, 632, 633, 7, 103, 2, 2, 633, 634, 7, 110, 2, 2, 634, 635, 7, 99, 2, 2, 635, 636, 7, 123, 2, 2, 636, 178, 3, 2, 2, 2, 637, 638, 7, 116, 2, 2, 638, 639, 7, 113, 2, 2, 639, 640, 7, 118, 2, 2, 640, 641, 7, 99, 2, 2, 641, 642, 7, 116, 2, 2, 642, 643, 7, 123, 2, 2, 643, 180, 3, 2, 2, 2, 644, 645, 7, 102, 2, 2, 645, 646, 7, 103, 2, 2, 646, 647, 7, 104, 2, 2, 647, 648, 7, 101, 2, 2, 648, 649, 7, 99, 2, 2, 649, 650, 7, 110, 2, 2, 650, 651, 7, 105, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 99, 2, 2, 653, 654, 7, 111, 2, 2, 654, 655, 7, 111, 2, 2, 655, 656, 7, 99, 2, 2, 656, 657, 7, 116, 2, 2, 657, 182, 3, 2, 2, 2, 658, 659, 7, 102, 2, 2, 659, 660, 7, 103, 2, 2, 660, 661, 7, 104, 2, 2, 661, 662, 7, 101, 2, 2, 662, 663, 7, 99, 2, 2, 663, 664, 7, 110, 2, 2, 664, 184, 3, 2, 2, 2, 665, 666, 7, 113, 2, 2, 666, 667, 7, 114, 2, 2, 667, 668, 7, 103, 2, 2, 668, 669, 7, 112, 2, 2, 669, 670, 7, 114, 2, 2, 670, 671, 7, 119, 2, 2, 671, 672, 7, 110, 2, 2, 672, 673, 7, 117, 2, 2, 673, 674, 7, 103, 2, 2, 674, 186, 3, 2, 2, 2, 675, 676, 7, 93, 2, 2, 676, 188, 3, 2, 2, 2, 677, 678, 7, 95, 2, 2, 678, 190, 3, 2, 2, 2, 679, 680, 7, 125, 2, 2, 680, 192, 3, 2, 2, 2, 681, 682, 7, 127, 2, 2, 682, 194, 3, 2, 2, 2, 683, 684, 7, 42, 2, 2, 684, 196, 3, 2, 2, 2, 685, 686, 7, 43, 2, 2, 686, 198, 3, 2, 2, 2, 687, 688, 7, 60, 2, 2, 688, 200, 3, 2, 2, 2, 689, 690, 7, 61, 2, 2, 690, 202, 3, 2, 2, 2, 691, 692, 7, 48, 2, 2, 692, 204, 3, 2, 2, 2, 693, 694, 7, 46, 2, 2, 694, 206, 3, 2, 2, 2, 695, 696, 7, 63, 2, 2, 696, 208, 3, 2, 2, 2, 697, 698, 7, 47, 2, 2, 698, 699, 7, 64, 2, 2, 699, 210, 3, 2, 2, 2, 700, 701, 7, 114, 2, 2, 701, 714, 7, 107, 2, 2, 702, 714, 7, 962, 2, 2, 703, 704, 7, 118, 2, 2, 704, 705, 7, 99, 2, 2, 705, 714, 7, 119, 2, 2, 706, 714, 9, 11, 2, 2, 707, 708, 7, 103, 2, 2, 708, 709, 7, 119, 2, 2, 709, 710, 7, 110, 2, 2, 710, 711, 7, 103, 2, 2, 711, 714, 7, 116, 2, 2, 712, 714, 7, 103, 2, 2, 713, 700, 3, 2, 2, 2, 713, 702, 3, 2, 2, 2, 713, 703, 3, 2, 2, 2, 713, 706, 3, 2, 2, 2, 713, 707, 3, 2, 2, 2, 713, 712, 3, 2, 2, 2, 714, 212, 3, 2, 2, 2, 715, 717, 9, 2, 2, 2, 716, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 8, 107, 2, 2, 721, 214, 3, 2, 2, 2, 722, 724, 9, 3, 2, 2, 723, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 727, 3, 2, 2, 2, 727, 728, 8, 108, 2, 2, 728, 216, 3, 2, 2, 2, 729, 730, 9, 4, 2, 2, 730, 218, 3, 2, 2, 2, 731, 733, 5, 217, 109, 2, 732, 731, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 732, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 220, 3, 2, 2, 2, 736, 737, 9, 5, 2, 2, 737, 222, 3, 2, 2, 2, 738, 739, 9, 6, 2, 2, 739, 224, 3, 2, 2, 2, 740, 741, 9, 7, 2, 2, 741, 226, 3, 2, 2, 2, 742, 743, 9, 8, 2, 2, 743, 228, 3, 2, 2, 2, 744, 746, 5, 219, 110, 2, 745, 744, 3, 2, 2, 2, 746, 749, 3, 2, 2, 2, 747, 745, 3, 2, 2, 2, 747, 748, 3, 2, 2, 2, 748, 750, 3, 2, 2, 2, 749, 747, 3, 2, 2, 2, 750, 752, 5, 203, 102, 2, 751, 753, 5, 219, 110, 2, 752, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 230, 3, 2, 2, 2, 756, 763, 5, 229, 115, 2, 757, 759, 5, 225, 113, 2, 758, 760, 5, 227, 114, 2, 759, 758, 3, 2, 2, 2, 759, 760, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 762, 5, 229, 115, 2, 762, 764, 3, 2, 2, 2, 763, 757, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 232, 3, 2, 2, 2, 765, 770, 5, 221, 111, 2, 766, 770, 5, 223, 112, 2, 767, 770, 7, 97, 2, 2, 768, 770, 5, 219, 110, 2, 769, 765, 3, 2, 2, 2, 769, 766, 3, 2, 2, 2, 769, 767, 3, 2, 2, 2, 769, 768, 3, 2, 2, 2, 770, 234, 3, 2, 2, 2, 771, 775, 5, 221, 111, 2, 772, 774, 5, 233, 117, 2, 773, 772, 3, 2, 2, 2, 774, 777, 3, 2, 2, 2, 775, 773, 3, 2, 2, 2, 775, 776, 3, 2, 2, 2, 776, 236, 3, 2, 2, 2, 777, 775, 3, 2, 2, 2, 778, 779, 9, 9, 2, 2, 779, 238, 3, 2, 2, 2, 780, 781, 5, 237, 119, 2, 781, 782, 5, 243, 122, 2, 782, 783, 5, 237, 119, 2, 783, 240, 3, 2, 2, 2, 784, 786, 10, 10, 2, 2, 785, 784, 3, 2, 2, 2, 786, 787, 3, 2, 2, 2, 787, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 242, 3, 2, 2, 2, 789, 793, 5, 241, 121, 2, 790, 793, 5, 213, 107, 2, 791, 793, 5, 215, 108, 2, 792, 789, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 792, 791, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 792, 3, 2, 2, 2, 794, 795, 3, 2, 2, 2, 795, 244, 3, 2, 2, 2, 796, 798, 5, 191, 96, 2, 797, 799, 5, 243, 122, 2, 798, 797, 3, 2, 2, 2, 798, 799, 3, 2, 2, 2, 799, 800, 3, 2, 2, 2, 800, 801, 5, 193, 97, 2, 801, 246, 3, 2, 2, 2, 802, 803, 7, 49, 2, 2, 803, 804, 7, 49, 2, 2, 804, 805, 3, 2, 2, 2, 805, 806, 5, 243, 122, 2, 806, 248, 3, 2, 2, 2, 807, 808, 7, 49, 2, 2, 808, 809, 7, 44, 2, 2, 809, 810, 3, 2, 2, 2, 810, 811, 5, 243, 122, 2, 811, 812, 7, 44, 2, 2, 812, 813, 7, 49, 2, 2, 813, 250, 3, 2, 2, 2, 17, 2, 713, 718, 725, 734, 747, 754, 759, 763, 769, 775, 787, 792, 794, 798, 3, 8, 2, 2] \ No newline at end of file diff --git a/internal/qasm3/qasm3Lexer.tokens b/internal/qasm3/qasm3Lexer.tokens new file mode 100644 index 0000000..b3b4a84 --- /dev/null +++ b/internal/qasm3/qasm3Lexer.tokens @@ -0,0 +1,218 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +T__11=12 +T__12=13 +T__13=14 +T__14=15 +T__15=16 +T__16=17 +T__17=18 +T__18=19 +T__19=20 +T__20=21 +T__21=22 +T__22=23 +T__23=24 +T__24=25 +T__25=26 +T__26=27 +T__27=28 +T__28=29 +T__29=30 +T__30=31 +T__31=32 +T__32=33 +T__33=34 +T__34=35 +T__35=36 +T__36=37 +T__37=38 +T__38=39 +T__39=40 +T__40=41 +T__41=42 +T__42=43 +T__43=44 +T__44=45 +T__45=46 +T__46=47 +T__47=48 +T__48=49 +T__49=50 +T__50=51 +T__51=52 +T__52=53 +T__53=54 +T__54=55 +T__55=56 +T__56=57 +T__57=58 +T__58=59 +T__59=60 +T__60=61 +T__61=62 +T__62=63 +T__63=64 +T__64=65 +T__65=66 +T__66=67 +T__67=68 +T__68=69 +T__69=70 +T__70=71 +T__71=72 +T__72=73 +T__73=74 +T__74=75 +T__75=76 +T__76=77 +T__77=78 +T__78=79 +T__79=80 +T__80=81 +T__81=82 +T__82=83 +T__83=84 +T__84=85 +T__85=86 +T__86=87 +T__87=88 +T__88=89 +T__89=90 +T__90=91 +T__91=92 +LBRACKET=93 +RBRACKET=94 +LBRACE=95 +RBRACE=96 +LPAREN=97 +RPAREN=98 +COLON=99 +SEMICOLON=100 +DOT=101 +COMMA=102 +ASSIGN=103 +ARROW=104 +Constant=105 +Whitespace=106 +Newline=107 +Integer=108 +Float=109 +RealNumber=110 +Identifier=111 +StringLiteral=112 +LineComment=113 +BlockComment=114 +'OPENQASM'=1 +'include'=2 +'qubit'=3 +'qreg'=4 +'bit'=5 +'creg'=6 +'int'=7 +'uint'=8 +'float'=9 +'angle'=10 +'fixed'=11 +'bool'=12 +'const'=13 +'let'=14 +'||'=15 +'gate'=16 +'measure'=17 +'barrier'=18 +'inv'=19 +'pow'=20 +'ctrl'=21 +'@'=22 +'CX'=23 +'U'=24 +'reset'=25 +'~'=26 +'!'=27 +'+'=28 +'-'=29 +'*'=30 +'/'=31 +'<<'=32 +'>>'=33 +'rotl'=34 +'rotr'=35 +'&&'=36 +'&'=37 +'|'=38 +'^'=39 +'>'=40 +'<'=41 +'>='=42 +'<='=43 +'=='=44 +'!='=45 +'return'=46 +'sin'=47 +'cos'=48 +'tan'=49 +'exp'=50 +'ln'=51 +'sqrt'=52 +'popcount'=53 +'lengthof'=54 +'++'=55 +'--'=56 +'+='=57 +'-='=58 +'*='=59 +'/='=60 +'&='=61 +'|='=62 +'~='=63 +'^='=64 +'<<='=65 +'>>='=66 +'in'=67 +'if'=68 +'else'=69 +'for'=70 +'while'=71 +'break'=72 +'continue'=73 +'end'=74 +'kernel'=75 +'def'=76 +'#pragma'=77 +'dt'=78 +'ns'=79 +'us'=80 +'ms'=81 +'s'=82 +'length'=83 +'stretch'=84 +'boxas'=85 +'boxto'=86 +'stretchinf'=87 +'delay'=88 +'rotary'=89 +'defcalgrammar'=90 +'defcal'=91 +'openpulse'=92 +'['=93 +']'=94 +'{'=95 +'}'=96 +'('=97 +')'=98 +':'=99 +';'=100 +'.'=101 +','=102 +'='=103 +'->'=104 diff --git a/internal/qasm3/qasm3_base_listener.go b/internal/qasm3/qasm3_base_listener.go new file mode 100644 index 0000000..fe7a97e --- /dev/null +++ b/internal/qasm3/qasm3_base_listener.go @@ -0,0 +1,542 @@ +// Code generated from ./qasm3.g4 by ANTLR 4.9. DO NOT EDIT. + +package parser // qasm3 + +import "github.com/antlr/antlr4/runtime/Go/antlr" + +// Baseqasm3Listener is a complete listener for a parse tree produced by qasm3Parser. +type Baseqasm3Listener struct{} + +var _ qasm3Listener = &Baseqasm3Listener{} + +// VisitTerminal is called when a terminal node is visited. +func (s *Baseqasm3Listener) VisitTerminal(node antlr.TerminalNode) {} + +// VisitErrorNode is called when an error node is visited. +func (s *Baseqasm3Listener) VisitErrorNode(node antlr.ErrorNode) {} + +// EnterEveryRule is called when any rule is entered. +func (s *Baseqasm3Listener) EnterEveryRule(ctx antlr.ParserRuleContext) {} + +// ExitEveryRule is called when any rule is exited. +func (s *Baseqasm3Listener) ExitEveryRule(ctx antlr.ParserRuleContext) {} + +// EnterProgram is called when production program is entered. +func (s *Baseqasm3Listener) EnterProgram(ctx *ProgramContext) {} + +// ExitProgram is called when production program is exited. +func (s *Baseqasm3Listener) ExitProgram(ctx *ProgramContext) {} + +// EnterHeader is called when production header is entered. +func (s *Baseqasm3Listener) EnterHeader(ctx *HeaderContext) {} + +// ExitHeader is called when production header is exited. +func (s *Baseqasm3Listener) ExitHeader(ctx *HeaderContext) {} + +// EnterVersion is called when production version is entered. +func (s *Baseqasm3Listener) EnterVersion(ctx *VersionContext) {} + +// ExitVersion is called when production version is exited. +func (s *Baseqasm3Listener) ExitVersion(ctx *VersionContext) {} + +// EnterInclude is called when production include is entered. +func (s *Baseqasm3Listener) EnterInclude(ctx *IncludeContext) {} + +// ExitInclude is called when production include is exited. +func (s *Baseqasm3Listener) ExitInclude(ctx *IncludeContext) {} + +// EnterStatement is called when production statement is entered. +func (s *Baseqasm3Listener) EnterStatement(ctx *StatementContext) {} + +// ExitStatement is called when production statement is exited. +func (s *Baseqasm3Listener) ExitStatement(ctx *StatementContext) {} + +// EnterGlobalStatement is called when production globalStatement is entered. +func (s *Baseqasm3Listener) EnterGlobalStatement(ctx *GlobalStatementContext) {} + +// ExitGlobalStatement is called when production globalStatement is exited. +func (s *Baseqasm3Listener) ExitGlobalStatement(ctx *GlobalStatementContext) {} + +// EnterDeclarationStatement is called when production declarationStatement is entered. +func (s *Baseqasm3Listener) EnterDeclarationStatement(ctx *DeclarationStatementContext) {} + +// ExitDeclarationStatement is called when production declarationStatement is exited. +func (s *Baseqasm3Listener) ExitDeclarationStatement(ctx *DeclarationStatementContext) {} + +// EnterComment is called when production comment is entered. +func (s *Baseqasm3Listener) EnterComment(ctx *CommentContext) {} + +// ExitComment is called when production comment is exited. +func (s *Baseqasm3Listener) ExitComment(ctx *CommentContext) {} + +// EnterReturnSignature is called when production returnSignature is entered. +func (s *Baseqasm3Listener) EnterReturnSignature(ctx *ReturnSignatureContext) {} + +// ExitReturnSignature is called when production returnSignature is exited. +func (s *Baseqasm3Listener) ExitReturnSignature(ctx *ReturnSignatureContext) {} + +// EnterProgramBlock is called when production programBlock is entered. +func (s *Baseqasm3Listener) EnterProgramBlock(ctx *ProgramBlockContext) {} + +// ExitProgramBlock is called when production programBlock is exited. +func (s *Baseqasm3Listener) ExitProgramBlock(ctx *ProgramBlockContext) {} + +// EnterDesignator is called when production designator is entered. +func (s *Baseqasm3Listener) EnterDesignator(ctx *DesignatorContext) {} + +// ExitDesignator is called when production designator is exited. +func (s *Baseqasm3Listener) ExitDesignator(ctx *DesignatorContext) {} + +// EnterDoubleDesignator is called when production doubleDesignator is entered. +func (s *Baseqasm3Listener) EnterDoubleDesignator(ctx *DoubleDesignatorContext) {} + +// ExitDoubleDesignator is called when production doubleDesignator is exited. +func (s *Baseqasm3Listener) ExitDoubleDesignator(ctx *DoubleDesignatorContext) {} + +// EnterIdentifierList is called when production identifierList is entered. +func (s *Baseqasm3Listener) EnterIdentifierList(ctx *IdentifierListContext) {} + +// ExitIdentifierList is called when production identifierList is exited. +func (s *Baseqasm3Listener) ExitIdentifierList(ctx *IdentifierListContext) {} + +// EnterIndexIdentifier is called when production indexIdentifier is entered. +func (s *Baseqasm3Listener) EnterIndexIdentifier(ctx *IndexIdentifierContext) {} + +// ExitIndexIdentifier is called when production indexIdentifier is exited. +func (s *Baseqasm3Listener) ExitIndexIdentifier(ctx *IndexIdentifierContext) {} + +// EnterIndexIdentifierList is called when production indexIdentifierList is entered. +func (s *Baseqasm3Listener) EnterIndexIdentifierList(ctx *IndexIdentifierListContext) {} + +// ExitIndexIdentifierList is called when production indexIdentifierList is exited. +func (s *Baseqasm3Listener) ExitIndexIdentifierList(ctx *IndexIdentifierListContext) {} + +// EnterAssociation is called when production association is entered. +func (s *Baseqasm3Listener) EnterAssociation(ctx *AssociationContext) {} + +// ExitAssociation is called when production association is exited. +func (s *Baseqasm3Listener) ExitAssociation(ctx *AssociationContext) {} + +// EnterQuantumType is called when production quantumType is entered. +func (s *Baseqasm3Listener) EnterQuantumType(ctx *QuantumTypeContext) {} + +// ExitQuantumType is called when production quantumType is exited. +func (s *Baseqasm3Listener) ExitQuantumType(ctx *QuantumTypeContext) {} + +// EnterQuantumDeclaration is called when production quantumDeclaration is entered. +func (s *Baseqasm3Listener) EnterQuantumDeclaration(ctx *QuantumDeclarationContext) {} + +// ExitQuantumDeclaration is called when production quantumDeclaration is exited. +func (s *Baseqasm3Listener) ExitQuantumDeclaration(ctx *QuantumDeclarationContext) {} + +// EnterQuantumArgument is called when production quantumArgument is entered. +func (s *Baseqasm3Listener) EnterQuantumArgument(ctx *QuantumArgumentContext) {} + +// ExitQuantumArgument is called when production quantumArgument is exited. +func (s *Baseqasm3Listener) ExitQuantumArgument(ctx *QuantumArgumentContext) {} + +// EnterQuantumArgumentList is called when production quantumArgumentList is entered. +func (s *Baseqasm3Listener) EnterQuantumArgumentList(ctx *QuantumArgumentListContext) {} + +// ExitQuantumArgumentList is called when production quantumArgumentList is exited. +func (s *Baseqasm3Listener) ExitQuantumArgumentList(ctx *QuantumArgumentListContext) {} + +// EnterBitType is called when production bitType is entered. +func (s *Baseqasm3Listener) EnterBitType(ctx *BitTypeContext) {} + +// ExitBitType is called when production bitType is exited. +func (s *Baseqasm3Listener) ExitBitType(ctx *BitTypeContext) {} + +// EnterSingleDesignatorType is called when production singleDesignatorType is entered. +func (s *Baseqasm3Listener) EnterSingleDesignatorType(ctx *SingleDesignatorTypeContext) {} + +// ExitSingleDesignatorType is called when production singleDesignatorType is exited. +func (s *Baseqasm3Listener) ExitSingleDesignatorType(ctx *SingleDesignatorTypeContext) {} + +// EnterDoubleDesignatorType is called when production doubleDesignatorType is entered. +func (s *Baseqasm3Listener) EnterDoubleDesignatorType(ctx *DoubleDesignatorTypeContext) {} + +// ExitDoubleDesignatorType is called when production doubleDesignatorType is exited. +func (s *Baseqasm3Listener) ExitDoubleDesignatorType(ctx *DoubleDesignatorTypeContext) {} + +// EnterNoDesignatorType is called when production noDesignatorType is entered. +func (s *Baseqasm3Listener) EnterNoDesignatorType(ctx *NoDesignatorTypeContext) {} + +// ExitNoDesignatorType is called when production noDesignatorType is exited. +func (s *Baseqasm3Listener) ExitNoDesignatorType(ctx *NoDesignatorTypeContext) {} + +// EnterClassicalType is called when production classicalType is entered. +func (s *Baseqasm3Listener) EnterClassicalType(ctx *ClassicalTypeContext) {} + +// ExitClassicalType is called when production classicalType is exited. +func (s *Baseqasm3Listener) ExitClassicalType(ctx *ClassicalTypeContext) {} + +// EnterConstantDeclaration is called when production constantDeclaration is entered. +func (s *Baseqasm3Listener) EnterConstantDeclaration(ctx *ConstantDeclarationContext) {} + +// ExitConstantDeclaration is called when production constantDeclaration is exited. +func (s *Baseqasm3Listener) ExitConstantDeclaration(ctx *ConstantDeclarationContext) {} + +// EnterSingleDesignatorDeclaration is called when production singleDesignatorDeclaration is entered. +func (s *Baseqasm3Listener) EnterSingleDesignatorDeclaration(ctx *SingleDesignatorDeclarationContext) { +} + +// ExitSingleDesignatorDeclaration is called when production singleDesignatorDeclaration is exited. +func (s *Baseqasm3Listener) ExitSingleDesignatorDeclaration(ctx *SingleDesignatorDeclarationContext) { +} + +// EnterDoubleDesignatorDeclaration is called when production doubleDesignatorDeclaration is entered. +func (s *Baseqasm3Listener) EnterDoubleDesignatorDeclaration(ctx *DoubleDesignatorDeclarationContext) { +} + +// ExitDoubleDesignatorDeclaration is called when production doubleDesignatorDeclaration is exited. +func (s *Baseqasm3Listener) ExitDoubleDesignatorDeclaration(ctx *DoubleDesignatorDeclarationContext) { +} + +// EnterNoDesignatorDeclaration is called when production noDesignatorDeclaration is entered. +func (s *Baseqasm3Listener) EnterNoDesignatorDeclaration(ctx *NoDesignatorDeclarationContext) {} + +// ExitNoDesignatorDeclaration is called when production noDesignatorDeclaration is exited. +func (s *Baseqasm3Listener) ExitNoDesignatorDeclaration(ctx *NoDesignatorDeclarationContext) {} + +// EnterBitDeclaration is called when production bitDeclaration is entered. +func (s *Baseqasm3Listener) EnterBitDeclaration(ctx *BitDeclarationContext) {} + +// ExitBitDeclaration is called when production bitDeclaration is exited. +func (s *Baseqasm3Listener) ExitBitDeclaration(ctx *BitDeclarationContext) {} + +// EnterClassicalVariableDeclaration is called when production classicalVariableDeclaration is entered. +func (s *Baseqasm3Listener) EnterClassicalVariableDeclaration(ctx *ClassicalVariableDeclarationContext) { +} + +// ExitClassicalVariableDeclaration is called when production classicalVariableDeclaration is exited. +func (s *Baseqasm3Listener) ExitClassicalVariableDeclaration(ctx *ClassicalVariableDeclarationContext) { +} + +// EnterClassicalDeclaration is called when production classicalDeclaration is entered. +func (s *Baseqasm3Listener) EnterClassicalDeclaration(ctx *ClassicalDeclarationContext) {} + +// ExitClassicalDeclaration is called when production classicalDeclaration is exited. +func (s *Baseqasm3Listener) ExitClassicalDeclaration(ctx *ClassicalDeclarationContext) {} + +// EnterClassicalTypeList is called when production classicalTypeList is entered. +func (s *Baseqasm3Listener) EnterClassicalTypeList(ctx *ClassicalTypeListContext) {} + +// ExitClassicalTypeList is called when production classicalTypeList is exited. +func (s *Baseqasm3Listener) ExitClassicalTypeList(ctx *ClassicalTypeListContext) {} + +// EnterClassicalArgument is called when production classicalArgument is entered. +func (s *Baseqasm3Listener) EnterClassicalArgument(ctx *ClassicalArgumentContext) {} + +// ExitClassicalArgument is called when production classicalArgument is exited. +func (s *Baseqasm3Listener) ExitClassicalArgument(ctx *ClassicalArgumentContext) {} + +// EnterClassicalArgumentList is called when production classicalArgumentList is entered. +func (s *Baseqasm3Listener) EnterClassicalArgumentList(ctx *ClassicalArgumentListContext) {} + +// ExitClassicalArgumentList is called when production classicalArgumentList is exited. +func (s *Baseqasm3Listener) ExitClassicalArgumentList(ctx *ClassicalArgumentListContext) {} + +// EnterAliasStatement is called when production aliasStatement is entered. +func (s *Baseqasm3Listener) EnterAliasStatement(ctx *AliasStatementContext) {} + +// ExitAliasStatement is called when production aliasStatement is exited. +func (s *Baseqasm3Listener) ExitAliasStatement(ctx *AliasStatementContext) {} + +// EnterConcatenateExpression is called when production concatenateExpression is entered. +func (s *Baseqasm3Listener) EnterConcatenateExpression(ctx *ConcatenateExpressionContext) {} + +// ExitConcatenateExpression is called when production concatenateExpression is exited. +func (s *Baseqasm3Listener) ExitConcatenateExpression(ctx *ConcatenateExpressionContext) {} + +// EnterRangeDefinition is called when production rangeDefinition is entered. +func (s *Baseqasm3Listener) EnterRangeDefinition(ctx *RangeDefinitionContext) {} + +// ExitRangeDefinition is called when production rangeDefinition is exited. +func (s *Baseqasm3Listener) ExitRangeDefinition(ctx *RangeDefinitionContext) {} + +// EnterQuantumGateDefinition is called when production quantumGateDefinition is entered. +func (s *Baseqasm3Listener) EnterQuantumGateDefinition(ctx *QuantumGateDefinitionContext) {} + +// ExitQuantumGateDefinition is called when production quantumGateDefinition is exited. +func (s *Baseqasm3Listener) ExitQuantumGateDefinition(ctx *QuantumGateDefinitionContext) {} + +// EnterQuantumGateSignature is called when production quantumGateSignature is entered. +func (s *Baseqasm3Listener) EnterQuantumGateSignature(ctx *QuantumGateSignatureContext) {} + +// ExitQuantumGateSignature is called when production quantumGateSignature is exited. +func (s *Baseqasm3Listener) ExitQuantumGateSignature(ctx *QuantumGateSignatureContext) {} + +// EnterQuantumBlock is called when production quantumBlock is entered. +func (s *Baseqasm3Listener) EnterQuantumBlock(ctx *QuantumBlockContext) {} + +// ExitQuantumBlock is called when production quantumBlock is exited. +func (s *Baseqasm3Listener) ExitQuantumBlock(ctx *QuantumBlockContext) {} + +// EnterQuantumStatement is called when production quantumStatement is entered. +func (s *Baseqasm3Listener) EnterQuantumStatement(ctx *QuantumStatementContext) {} + +// ExitQuantumStatement is called when production quantumStatement is exited. +func (s *Baseqasm3Listener) ExitQuantumStatement(ctx *QuantumStatementContext) {} + +// EnterQuantumInstruction is called when production quantumInstruction is entered. +func (s *Baseqasm3Listener) EnterQuantumInstruction(ctx *QuantumInstructionContext) {} + +// ExitQuantumInstruction is called when production quantumInstruction is exited. +func (s *Baseqasm3Listener) ExitQuantumInstruction(ctx *QuantumInstructionContext) {} + +// EnterQuantumMeasurement is called when production quantumMeasurement is entered. +func (s *Baseqasm3Listener) EnterQuantumMeasurement(ctx *QuantumMeasurementContext) {} + +// ExitQuantumMeasurement is called when production quantumMeasurement is exited. +func (s *Baseqasm3Listener) ExitQuantumMeasurement(ctx *QuantumMeasurementContext) {} + +// EnterQuantumMeasurementDeclaration is called when production quantumMeasurementDeclaration is entered. +func (s *Baseqasm3Listener) EnterQuantumMeasurementDeclaration(ctx *QuantumMeasurementDeclarationContext) { +} + +// ExitQuantumMeasurementDeclaration is called when production quantumMeasurementDeclaration is exited. +func (s *Baseqasm3Listener) ExitQuantumMeasurementDeclaration(ctx *QuantumMeasurementDeclarationContext) { +} + +// EnterQuantumBarrier is called when production quantumBarrier is entered. +func (s *Baseqasm3Listener) EnterQuantumBarrier(ctx *QuantumBarrierContext) {} + +// ExitQuantumBarrier is called when production quantumBarrier is exited. +func (s *Baseqasm3Listener) ExitQuantumBarrier(ctx *QuantumBarrierContext) {} + +// EnterQuantumGateModifier is called when production quantumGateModifier is entered. +func (s *Baseqasm3Listener) EnterQuantumGateModifier(ctx *QuantumGateModifierContext) {} + +// ExitQuantumGateModifier is called when production quantumGateModifier is exited. +func (s *Baseqasm3Listener) ExitQuantumGateModifier(ctx *QuantumGateModifierContext) {} + +// EnterQuantumGateCall is called when production quantumGateCall is entered. +func (s *Baseqasm3Listener) EnterQuantumGateCall(ctx *QuantumGateCallContext) {} + +// ExitQuantumGateCall is called when production quantumGateCall is exited. +func (s *Baseqasm3Listener) ExitQuantumGateCall(ctx *QuantumGateCallContext) {} + +// EnterQuantumGateName is called when production quantumGateName is entered. +func (s *Baseqasm3Listener) EnterQuantumGateName(ctx *QuantumGateNameContext) {} + +// ExitQuantumGateName is called when production quantumGateName is exited. +func (s *Baseqasm3Listener) ExitQuantumGateName(ctx *QuantumGateNameContext) {} + +// EnterUnaryOperator is called when production unaryOperator is entered. +func (s *Baseqasm3Listener) EnterUnaryOperator(ctx *UnaryOperatorContext) {} + +// ExitUnaryOperator is called when production unaryOperator is exited. +func (s *Baseqasm3Listener) ExitUnaryOperator(ctx *UnaryOperatorContext) {} + +// EnterBinaryOperator is called when production binaryOperator is entered. +func (s *Baseqasm3Listener) EnterBinaryOperator(ctx *BinaryOperatorContext) {} + +// ExitBinaryOperator is called when production binaryOperator is exited. +func (s *Baseqasm3Listener) ExitBinaryOperator(ctx *BinaryOperatorContext) {} + +// EnterExpressionStatement is called when production expressionStatement is entered. +func (s *Baseqasm3Listener) EnterExpressionStatement(ctx *ExpressionStatementContext) {} + +// ExitExpressionStatement is called when production expressionStatement is exited. +func (s *Baseqasm3Listener) ExitExpressionStatement(ctx *ExpressionStatementContext) {} + +// EnterExpression is called when production expression is entered. +func (s *Baseqasm3Listener) EnterExpression(ctx *ExpressionContext) {} + +// ExitExpression is called when production expression is exited. +func (s *Baseqasm3Listener) ExitExpression(ctx *ExpressionContext) {} + +// EnterExpressionTerminator is called when production expressionTerminator is entered. +func (s *Baseqasm3Listener) EnterExpressionTerminator(ctx *ExpressionTerminatorContext) {} + +// ExitExpressionTerminator is called when production expressionTerminator is exited. +func (s *Baseqasm3Listener) ExitExpressionTerminator(ctx *ExpressionTerminatorContext) {} + +// EnterExpressionList is called when production expressionList is entered. +func (s *Baseqasm3Listener) EnterExpressionList(ctx *ExpressionListContext) {} + +// ExitExpressionList is called when production expressionList is exited. +func (s *Baseqasm3Listener) ExitExpressionList(ctx *ExpressionListContext) {} + +// EnterCall is called when production call is entered. +func (s *Baseqasm3Listener) EnterCall(ctx *CallContext) {} + +// ExitCall is called when production call is exited. +func (s *Baseqasm3Listener) ExitCall(ctx *CallContext) {} + +// EnterBuiltInMath is called when production builtInMath is entered. +func (s *Baseqasm3Listener) EnterBuiltInMath(ctx *BuiltInMathContext) {} + +// ExitBuiltInMath is called when production builtInMath is exited. +func (s *Baseqasm3Listener) ExitBuiltInMath(ctx *BuiltInMathContext) {} + +// EnterCastOperator is called when production castOperator is entered. +func (s *Baseqasm3Listener) EnterCastOperator(ctx *CastOperatorContext) {} + +// ExitCastOperator is called when production castOperator is exited. +func (s *Baseqasm3Listener) ExitCastOperator(ctx *CastOperatorContext) {} + +// EnterIncrementor is called when production incrementor is entered. +func (s *Baseqasm3Listener) EnterIncrementor(ctx *IncrementorContext) {} + +// ExitIncrementor is called when production incrementor is exited. +func (s *Baseqasm3Listener) ExitIncrementor(ctx *IncrementorContext) {} + +// EnterAssignmentExpression is called when production assignmentExpression is entered. +func (s *Baseqasm3Listener) EnterAssignmentExpression(ctx *AssignmentExpressionContext) {} + +// ExitAssignmentExpression is called when production assignmentExpression is exited. +func (s *Baseqasm3Listener) ExitAssignmentExpression(ctx *AssignmentExpressionContext) {} + +// EnterAssignmentOperator is called when production assignmentOperator is entered. +func (s *Baseqasm3Listener) EnterAssignmentOperator(ctx *AssignmentOperatorContext) {} + +// ExitAssignmentOperator is called when production assignmentOperator is exited. +func (s *Baseqasm3Listener) ExitAssignmentOperator(ctx *AssignmentOperatorContext) {} + +// EnterMembershipTest is called when production membershipTest is entered. +func (s *Baseqasm3Listener) EnterMembershipTest(ctx *MembershipTestContext) {} + +// ExitMembershipTest is called when production membershipTest is exited. +func (s *Baseqasm3Listener) ExitMembershipTest(ctx *MembershipTestContext) {} + +// EnterSetDeclaration is called when production setDeclaration is entered. +func (s *Baseqasm3Listener) EnterSetDeclaration(ctx *SetDeclarationContext) {} + +// ExitSetDeclaration is called when production setDeclaration is exited. +func (s *Baseqasm3Listener) ExitSetDeclaration(ctx *SetDeclarationContext) {} + +// EnterLoopBranchBlock is called when production loopBranchBlock is entered. +func (s *Baseqasm3Listener) EnterLoopBranchBlock(ctx *LoopBranchBlockContext) {} + +// ExitLoopBranchBlock is called when production loopBranchBlock is exited. +func (s *Baseqasm3Listener) ExitLoopBranchBlock(ctx *LoopBranchBlockContext) {} + +// EnterBranchingStatement is called when production branchingStatement is entered. +func (s *Baseqasm3Listener) EnterBranchingStatement(ctx *BranchingStatementContext) {} + +// ExitBranchingStatement is called when production branchingStatement is exited. +func (s *Baseqasm3Listener) ExitBranchingStatement(ctx *BranchingStatementContext) {} + +// EnterLoopStatement is called when production loopStatement is entered. +func (s *Baseqasm3Listener) EnterLoopStatement(ctx *LoopStatementContext) {} + +// ExitLoopStatement is called when production loopStatement is exited. +func (s *Baseqasm3Listener) ExitLoopStatement(ctx *LoopStatementContext) {} + +// EnterControlDirectiveStatement is called when production controlDirectiveStatement is entered. +func (s *Baseqasm3Listener) EnterControlDirectiveStatement(ctx *ControlDirectiveStatementContext) {} + +// ExitControlDirectiveStatement is called when production controlDirectiveStatement is exited. +func (s *Baseqasm3Listener) ExitControlDirectiveStatement(ctx *ControlDirectiveStatementContext) {} + +// EnterControlDirective is called when production controlDirective is entered. +func (s *Baseqasm3Listener) EnterControlDirective(ctx *ControlDirectiveContext) {} + +// ExitControlDirective is called when production controlDirective is exited. +func (s *Baseqasm3Listener) ExitControlDirective(ctx *ControlDirectiveContext) {} + +// EnterKernelDeclaration is called when production kernelDeclaration is entered. +func (s *Baseqasm3Listener) EnterKernelDeclaration(ctx *KernelDeclarationContext) {} + +// ExitKernelDeclaration is called when production kernelDeclaration is exited. +func (s *Baseqasm3Listener) ExitKernelDeclaration(ctx *KernelDeclarationContext) {} + +// EnterSubroutineDefinition is called when production subroutineDefinition is entered. +func (s *Baseqasm3Listener) EnterSubroutineDefinition(ctx *SubroutineDefinitionContext) {} + +// ExitSubroutineDefinition is called when production subroutineDefinition is exited. +func (s *Baseqasm3Listener) ExitSubroutineDefinition(ctx *SubroutineDefinitionContext) {} + +// EnterSubroutineArgumentList is called when production subroutineArgumentList is entered. +func (s *Baseqasm3Listener) EnterSubroutineArgumentList(ctx *SubroutineArgumentListContext) {} + +// ExitSubroutineArgumentList is called when production subroutineArgumentList is exited. +func (s *Baseqasm3Listener) ExitSubroutineArgumentList(ctx *SubroutineArgumentListContext) {} + +// EnterPragma is called when production pragma is entered. +func (s *Baseqasm3Listener) EnterPragma(ctx *PragmaContext) {} + +// ExitPragma is called when production pragma is exited. +func (s *Baseqasm3Listener) ExitPragma(ctx *PragmaContext) {} + +// EnterTimeUnit is called when production timeUnit is entered. +func (s *Baseqasm3Listener) EnterTimeUnit(ctx *TimeUnitContext) {} + +// ExitTimeUnit is called when production timeUnit is exited. +func (s *Baseqasm3Listener) ExitTimeUnit(ctx *TimeUnitContext) {} + +// EnterTimingType is called when production timingType is entered. +func (s *Baseqasm3Listener) EnterTimingType(ctx *TimingTypeContext) {} + +// ExitTimingType is called when production timingType is exited. +func (s *Baseqasm3Listener) ExitTimingType(ctx *TimingTypeContext) {} + +// EnterTimingBox is called when production timingBox is entered. +func (s *Baseqasm3Listener) EnterTimingBox(ctx *TimingBoxContext) {} + +// ExitTimingBox is called when production timingBox is exited. +func (s *Baseqasm3Listener) ExitTimingBox(ctx *TimingBoxContext) {} + +// EnterTimeTerminator is called when production timeTerminator is entered. +func (s *Baseqasm3Listener) EnterTimeTerminator(ctx *TimeTerminatorContext) {} + +// ExitTimeTerminator is called when production timeTerminator is exited. +func (s *Baseqasm3Listener) ExitTimeTerminator(ctx *TimeTerminatorContext) {} + +// EnterTimeIdentifier is called when production timeIdentifier is entered. +func (s *Baseqasm3Listener) EnterTimeIdentifier(ctx *TimeIdentifierContext) {} + +// ExitTimeIdentifier is called when production timeIdentifier is exited. +func (s *Baseqasm3Listener) ExitTimeIdentifier(ctx *TimeIdentifierContext) {} + +// EnterTimeInstructionName is called when production timeInstructionName is entered. +func (s *Baseqasm3Listener) EnterTimeInstructionName(ctx *TimeInstructionNameContext) {} + +// ExitTimeInstructionName is called when production timeInstructionName is exited. +func (s *Baseqasm3Listener) ExitTimeInstructionName(ctx *TimeInstructionNameContext) {} + +// EnterTimeInstruction is called when production timeInstruction is entered. +func (s *Baseqasm3Listener) EnterTimeInstruction(ctx *TimeInstructionContext) {} + +// ExitTimeInstruction is called when production timeInstruction is exited. +func (s *Baseqasm3Listener) ExitTimeInstruction(ctx *TimeInstructionContext) {} + +// EnterTimeStatement is called when production timeStatement is entered. +func (s *Baseqasm3Listener) EnterTimeStatement(ctx *TimeStatementContext) {} + +// ExitTimeStatement is called when production timeStatement is exited. +func (s *Baseqasm3Listener) ExitTimeStatement(ctx *TimeStatementContext) {} + +// EnterCalibration is called when production calibration is entered. +func (s *Baseqasm3Listener) EnterCalibration(ctx *CalibrationContext) {} + +// ExitCalibration is called when production calibration is exited. +func (s *Baseqasm3Listener) ExitCalibration(ctx *CalibrationContext) {} + +// EnterCalibrationGrammarDeclaration is called when production calibrationGrammarDeclaration is entered. +func (s *Baseqasm3Listener) EnterCalibrationGrammarDeclaration(ctx *CalibrationGrammarDeclarationContext) { +} + +// ExitCalibrationGrammarDeclaration is called when production calibrationGrammarDeclaration is exited. +func (s *Baseqasm3Listener) ExitCalibrationGrammarDeclaration(ctx *CalibrationGrammarDeclarationContext) { +} + +// EnterCalibrationDefinition is called when production calibrationDefinition is entered. +func (s *Baseqasm3Listener) EnterCalibrationDefinition(ctx *CalibrationDefinitionContext) {} + +// ExitCalibrationDefinition is called when production calibrationDefinition is exited. +func (s *Baseqasm3Listener) ExitCalibrationDefinition(ctx *CalibrationDefinitionContext) {} + +// EnterCalibrationGrammar is called when production calibrationGrammar is entered. +func (s *Baseqasm3Listener) EnterCalibrationGrammar(ctx *CalibrationGrammarContext) {} + +// ExitCalibrationGrammar is called when production calibrationGrammar is exited. +func (s *Baseqasm3Listener) ExitCalibrationGrammar(ctx *CalibrationGrammarContext) {} + +// EnterCalibrationArgumentList is called when production calibrationArgumentList is entered. +func (s *Baseqasm3Listener) EnterCalibrationArgumentList(ctx *CalibrationArgumentListContext) {} + +// ExitCalibrationArgumentList is called when production calibrationArgumentList is exited. +func (s *Baseqasm3Listener) ExitCalibrationArgumentList(ctx *CalibrationArgumentListContext) {} diff --git a/internal/qasm3/qasm3_lexer.go b/internal/qasm3/qasm3_lexer.go new file mode 100644 index 0000000..0d6e7c6 --- /dev/null +++ b/internal/qasm3/qasm3_lexer.go @@ -0,0 +1,583 @@ +// Code generated from ./qasm3.g4 by ANTLR 4.9. DO NOT EDIT. + +package parser + +import ( + "fmt" + "unicode" + + "github.com/antlr/antlr4/runtime/Go/antlr" +) + +// Suppress unused import error +var _ = fmt.Printf +var _ = unicode.IsLetter + +var serializedLexerAtn = []uint16{ + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 116, 814, + 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, + 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, + 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, + 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, + 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, + 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, + 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, + 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, + 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, + 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, + 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, + 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, + 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, + 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, + 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, + 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, + 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, + 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, + 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, + 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, + 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, + 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, + 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, + 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, + 9, 124, 4, 125, 9, 125, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, + 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, + 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, + 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, + 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, + 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, + 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, + 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, + 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, + 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, + 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, + 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, + 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, + 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, + 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, + 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, + 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, + 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, + 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, + 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, + 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, + 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, + 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, + 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, + 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, + 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, + 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, + 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, + 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, + 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, + 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, + 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, + 3, 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, + 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, + 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, + 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, + 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, + 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, + 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, + 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, + 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, + 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, + 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, + 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, + 3, 106, 3, 106, 5, 106, 714, 10, 106, 3, 107, 6, 107, 717, 10, 107, 13, + 107, 14, 107, 718, 3, 107, 3, 107, 3, 108, 6, 108, 724, 10, 108, 13, 108, + 14, 108, 725, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 6, 110, 733, 10, + 110, 13, 110, 14, 110, 734, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, + 113, 3, 114, 3, 114, 3, 115, 7, 115, 746, 10, 115, 12, 115, 14, 115, 749, + 11, 115, 3, 115, 3, 115, 6, 115, 753, 10, 115, 13, 115, 14, 115, 754, 3, + 116, 3, 116, 3, 116, 5, 116, 760, 10, 116, 3, 116, 3, 116, 5, 116, 764, + 10, 116, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 770, 10, 117, 3, 118, + 3, 118, 7, 118, 774, 10, 118, 12, 118, 14, 118, 777, 11, 118, 3, 119, 3, + 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 6, 121, 786, 10, 121, 13, + 121, 14, 121, 787, 3, 122, 3, 122, 3, 122, 6, 122, 793, 10, 122, 13, 122, + 14, 122, 794, 3, 123, 3, 123, 5, 123, 799, 10, 123, 3, 123, 3, 123, 3, + 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, + 125, 3, 125, 3, 125, 3, 787, 2, 126, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, + 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, + 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, + 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, + 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, + 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, + 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, + 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, + 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, + 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, + 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, + 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, + 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, + 109, 217, 2, 219, 110, 221, 2, 223, 2, 225, 2, 227, 2, 229, 111, 231, 112, + 233, 2, 235, 113, 237, 2, 239, 114, 241, 2, 243, 2, 245, 2, 247, 115, 249, + 116, 3, 2, 11, 4, 2, 11, 11, 34, 34, 4, 2, 12, 12, 15, 15, 3, 2, 50, 59, + 3, 2, 99, 124, 3, 2, 67, 92, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, + 47, 4, 2, 36, 36, 41, 41, 5, 2, 11, 12, 15, 15, 34, 34, 3, 3, 2, 55057, + 3, 55057, 3, 824, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, + 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, + 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, + 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, + 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, + 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, + 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, + 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, + 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, + 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, + 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, + 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, + 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, + 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, + 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, + 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, + 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, + 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, + 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, + 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, + 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, + 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, + 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, + 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, + 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, + 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, + 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, + 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, + 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, + 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, + 235, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, + 2, 2, 3, 251, 3, 2, 2, 2, 5, 260, 3, 2, 2, 2, 7, 268, 3, 2, 2, 2, 9, 274, + 3, 2, 2, 2, 11, 279, 3, 2, 2, 2, 13, 283, 3, 2, 2, 2, 15, 288, 3, 2, 2, + 2, 17, 292, 3, 2, 2, 2, 19, 297, 3, 2, 2, 2, 21, 303, 3, 2, 2, 2, 23, 309, + 3, 2, 2, 2, 25, 315, 3, 2, 2, 2, 27, 320, 3, 2, 2, 2, 29, 326, 3, 2, 2, + 2, 31, 330, 3, 2, 2, 2, 33, 333, 3, 2, 2, 2, 35, 338, 3, 2, 2, 2, 37, 346, + 3, 2, 2, 2, 39, 354, 3, 2, 2, 2, 41, 358, 3, 2, 2, 2, 43, 362, 3, 2, 2, + 2, 45, 367, 3, 2, 2, 2, 47, 369, 3, 2, 2, 2, 49, 372, 3, 2, 2, 2, 51, 374, + 3, 2, 2, 2, 53, 380, 3, 2, 2, 2, 55, 382, 3, 2, 2, 2, 57, 384, 3, 2, 2, + 2, 59, 386, 3, 2, 2, 2, 61, 388, 3, 2, 2, 2, 63, 390, 3, 2, 2, 2, 65, 392, + 3, 2, 2, 2, 67, 395, 3, 2, 2, 2, 69, 398, 3, 2, 2, 2, 71, 403, 3, 2, 2, + 2, 73, 408, 3, 2, 2, 2, 75, 411, 3, 2, 2, 2, 77, 413, 3, 2, 2, 2, 79, 415, + 3, 2, 2, 2, 81, 417, 3, 2, 2, 2, 83, 419, 3, 2, 2, 2, 85, 421, 3, 2, 2, + 2, 87, 424, 3, 2, 2, 2, 89, 427, 3, 2, 2, 2, 91, 430, 3, 2, 2, 2, 93, 433, + 3, 2, 2, 2, 95, 440, 3, 2, 2, 2, 97, 444, 3, 2, 2, 2, 99, 448, 3, 2, 2, + 2, 101, 452, 3, 2, 2, 2, 103, 456, 3, 2, 2, 2, 105, 459, 3, 2, 2, 2, 107, + 464, 3, 2, 2, 2, 109, 473, 3, 2, 2, 2, 111, 482, 3, 2, 2, 2, 113, 485, + 3, 2, 2, 2, 115, 488, 3, 2, 2, 2, 117, 491, 3, 2, 2, 2, 119, 494, 3, 2, + 2, 2, 121, 497, 3, 2, 2, 2, 123, 500, 3, 2, 2, 2, 125, 503, 3, 2, 2, 2, + 127, 506, 3, 2, 2, 2, 129, 509, 3, 2, 2, 2, 131, 512, 3, 2, 2, 2, 133, + 516, 3, 2, 2, 2, 135, 520, 3, 2, 2, 2, 137, 523, 3, 2, 2, 2, 139, 526, + 3, 2, 2, 2, 141, 531, 3, 2, 2, 2, 143, 535, 3, 2, 2, 2, 145, 541, 3, 2, + 2, 2, 147, 547, 3, 2, 2, 2, 149, 556, 3, 2, 2, 2, 151, 560, 3, 2, 2, 2, + 153, 567, 3, 2, 2, 2, 155, 571, 3, 2, 2, 2, 157, 579, 3, 2, 2, 2, 159, + 582, 3, 2, 2, 2, 161, 585, 3, 2, 2, 2, 163, 588, 3, 2, 2, 2, 165, 591, + 3, 2, 2, 2, 167, 593, 3, 2, 2, 2, 169, 600, 3, 2, 2, 2, 171, 608, 3, 2, + 2, 2, 173, 614, 3, 2, 2, 2, 175, 620, 3, 2, 2, 2, 177, 631, 3, 2, 2, 2, + 179, 637, 3, 2, 2, 2, 181, 644, 3, 2, 2, 2, 183, 658, 3, 2, 2, 2, 185, + 665, 3, 2, 2, 2, 187, 675, 3, 2, 2, 2, 189, 677, 3, 2, 2, 2, 191, 679, + 3, 2, 2, 2, 193, 681, 3, 2, 2, 2, 195, 683, 3, 2, 2, 2, 197, 685, 3, 2, + 2, 2, 199, 687, 3, 2, 2, 2, 201, 689, 3, 2, 2, 2, 203, 691, 3, 2, 2, 2, + 205, 693, 3, 2, 2, 2, 207, 695, 3, 2, 2, 2, 209, 697, 3, 2, 2, 2, 211, + 713, 3, 2, 2, 2, 213, 716, 3, 2, 2, 2, 215, 723, 3, 2, 2, 2, 217, 729, + 3, 2, 2, 2, 219, 732, 3, 2, 2, 2, 221, 736, 3, 2, 2, 2, 223, 738, 3, 2, + 2, 2, 225, 740, 3, 2, 2, 2, 227, 742, 3, 2, 2, 2, 229, 747, 3, 2, 2, 2, + 231, 756, 3, 2, 2, 2, 233, 769, 3, 2, 2, 2, 235, 771, 3, 2, 2, 2, 237, + 778, 3, 2, 2, 2, 239, 780, 3, 2, 2, 2, 241, 785, 3, 2, 2, 2, 243, 792, + 3, 2, 2, 2, 245, 796, 3, 2, 2, 2, 247, 802, 3, 2, 2, 2, 249, 807, 3, 2, + 2, 2, 251, 252, 7, 81, 2, 2, 252, 253, 7, 82, 2, 2, 253, 254, 7, 71, 2, + 2, 254, 255, 7, 80, 2, 2, 255, 256, 7, 83, 2, 2, 256, 257, 7, 67, 2, 2, + 257, 258, 7, 85, 2, 2, 258, 259, 7, 79, 2, 2, 259, 4, 3, 2, 2, 2, 260, + 261, 7, 107, 2, 2, 261, 262, 7, 112, 2, 2, 262, 263, 7, 101, 2, 2, 263, + 264, 7, 110, 2, 2, 264, 265, 7, 119, 2, 2, 265, 266, 7, 102, 2, 2, 266, + 267, 7, 103, 2, 2, 267, 6, 3, 2, 2, 2, 268, 269, 7, 115, 2, 2, 269, 270, + 7, 119, 2, 2, 270, 271, 7, 100, 2, 2, 271, 272, 7, 107, 2, 2, 272, 273, + 7, 118, 2, 2, 273, 8, 3, 2, 2, 2, 274, 275, 7, 115, 2, 2, 275, 276, 7, + 116, 2, 2, 276, 277, 7, 103, 2, 2, 277, 278, 7, 105, 2, 2, 278, 10, 3, + 2, 2, 2, 279, 280, 7, 100, 2, 2, 280, 281, 7, 107, 2, 2, 281, 282, 7, 118, + 2, 2, 282, 12, 3, 2, 2, 2, 283, 284, 7, 101, 2, 2, 284, 285, 7, 116, 2, + 2, 285, 286, 7, 103, 2, 2, 286, 287, 7, 105, 2, 2, 287, 14, 3, 2, 2, 2, + 288, 289, 7, 107, 2, 2, 289, 290, 7, 112, 2, 2, 290, 291, 7, 118, 2, 2, + 291, 16, 3, 2, 2, 2, 292, 293, 7, 119, 2, 2, 293, 294, 7, 107, 2, 2, 294, + 295, 7, 112, 2, 2, 295, 296, 7, 118, 2, 2, 296, 18, 3, 2, 2, 2, 297, 298, + 7, 104, 2, 2, 298, 299, 7, 110, 2, 2, 299, 300, 7, 113, 2, 2, 300, 301, + 7, 99, 2, 2, 301, 302, 7, 118, 2, 2, 302, 20, 3, 2, 2, 2, 303, 304, 7, + 99, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 105, 2, 2, 306, 307, 7, + 110, 2, 2, 307, 308, 7, 103, 2, 2, 308, 22, 3, 2, 2, 2, 309, 310, 7, 104, + 2, 2, 310, 311, 7, 107, 2, 2, 311, 312, 7, 122, 2, 2, 312, 313, 7, 103, + 2, 2, 313, 314, 7, 102, 2, 2, 314, 24, 3, 2, 2, 2, 315, 316, 7, 100, 2, + 2, 316, 317, 7, 113, 2, 2, 317, 318, 7, 113, 2, 2, 318, 319, 7, 110, 2, + 2, 319, 26, 3, 2, 2, 2, 320, 321, 7, 101, 2, 2, 321, 322, 7, 113, 2, 2, + 322, 323, 7, 112, 2, 2, 323, 324, 7, 117, 2, 2, 324, 325, 7, 118, 2, 2, + 325, 28, 3, 2, 2, 2, 326, 327, 7, 110, 2, 2, 327, 328, 7, 103, 2, 2, 328, + 329, 7, 118, 2, 2, 329, 30, 3, 2, 2, 2, 330, 331, 7, 126, 2, 2, 331, 332, + 7, 126, 2, 2, 332, 32, 3, 2, 2, 2, 333, 334, 7, 105, 2, 2, 334, 335, 7, + 99, 2, 2, 335, 336, 7, 118, 2, 2, 336, 337, 7, 103, 2, 2, 337, 34, 3, 2, + 2, 2, 338, 339, 7, 111, 2, 2, 339, 340, 7, 103, 2, 2, 340, 341, 7, 99, + 2, 2, 341, 342, 7, 117, 2, 2, 342, 343, 7, 119, 2, 2, 343, 344, 7, 116, + 2, 2, 344, 345, 7, 103, 2, 2, 345, 36, 3, 2, 2, 2, 346, 347, 7, 100, 2, + 2, 347, 348, 7, 99, 2, 2, 348, 349, 7, 116, 2, 2, 349, 350, 7, 116, 2, + 2, 350, 351, 7, 107, 2, 2, 351, 352, 7, 103, 2, 2, 352, 353, 7, 116, 2, + 2, 353, 38, 3, 2, 2, 2, 354, 355, 7, 107, 2, 2, 355, 356, 7, 112, 2, 2, + 356, 357, 7, 120, 2, 2, 357, 40, 3, 2, 2, 2, 358, 359, 7, 114, 2, 2, 359, + 360, 7, 113, 2, 2, 360, 361, 7, 121, 2, 2, 361, 42, 3, 2, 2, 2, 362, 363, + 7, 101, 2, 2, 363, 364, 7, 118, 2, 2, 364, 365, 7, 116, 2, 2, 365, 366, + 7, 110, 2, 2, 366, 44, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 46, 3, 2, + 2, 2, 369, 370, 7, 69, 2, 2, 370, 371, 7, 90, 2, 2, 371, 48, 3, 2, 2, 2, + 372, 373, 7, 87, 2, 2, 373, 50, 3, 2, 2, 2, 374, 375, 7, 116, 2, 2, 375, + 376, 7, 103, 2, 2, 376, 377, 7, 117, 2, 2, 377, 378, 7, 103, 2, 2, 378, + 379, 7, 118, 2, 2, 379, 52, 3, 2, 2, 2, 380, 381, 7, 128, 2, 2, 381, 54, + 3, 2, 2, 2, 382, 383, 7, 35, 2, 2, 383, 56, 3, 2, 2, 2, 384, 385, 7, 45, + 2, 2, 385, 58, 3, 2, 2, 2, 386, 387, 7, 47, 2, 2, 387, 60, 3, 2, 2, 2, + 388, 389, 7, 44, 2, 2, 389, 62, 3, 2, 2, 2, 390, 391, 7, 49, 2, 2, 391, + 64, 3, 2, 2, 2, 392, 393, 7, 62, 2, 2, 393, 394, 7, 62, 2, 2, 394, 66, + 3, 2, 2, 2, 395, 396, 7, 64, 2, 2, 396, 397, 7, 64, 2, 2, 397, 68, 3, 2, + 2, 2, 398, 399, 7, 116, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 118, + 2, 2, 401, 402, 7, 110, 2, 2, 402, 70, 3, 2, 2, 2, 403, 404, 7, 116, 2, + 2, 404, 405, 7, 113, 2, 2, 405, 406, 7, 118, 2, 2, 406, 407, 7, 116, 2, + 2, 407, 72, 3, 2, 2, 2, 408, 409, 7, 40, 2, 2, 409, 410, 7, 40, 2, 2, 410, + 74, 3, 2, 2, 2, 411, 412, 7, 40, 2, 2, 412, 76, 3, 2, 2, 2, 413, 414, 7, + 126, 2, 2, 414, 78, 3, 2, 2, 2, 415, 416, 7, 96, 2, 2, 416, 80, 3, 2, 2, + 2, 417, 418, 7, 64, 2, 2, 418, 82, 3, 2, 2, 2, 419, 420, 7, 62, 2, 2, 420, + 84, 3, 2, 2, 2, 421, 422, 7, 64, 2, 2, 422, 423, 7, 63, 2, 2, 423, 86, + 3, 2, 2, 2, 424, 425, 7, 62, 2, 2, 425, 426, 7, 63, 2, 2, 426, 88, 3, 2, + 2, 2, 427, 428, 7, 63, 2, 2, 428, 429, 7, 63, 2, 2, 429, 90, 3, 2, 2, 2, + 430, 431, 7, 35, 2, 2, 431, 432, 7, 63, 2, 2, 432, 92, 3, 2, 2, 2, 433, + 434, 7, 116, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 118, 2, 2, 436, + 437, 7, 119, 2, 2, 437, 438, 7, 116, 2, 2, 438, 439, 7, 112, 2, 2, 439, + 94, 3, 2, 2, 2, 440, 441, 7, 117, 2, 2, 441, 442, 7, 107, 2, 2, 442, 443, + 7, 112, 2, 2, 443, 96, 3, 2, 2, 2, 444, 445, 7, 101, 2, 2, 445, 446, 7, + 113, 2, 2, 446, 447, 7, 117, 2, 2, 447, 98, 3, 2, 2, 2, 448, 449, 7, 118, + 2, 2, 449, 450, 7, 99, 2, 2, 450, 451, 7, 112, 2, 2, 451, 100, 3, 2, 2, + 2, 452, 453, 7, 103, 2, 2, 453, 454, 7, 122, 2, 2, 454, 455, 7, 114, 2, + 2, 455, 102, 3, 2, 2, 2, 456, 457, 7, 110, 2, 2, 457, 458, 7, 112, 2, 2, + 458, 104, 3, 2, 2, 2, 459, 460, 7, 117, 2, 2, 460, 461, 7, 115, 2, 2, 461, + 462, 7, 116, 2, 2, 462, 463, 7, 118, 2, 2, 463, 106, 3, 2, 2, 2, 464, 465, + 7, 114, 2, 2, 465, 466, 7, 113, 2, 2, 466, 467, 7, 114, 2, 2, 467, 468, + 7, 101, 2, 2, 468, 469, 7, 113, 2, 2, 469, 470, 7, 119, 2, 2, 470, 471, + 7, 112, 2, 2, 471, 472, 7, 118, 2, 2, 472, 108, 3, 2, 2, 2, 473, 474, 7, + 110, 2, 2, 474, 475, 7, 103, 2, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, + 105, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 106, 2, 2, 479, 480, 7, + 113, 2, 2, 480, 481, 7, 104, 2, 2, 481, 110, 3, 2, 2, 2, 482, 483, 7, 45, + 2, 2, 483, 484, 7, 45, 2, 2, 484, 112, 3, 2, 2, 2, 485, 486, 7, 47, 2, + 2, 486, 487, 7, 47, 2, 2, 487, 114, 3, 2, 2, 2, 488, 489, 7, 45, 2, 2, + 489, 490, 7, 63, 2, 2, 490, 116, 3, 2, 2, 2, 491, 492, 7, 47, 2, 2, 492, + 493, 7, 63, 2, 2, 493, 118, 3, 2, 2, 2, 494, 495, 7, 44, 2, 2, 495, 496, + 7, 63, 2, 2, 496, 120, 3, 2, 2, 2, 497, 498, 7, 49, 2, 2, 498, 499, 7, + 63, 2, 2, 499, 122, 3, 2, 2, 2, 500, 501, 7, 40, 2, 2, 501, 502, 7, 63, + 2, 2, 502, 124, 3, 2, 2, 2, 503, 504, 7, 126, 2, 2, 504, 505, 7, 63, 2, + 2, 505, 126, 3, 2, 2, 2, 506, 507, 7, 128, 2, 2, 507, 508, 7, 63, 2, 2, + 508, 128, 3, 2, 2, 2, 509, 510, 7, 96, 2, 2, 510, 511, 7, 63, 2, 2, 511, + 130, 3, 2, 2, 2, 512, 513, 7, 62, 2, 2, 513, 514, 7, 62, 2, 2, 514, 515, + 7, 63, 2, 2, 515, 132, 3, 2, 2, 2, 516, 517, 7, 64, 2, 2, 517, 518, 7, + 64, 2, 2, 518, 519, 7, 63, 2, 2, 519, 134, 3, 2, 2, 2, 520, 521, 7, 107, + 2, 2, 521, 522, 7, 112, 2, 2, 522, 136, 3, 2, 2, 2, 523, 524, 7, 107, 2, + 2, 524, 525, 7, 104, 2, 2, 525, 138, 3, 2, 2, 2, 526, 527, 7, 103, 2, 2, + 527, 528, 7, 110, 2, 2, 528, 529, 7, 117, 2, 2, 529, 530, 7, 103, 2, 2, + 530, 140, 3, 2, 2, 2, 531, 532, 7, 104, 2, 2, 532, 533, 7, 113, 2, 2, 533, + 534, 7, 116, 2, 2, 534, 142, 3, 2, 2, 2, 535, 536, 7, 121, 2, 2, 536, 537, + 7, 106, 2, 2, 537, 538, 7, 107, 2, 2, 538, 539, 7, 110, 2, 2, 539, 540, + 7, 103, 2, 2, 540, 144, 3, 2, 2, 2, 541, 542, 7, 100, 2, 2, 542, 543, 7, + 116, 2, 2, 543, 544, 7, 103, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 7, + 109, 2, 2, 546, 146, 3, 2, 2, 2, 547, 548, 7, 101, 2, 2, 548, 549, 7, 113, + 2, 2, 549, 550, 7, 112, 2, 2, 550, 551, 7, 118, 2, 2, 551, 552, 7, 107, + 2, 2, 552, 553, 7, 112, 2, 2, 553, 554, 7, 119, 2, 2, 554, 555, 7, 103, + 2, 2, 555, 148, 3, 2, 2, 2, 556, 557, 7, 103, 2, 2, 557, 558, 7, 112, 2, + 2, 558, 559, 7, 102, 2, 2, 559, 150, 3, 2, 2, 2, 560, 561, 7, 109, 2, 2, + 561, 562, 7, 103, 2, 2, 562, 563, 7, 116, 2, 2, 563, 564, 7, 112, 2, 2, + 564, 565, 7, 103, 2, 2, 565, 566, 7, 110, 2, 2, 566, 152, 3, 2, 2, 2, 567, + 568, 7, 102, 2, 2, 568, 569, 7, 103, 2, 2, 569, 570, 7, 104, 2, 2, 570, + 154, 3, 2, 2, 2, 571, 572, 7, 37, 2, 2, 572, 573, 7, 114, 2, 2, 573, 574, + 7, 116, 2, 2, 574, 575, 7, 99, 2, 2, 575, 576, 7, 105, 2, 2, 576, 577, + 7, 111, 2, 2, 577, 578, 7, 99, 2, 2, 578, 156, 3, 2, 2, 2, 579, 580, 7, + 102, 2, 2, 580, 581, 7, 118, 2, 2, 581, 158, 3, 2, 2, 2, 582, 583, 7, 112, + 2, 2, 583, 584, 7, 117, 2, 2, 584, 160, 3, 2, 2, 2, 585, 586, 7, 119, 2, + 2, 586, 587, 7, 117, 2, 2, 587, 162, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, + 589, 590, 7, 117, 2, 2, 590, 164, 3, 2, 2, 2, 591, 592, 7, 117, 2, 2, 592, + 166, 3, 2, 2, 2, 593, 594, 7, 110, 2, 2, 594, 595, 7, 103, 2, 2, 595, 596, + 7, 112, 2, 2, 596, 597, 7, 105, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, + 7, 106, 2, 2, 599, 168, 3, 2, 2, 2, 600, 601, 7, 117, 2, 2, 601, 602, 7, + 118, 2, 2, 602, 603, 7, 116, 2, 2, 603, 604, 7, 103, 2, 2, 604, 605, 7, + 118, 2, 2, 605, 606, 7, 101, 2, 2, 606, 607, 7, 106, 2, 2, 607, 170, 3, + 2, 2, 2, 608, 609, 7, 100, 2, 2, 609, 610, 7, 113, 2, 2, 610, 611, 7, 122, + 2, 2, 611, 612, 7, 99, 2, 2, 612, 613, 7, 117, 2, 2, 613, 172, 3, 2, 2, + 2, 614, 615, 7, 100, 2, 2, 615, 616, 7, 113, 2, 2, 616, 617, 7, 122, 2, + 2, 617, 618, 7, 118, 2, 2, 618, 619, 7, 113, 2, 2, 619, 174, 3, 2, 2, 2, + 620, 621, 7, 117, 2, 2, 621, 622, 7, 118, 2, 2, 622, 623, 7, 116, 2, 2, + 623, 624, 7, 103, 2, 2, 624, 625, 7, 118, 2, 2, 625, 626, 7, 101, 2, 2, + 626, 627, 7, 106, 2, 2, 627, 628, 7, 107, 2, 2, 628, 629, 7, 112, 2, 2, + 629, 630, 7, 104, 2, 2, 630, 176, 3, 2, 2, 2, 631, 632, 7, 102, 2, 2, 632, + 633, 7, 103, 2, 2, 633, 634, 7, 110, 2, 2, 634, 635, 7, 99, 2, 2, 635, + 636, 7, 123, 2, 2, 636, 178, 3, 2, 2, 2, 637, 638, 7, 116, 2, 2, 638, 639, + 7, 113, 2, 2, 639, 640, 7, 118, 2, 2, 640, 641, 7, 99, 2, 2, 641, 642, + 7, 116, 2, 2, 642, 643, 7, 123, 2, 2, 643, 180, 3, 2, 2, 2, 644, 645, 7, + 102, 2, 2, 645, 646, 7, 103, 2, 2, 646, 647, 7, 104, 2, 2, 647, 648, 7, + 101, 2, 2, 648, 649, 7, 99, 2, 2, 649, 650, 7, 110, 2, 2, 650, 651, 7, + 105, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 99, 2, 2, 653, 654, 7, + 111, 2, 2, 654, 655, 7, 111, 2, 2, 655, 656, 7, 99, 2, 2, 656, 657, 7, + 116, 2, 2, 657, 182, 3, 2, 2, 2, 658, 659, 7, 102, 2, 2, 659, 660, 7, 103, + 2, 2, 660, 661, 7, 104, 2, 2, 661, 662, 7, 101, 2, 2, 662, 663, 7, 99, + 2, 2, 663, 664, 7, 110, 2, 2, 664, 184, 3, 2, 2, 2, 665, 666, 7, 113, 2, + 2, 666, 667, 7, 114, 2, 2, 667, 668, 7, 103, 2, 2, 668, 669, 7, 112, 2, + 2, 669, 670, 7, 114, 2, 2, 670, 671, 7, 119, 2, 2, 671, 672, 7, 110, 2, + 2, 672, 673, 7, 117, 2, 2, 673, 674, 7, 103, 2, 2, 674, 186, 3, 2, 2, 2, + 675, 676, 7, 93, 2, 2, 676, 188, 3, 2, 2, 2, 677, 678, 7, 95, 2, 2, 678, + 190, 3, 2, 2, 2, 679, 680, 7, 125, 2, 2, 680, 192, 3, 2, 2, 2, 681, 682, + 7, 127, 2, 2, 682, 194, 3, 2, 2, 2, 683, 684, 7, 42, 2, 2, 684, 196, 3, + 2, 2, 2, 685, 686, 7, 43, 2, 2, 686, 198, 3, 2, 2, 2, 687, 688, 7, 60, + 2, 2, 688, 200, 3, 2, 2, 2, 689, 690, 7, 61, 2, 2, 690, 202, 3, 2, 2, 2, + 691, 692, 7, 48, 2, 2, 692, 204, 3, 2, 2, 2, 693, 694, 7, 46, 2, 2, 694, + 206, 3, 2, 2, 2, 695, 696, 7, 63, 2, 2, 696, 208, 3, 2, 2, 2, 697, 698, + 7, 47, 2, 2, 698, 699, 7, 64, 2, 2, 699, 210, 3, 2, 2, 2, 700, 701, 7, + 114, 2, 2, 701, 714, 7, 107, 2, 2, 702, 714, 7, 962, 2, 2, 703, 704, 7, + 118, 2, 2, 704, 705, 7, 99, 2, 2, 705, 714, 7, 119, 2, 2, 706, 714, 9, + 11, 2, 2, 707, 708, 7, 103, 2, 2, 708, 709, 7, 119, 2, 2, 709, 710, 7, + 110, 2, 2, 710, 711, 7, 103, 2, 2, 711, 714, 7, 116, 2, 2, 712, 714, 7, + 103, 2, 2, 713, 700, 3, 2, 2, 2, 713, 702, 3, 2, 2, 2, 713, 703, 3, 2, + 2, 2, 713, 706, 3, 2, 2, 2, 713, 707, 3, 2, 2, 2, 713, 712, 3, 2, 2, 2, + 714, 212, 3, 2, 2, 2, 715, 717, 9, 2, 2, 2, 716, 715, 3, 2, 2, 2, 717, + 718, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, + 3, 2, 2, 2, 720, 721, 8, 107, 2, 2, 721, 214, 3, 2, 2, 2, 722, 724, 9, + 3, 2, 2, 723, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 723, 3, 2, 2, + 2, 725, 726, 3, 2, 2, 2, 726, 727, 3, 2, 2, 2, 727, 728, 8, 108, 2, 2, + 728, 216, 3, 2, 2, 2, 729, 730, 9, 4, 2, 2, 730, 218, 3, 2, 2, 2, 731, + 733, 5, 217, 109, 2, 732, 731, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 732, + 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 220, 3, 2, 2, 2, 736, 737, 9, 5, + 2, 2, 737, 222, 3, 2, 2, 2, 738, 739, 9, 6, 2, 2, 739, 224, 3, 2, 2, 2, + 740, 741, 9, 7, 2, 2, 741, 226, 3, 2, 2, 2, 742, 743, 9, 8, 2, 2, 743, + 228, 3, 2, 2, 2, 744, 746, 5, 219, 110, 2, 745, 744, 3, 2, 2, 2, 746, 749, + 3, 2, 2, 2, 747, 745, 3, 2, 2, 2, 747, 748, 3, 2, 2, 2, 748, 750, 3, 2, + 2, 2, 749, 747, 3, 2, 2, 2, 750, 752, 5, 203, 102, 2, 751, 753, 5, 219, + 110, 2, 752, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 752, 3, 2, 2, + 2, 754, 755, 3, 2, 2, 2, 755, 230, 3, 2, 2, 2, 756, 763, 5, 229, 115, 2, + 757, 759, 5, 225, 113, 2, 758, 760, 5, 227, 114, 2, 759, 758, 3, 2, 2, + 2, 759, 760, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 762, 5, 229, 115, 2, + 762, 764, 3, 2, 2, 2, 763, 757, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, + 232, 3, 2, 2, 2, 765, 770, 5, 221, 111, 2, 766, 770, 5, 223, 112, 2, 767, + 770, 7, 97, 2, 2, 768, 770, 5, 219, 110, 2, 769, 765, 3, 2, 2, 2, 769, + 766, 3, 2, 2, 2, 769, 767, 3, 2, 2, 2, 769, 768, 3, 2, 2, 2, 770, 234, + 3, 2, 2, 2, 771, 775, 5, 221, 111, 2, 772, 774, 5, 233, 117, 2, 773, 772, + 3, 2, 2, 2, 774, 777, 3, 2, 2, 2, 775, 773, 3, 2, 2, 2, 775, 776, 3, 2, + 2, 2, 776, 236, 3, 2, 2, 2, 777, 775, 3, 2, 2, 2, 778, 779, 9, 9, 2, 2, + 779, 238, 3, 2, 2, 2, 780, 781, 5, 237, 119, 2, 781, 782, 5, 243, 122, + 2, 782, 783, 5, 237, 119, 2, 783, 240, 3, 2, 2, 2, 784, 786, 10, 10, 2, + 2, 785, 784, 3, 2, 2, 2, 786, 787, 3, 2, 2, 2, 787, 788, 3, 2, 2, 2, 787, + 785, 3, 2, 2, 2, 788, 242, 3, 2, 2, 2, 789, 793, 5, 241, 121, 2, 790, 793, + 5, 213, 107, 2, 791, 793, 5, 215, 108, 2, 792, 789, 3, 2, 2, 2, 792, 790, + 3, 2, 2, 2, 792, 791, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 792, 3, 2, + 2, 2, 794, 795, 3, 2, 2, 2, 795, 244, 3, 2, 2, 2, 796, 798, 5, 191, 96, + 2, 797, 799, 5, 243, 122, 2, 798, 797, 3, 2, 2, 2, 798, 799, 3, 2, 2, 2, + 799, 800, 3, 2, 2, 2, 800, 801, 5, 193, 97, 2, 801, 246, 3, 2, 2, 2, 802, + 803, 7, 49, 2, 2, 803, 804, 7, 49, 2, 2, 804, 805, 3, 2, 2, 2, 805, 806, + 5, 243, 122, 2, 806, 248, 3, 2, 2, 2, 807, 808, 7, 49, 2, 2, 808, 809, + 7, 44, 2, 2, 809, 810, 3, 2, 2, 2, 810, 811, 5, 243, 122, 2, 811, 812, + 7, 44, 2, 2, 812, 813, 7, 49, 2, 2, 813, 250, 3, 2, 2, 2, 17, 2, 713, 718, + 725, 734, 747, 754, 759, 763, 769, 775, 787, 792, 794, 798, 3, 8, 2, 2, +} + +var lexerChannelNames = []string{ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", +} + +var lexerModeNames = []string{ + "DEFAULT_MODE", +} + +var lexerLiteralNames = []string{ + "", "'OPENQASM'", "'include'", "'qubit'", "'qreg'", "'bit'", "'creg'", + "'int'", "'uint'", "'float'", "'angle'", "'fixed'", "'bool'", "'const'", + "'let'", "'||'", "'gate'", "'measure'", "'barrier'", "'inv'", "'pow'", + "'ctrl'", "'@'", "'CX'", "'U'", "'reset'", "'~'", "'!'", "'+'", "'-'", + "'*'", "'/'", "'<<'", "'>>'", "'rotl'", "'rotr'", "'&&'", "'&'", "'|'", + "'^'", "'>'", "'<'", "'>='", "'<='", "'=='", "'!='", "'return'", "'sin'", + "'cos'", "'tan'", "'exp'", "'ln'", "'sqrt'", "'popcount'", "'lengthof'", + "'++'", "'--'", "'+='", "'-='", "'*='", "'/='", "'&='", "'|='", "'~='", + "'^='", "'<<='", "'>>='", "'in'", "'if'", "'else'", "'for'", "'while'", + "'break'", "'continue'", "'end'", "'kernel'", "'def'", "'#pragma'", "'dt'", + "'ns'", "'us'", "'ms'", "'s'", "'length'", "'stretch'", "'boxas'", "'boxto'", + "'stretchinf'", "'delay'", "'rotary'", "'defcalgrammar'", "'defcal'", "'openpulse'", + "'['", "']'", "'{'", "'}'", "'('", "')'", "':'", "';'", "'.'", "','", "'='", + "'->'", +} + +var lexerSymbolicNames = []string{ + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "LBRACKET", "RBRACKET", "LBRACE", "RBRACE", "LPAREN", "RPAREN", + "COLON", "SEMICOLON", "DOT", "COMMA", "ASSIGN", "ARROW", "Constant", "Whitespace", + "Newline", "Integer", "Float", "RealNumber", "Identifier", "StringLiteral", + "LineComment", "BlockComment", +} + +var lexerRuleNames = []string{ + "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", + "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16", + "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", + "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", + "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", + "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", + "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56", + "T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64", + "T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72", + "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80", + "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88", + "T__89", "T__90", "T__91", "LBRACKET", "RBRACKET", "LBRACE", "RBRACE", + "LPAREN", "RPAREN", "COLON", "SEMICOLON", "DOT", "COMMA", "ASSIGN", "ARROW", + "Constant", "Whitespace", "Newline", "Digit", "Integer", "LowerCaseCharacter", + "UpperCaseCharacter", "SciNotation", "PlusMinus", "Float", "RealNumber", + "NumericalCharacter", "Identifier", "Quotation", "StringLiteral", "AnyString", + "Any", "AnyBlock", "LineComment", "BlockComment", +} + +type qasm3Lexer struct { + *antlr.BaseLexer + channelNames []string + modeNames []string + // TODO: EOF string +} + +// Newqasm3Lexer produces a new lexer instance for the optional input antlr.CharStream. +// +// The *qasm3Lexer instance produced may be reused by calling the SetInputStream method. +// The initial lexer configuration is expensive to construct, and the object is not thread-safe; +// however, if used within a Golang sync.Pool, the construction cost amortizes well and the +// objects can be used in a thread-safe manner. +func Newqasm3Lexer(input antlr.CharStream) *qasm3Lexer { + l := new(qasm3Lexer) + lexerDeserializer := antlr.NewATNDeserializer(nil) + lexerAtn := lexerDeserializer.DeserializeFromUInt16(serializedLexerAtn) + lexerDecisionToDFA := make([]*antlr.DFA, len(lexerAtn.DecisionToState)) + for index, ds := range lexerAtn.DecisionToState { + lexerDecisionToDFA[index] = antlr.NewDFA(ds, index) + } + l.BaseLexer = antlr.NewBaseLexer(input) + l.Interpreter = antlr.NewLexerATNSimulator(l, lexerAtn, lexerDecisionToDFA, antlr.NewPredictionContextCache()) + + l.channelNames = lexerChannelNames + l.modeNames = lexerModeNames + l.RuleNames = lexerRuleNames + l.LiteralNames = lexerLiteralNames + l.SymbolicNames = lexerSymbolicNames + l.GrammarFileName = "qasm3.g4" + // TODO: l.EOF = antlr.TokenEOF + + return l +} + +// qasm3Lexer tokens. +const ( + qasm3LexerT__0 = 1 + qasm3LexerT__1 = 2 + qasm3LexerT__2 = 3 + qasm3LexerT__3 = 4 + qasm3LexerT__4 = 5 + qasm3LexerT__5 = 6 + qasm3LexerT__6 = 7 + qasm3LexerT__7 = 8 + qasm3LexerT__8 = 9 + qasm3LexerT__9 = 10 + qasm3LexerT__10 = 11 + qasm3LexerT__11 = 12 + qasm3LexerT__12 = 13 + qasm3LexerT__13 = 14 + qasm3LexerT__14 = 15 + qasm3LexerT__15 = 16 + qasm3LexerT__16 = 17 + qasm3LexerT__17 = 18 + qasm3LexerT__18 = 19 + qasm3LexerT__19 = 20 + qasm3LexerT__20 = 21 + qasm3LexerT__21 = 22 + qasm3LexerT__22 = 23 + qasm3LexerT__23 = 24 + qasm3LexerT__24 = 25 + qasm3LexerT__25 = 26 + qasm3LexerT__26 = 27 + qasm3LexerT__27 = 28 + qasm3LexerT__28 = 29 + qasm3LexerT__29 = 30 + qasm3LexerT__30 = 31 + qasm3LexerT__31 = 32 + qasm3LexerT__32 = 33 + qasm3LexerT__33 = 34 + qasm3LexerT__34 = 35 + qasm3LexerT__35 = 36 + qasm3LexerT__36 = 37 + qasm3LexerT__37 = 38 + qasm3LexerT__38 = 39 + qasm3LexerT__39 = 40 + qasm3LexerT__40 = 41 + qasm3LexerT__41 = 42 + qasm3LexerT__42 = 43 + qasm3LexerT__43 = 44 + qasm3LexerT__44 = 45 + qasm3LexerT__45 = 46 + qasm3LexerT__46 = 47 + qasm3LexerT__47 = 48 + qasm3LexerT__48 = 49 + qasm3LexerT__49 = 50 + qasm3LexerT__50 = 51 + qasm3LexerT__51 = 52 + qasm3LexerT__52 = 53 + qasm3LexerT__53 = 54 + qasm3LexerT__54 = 55 + qasm3LexerT__55 = 56 + qasm3LexerT__56 = 57 + qasm3LexerT__57 = 58 + qasm3LexerT__58 = 59 + qasm3LexerT__59 = 60 + qasm3LexerT__60 = 61 + qasm3LexerT__61 = 62 + qasm3LexerT__62 = 63 + qasm3LexerT__63 = 64 + qasm3LexerT__64 = 65 + qasm3LexerT__65 = 66 + qasm3LexerT__66 = 67 + qasm3LexerT__67 = 68 + qasm3LexerT__68 = 69 + qasm3LexerT__69 = 70 + qasm3LexerT__70 = 71 + qasm3LexerT__71 = 72 + qasm3LexerT__72 = 73 + qasm3LexerT__73 = 74 + qasm3LexerT__74 = 75 + qasm3LexerT__75 = 76 + qasm3LexerT__76 = 77 + qasm3LexerT__77 = 78 + qasm3LexerT__78 = 79 + qasm3LexerT__79 = 80 + qasm3LexerT__80 = 81 + qasm3LexerT__81 = 82 + qasm3LexerT__82 = 83 + qasm3LexerT__83 = 84 + qasm3LexerT__84 = 85 + qasm3LexerT__85 = 86 + qasm3LexerT__86 = 87 + qasm3LexerT__87 = 88 + qasm3LexerT__88 = 89 + qasm3LexerT__89 = 90 + qasm3LexerT__90 = 91 + qasm3LexerT__91 = 92 + qasm3LexerLBRACKET = 93 + qasm3LexerRBRACKET = 94 + qasm3LexerLBRACE = 95 + qasm3LexerRBRACE = 96 + qasm3LexerLPAREN = 97 + qasm3LexerRPAREN = 98 + qasm3LexerCOLON = 99 + qasm3LexerSEMICOLON = 100 + qasm3LexerDOT = 101 + qasm3LexerCOMMA = 102 + qasm3LexerASSIGN = 103 + qasm3LexerARROW = 104 + qasm3LexerConstant = 105 + qasm3LexerWhitespace = 106 + qasm3LexerNewline = 107 + qasm3LexerInteger = 108 + qasm3LexerFloat = 109 + qasm3LexerRealNumber = 110 + qasm3LexerIdentifier = 111 + qasm3LexerStringLiteral = 112 + qasm3LexerLineComment = 113 + qasm3LexerBlockComment = 114 +) diff --git a/internal/qasm3/qasm3_listener.go b/internal/qasm3/qasm3_listener.go new file mode 100644 index 0000000..528aab6 --- /dev/null +++ b/internal/qasm3/qasm3_listener.go @@ -0,0 +1,520 @@ +// Code generated from ./qasm3.g4 by ANTLR 4.9. DO NOT EDIT. + +package parser // qasm3 + +import "github.com/antlr/antlr4/runtime/Go/antlr" + +// qasm3Listener is a complete listener for a parse tree produced by qasm3Parser. +type qasm3Listener interface { + antlr.ParseTreeListener + + // EnterProgram is called when entering the program production. + EnterProgram(c *ProgramContext) + + // EnterHeader is called when entering the header production. + EnterHeader(c *HeaderContext) + + // EnterVersion is called when entering the version production. + EnterVersion(c *VersionContext) + + // EnterInclude is called when entering the include production. + EnterInclude(c *IncludeContext) + + // EnterStatement is called when entering the statement production. + EnterStatement(c *StatementContext) + + // EnterGlobalStatement is called when entering the globalStatement production. + EnterGlobalStatement(c *GlobalStatementContext) + + // EnterDeclarationStatement is called when entering the declarationStatement production. + EnterDeclarationStatement(c *DeclarationStatementContext) + + // EnterComment is called when entering the comment production. + EnterComment(c *CommentContext) + + // EnterReturnSignature is called when entering the returnSignature production. + EnterReturnSignature(c *ReturnSignatureContext) + + // EnterProgramBlock is called when entering the programBlock production. + EnterProgramBlock(c *ProgramBlockContext) + + // EnterDesignator is called when entering the designator production. + EnterDesignator(c *DesignatorContext) + + // EnterDoubleDesignator is called when entering the doubleDesignator production. + EnterDoubleDesignator(c *DoubleDesignatorContext) + + // EnterIdentifierList is called when entering the identifierList production. + EnterIdentifierList(c *IdentifierListContext) + + // EnterIndexIdentifier is called when entering the indexIdentifier production. + EnterIndexIdentifier(c *IndexIdentifierContext) + + // EnterIndexIdentifierList is called when entering the indexIdentifierList production. + EnterIndexIdentifierList(c *IndexIdentifierListContext) + + // EnterAssociation is called when entering the association production. + EnterAssociation(c *AssociationContext) + + // EnterQuantumType is called when entering the quantumType production. + EnterQuantumType(c *QuantumTypeContext) + + // EnterQuantumDeclaration is called when entering the quantumDeclaration production. + EnterQuantumDeclaration(c *QuantumDeclarationContext) + + // EnterQuantumArgument is called when entering the quantumArgument production. + EnterQuantumArgument(c *QuantumArgumentContext) + + // EnterQuantumArgumentList is called when entering the quantumArgumentList production. + EnterQuantumArgumentList(c *QuantumArgumentListContext) + + // EnterBitType is called when entering the bitType production. + EnterBitType(c *BitTypeContext) + + // EnterSingleDesignatorType is called when entering the singleDesignatorType production. + EnterSingleDesignatorType(c *SingleDesignatorTypeContext) + + // EnterDoubleDesignatorType is called when entering the doubleDesignatorType production. + EnterDoubleDesignatorType(c *DoubleDesignatorTypeContext) + + // EnterNoDesignatorType is called when entering the noDesignatorType production. + EnterNoDesignatorType(c *NoDesignatorTypeContext) + + // EnterClassicalType is called when entering the classicalType production. + EnterClassicalType(c *ClassicalTypeContext) + + // EnterConstantDeclaration is called when entering the constantDeclaration production. + EnterConstantDeclaration(c *ConstantDeclarationContext) + + // EnterSingleDesignatorDeclaration is called when entering the singleDesignatorDeclaration production. + EnterSingleDesignatorDeclaration(c *SingleDesignatorDeclarationContext) + + // EnterDoubleDesignatorDeclaration is called when entering the doubleDesignatorDeclaration production. + EnterDoubleDesignatorDeclaration(c *DoubleDesignatorDeclarationContext) + + // EnterNoDesignatorDeclaration is called when entering the noDesignatorDeclaration production. + EnterNoDesignatorDeclaration(c *NoDesignatorDeclarationContext) + + // EnterBitDeclaration is called when entering the bitDeclaration production. + EnterBitDeclaration(c *BitDeclarationContext) + + // EnterClassicalVariableDeclaration is called when entering the classicalVariableDeclaration production. + EnterClassicalVariableDeclaration(c *ClassicalVariableDeclarationContext) + + // EnterClassicalDeclaration is called when entering the classicalDeclaration production. + EnterClassicalDeclaration(c *ClassicalDeclarationContext) + + // EnterClassicalTypeList is called when entering the classicalTypeList production. + EnterClassicalTypeList(c *ClassicalTypeListContext) + + // EnterClassicalArgument is called when entering the classicalArgument production. + EnterClassicalArgument(c *ClassicalArgumentContext) + + // EnterClassicalArgumentList is called when entering the classicalArgumentList production. + EnterClassicalArgumentList(c *ClassicalArgumentListContext) + + // EnterAliasStatement is called when entering the aliasStatement production. + EnterAliasStatement(c *AliasStatementContext) + + // EnterConcatenateExpression is called when entering the concatenateExpression production. + EnterConcatenateExpression(c *ConcatenateExpressionContext) + + // EnterRangeDefinition is called when entering the rangeDefinition production. + EnterRangeDefinition(c *RangeDefinitionContext) + + // EnterQuantumGateDefinition is called when entering the quantumGateDefinition production. + EnterQuantumGateDefinition(c *QuantumGateDefinitionContext) + + // EnterQuantumGateSignature is called when entering the quantumGateSignature production. + EnterQuantumGateSignature(c *QuantumGateSignatureContext) + + // EnterQuantumBlock is called when entering the quantumBlock production. + EnterQuantumBlock(c *QuantumBlockContext) + + // EnterQuantumStatement is called when entering the quantumStatement production. + EnterQuantumStatement(c *QuantumStatementContext) + + // EnterQuantumInstruction is called when entering the quantumInstruction production. + EnterQuantumInstruction(c *QuantumInstructionContext) + + // EnterQuantumMeasurement is called when entering the quantumMeasurement production. + EnterQuantumMeasurement(c *QuantumMeasurementContext) + + // EnterQuantumMeasurementDeclaration is called when entering the quantumMeasurementDeclaration production. + EnterQuantumMeasurementDeclaration(c *QuantumMeasurementDeclarationContext) + + // EnterQuantumBarrier is called when entering the quantumBarrier production. + EnterQuantumBarrier(c *QuantumBarrierContext) + + // EnterQuantumGateModifier is called when entering the quantumGateModifier production. + EnterQuantumGateModifier(c *QuantumGateModifierContext) + + // EnterQuantumGateCall is called when entering the quantumGateCall production. + EnterQuantumGateCall(c *QuantumGateCallContext) + + // EnterQuantumGateName is called when entering the quantumGateName production. + EnterQuantumGateName(c *QuantumGateNameContext) + + // EnterUnaryOperator is called when entering the unaryOperator production. + EnterUnaryOperator(c *UnaryOperatorContext) + + // EnterBinaryOperator is called when entering the binaryOperator production. + EnterBinaryOperator(c *BinaryOperatorContext) + + // EnterExpressionStatement is called when entering the expressionStatement production. + EnterExpressionStatement(c *ExpressionStatementContext) + + // EnterExpression is called when entering the expression production. + EnterExpression(c *ExpressionContext) + + // EnterExpressionTerminator is called when entering the expressionTerminator production. + EnterExpressionTerminator(c *ExpressionTerminatorContext) + + // EnterExpressionList is called when entering the expressionList production. + EnterExpressionList(c *ExpressionListContext) + + // EnterCall is called when entering the call production. + EnterCall(c *CallContext) + + // EnterBuiltInMath is called when entering the builtInMath production. + EnterBuiltInMath(c *BuiltInMathContext) + + // EnterCastOperator is called when entering the castOperator production. + EnterCastOperator(c *CastOperatorContext) + + // EnterIncrementor is called when entering the incrementor production. + EnterIncrementor(c *IncrementorContext) + + // EnterAssignmentExpression is called when entering the assignmentExpression production. + EnterAssignmentExpression(c *AssignmentExpressionContext) + + // EnterAssignmentOperator is called when entering the assignmentOperator production. + EnterAssignmentOperator(c *AssignmentOperatorContext) + + // EnterMembershipTest is called when entering the membershipTest production. + EnterMembershipTest(c *MembershipTestContext) + + // EnterSetDeclaration is called when entering the setDeclaration production. + EnterSetDeclaration(c *SetDeclarationContext) + + // EnterLoopBranchBlock is called when entering the loopBranchBlock production. + EnterLoopBranchBlock(c *LoopBranchBlockContext) + + // EnterBranchingStatement is called when entering the branchingStatement production. + EnterBranchingStatement(c *BranchingStatementContext) + + // EnterLoopStatement is called when entering the loopStatement production. + EnterLoopStatement(c *LoopStatementContext) + + // EnterControlDirectiveStatement is called when entering the controlDirectiveStatement production. + EnterControlDirectiveStatement(c *ControlDirectiveStatementContext) + + // EnterControlDirective is called when entering the controlDirective production. + EnterControlDirective(c *ControlDirectiveContext) + + // EnterKernelDeclaration is called when entering the kernelDeclaration production. + EnterKernelDeclaration(c *KernelDeclarationContext) + + // EnterSubroutineDefinition is called when entering the subroutineDefinition production. + EnterSubroutineDefinition(c *SubroutineDefinitionContext) + + // EnterSubroutineArgumentList is called when entering the subroutineArgumentList production. + EnterSubroutineArgumentList(c *SubroutineArgumentListContext) + + // EnterPragma is called when entering the pragma production. + EnterPragma(c *PragmaContext) + + // EnterTimeUnit is called when entering the timeUnit production. + EnterTimeUnit(c *TimeUnitContext) + + // EnterTimingType is called when entering the timingType production. + EnterTimingType(c *TimingTypeContext) + + // EnterTimingBox is called when entering the timingBox production. + EnterTimingBox(c *TimingBoxContext) + + // EnterTimeTerminator is called when entering the timeTerminator production. + EnterTimeTerminator(c *TimeTerminatorContext) + + // EnterTimeIdentifier is called when entering the timeIdentifier production. + EnterTimeIdentifier(c *TimeIdentifierContext) + + // EnterTimeInstructionName is called when entering the timeInstructionName production. + EnterTimeInstructionName(c *TimeInstructionNameContext) + + // EnterTimeInstruction is called when entering the timeInstruction production. + EnterTimeInstruction(c *TimeInstructionContext) + + // EnterTimeStatement is called when entering the timeStatement production. + EnterTimeStatement(c *TimeStatementContext) + + // EnterCalibration is called when entering the calibration production. + EnterCalibration(c *CalibrationContext) + + // EnterCalibrationGrammarDeclaration is called when entering the calibrationGrammarDeclaration production. + EnterCalibrationGrammarDeclaration(c *CalibrationGrammarDeclarationContext) + + // EnterCalibrationDefinition is called when entering the calibrationDefinition production. + EnterCalibrationDefinition(c *CalibrationDefinitionContext) + + // EnterCalibrationGrammar is called when entering the calibrationGrammar production. + EnterCalibrationGrammar(c *CalibrationGrammarContext) + + // EnterCalibrationArgumentList is called when entering the calibrationArgumentList production. + EnterCalibrationArgumentList(c *CalibrationArgumentListContext) + + // ExitProgram is called when exiting the program production. + ExitProgram(c *ProgramContext) + + // ExitHeader is called when exiting the header production. + ExitHeader(c *HeaderContext) + + // ExitVersion is called when exiting the version production. + ExitVersion(c *VersionContext) + + // ExitInclude is called when exiting the include production. + ExitInclude(c *IncludeContext) + + // ExitStatement is called when exiting the statement production. + ExitStatement(c *StatementContext) + + // ExitGlobalStatement is called when exiting the globalStatement production. + ExitGlobalStatement(c *GlobalStatementContext) + + // ExitDeclarationStatement is called when exiting the declarationStatement production. + ExitDeclarationStatement(c *DeclarationStatementContext) + + // ExitComment is called when exiting the comment production. + ExitComment(c *CommentContext) + + // ExitReturnSignature is called when exiting the returnSignature production. + ExitReturnSignature(c *ReturnSignatureContext) + + // ExitProgramBlock is called when exiting the programBlock production. + ExitProgramBlock(c *ProgramBlockContext) + + // ExitDesignator is called when exiting the designator production. + ExitDesignator(c *DesignatorContext) + + // ExitDoubleDesignator is called when exiting the doubleDesignator production. + ExitDoubleDesignator(c *DoubleDesignatorContext) + + // ExitIdentifierList is called when exiting the identifierList production. + ExitIdentifierList(c *IdentifierListContext) + + // ExitIndexIdentifier is called when exiting the indexIdentifier production. + ExitIndexIdentifier(c *IndexIdentifierContext) + + // ExitIndexIdentifierList is called when exiting the indexIdentifierList production. + ExitIndexIdentifierList(c *IndexIdentifierListContext) + + // ExitAssociation is called when exiting the association production. + ExitAssociation(c *AssociationContext) + + // ExitQuantumType is called when exiting the quantumType production. + ExitQuantumType(c *QuantumTypeContext) + + // ExitQuantumDeclaration is called when exiting the quantumDeclaration production. + ExitQuantumDeclaration(c *QuantumDeclarationContext) + + // ExitQuantumArgument is called when exiting the quantumArgument production. + ExitQuantumArgument(c *QuantumArgumentContext) + + // ExitQuantumArgumentList is called when exiting the quantumArgumentList production. + ExitQuantumArgumentList(c *QuantumArgumentListContext) + + // ExitBitType is called when exiting the bitType production. + ExitBitType(c *BitTypeContext) + + // ExitSingleDesignatorType is called when exiting the singleDesignatorType production. + ExitSingleDesignatorType(c *SingleDesignatorTypeContext) + + // ExitDoubleDesignatorType is called when exiting the doubleDesignatorType production. + ExitDoubleDesignatorType(c *DoubleDesignatorTypeContext) + + // ExitNoDesignatorType is called when exiting the noDesignatorType production. + ExitNoDesignatorType(c *NoDesignatorTypeContext) + + // ExitClassicalType is called when exiting the classicalType production. + ExitClassicalType(c *ClassicalTypeContext) + + // ExitConstantDeclaration is called when exiting the constantDeclaration production. + ExitConstantDeclaration(c *ConstantDeclarationContext) + + // ExitSingleDesignatorDeclaration is called when exiting the singleDesignatorDeclaration production. + ExitSingleDesignatorDeclaration(c *SingleDesignatorDeclarationContext) + + // ExitDoubleDesignatorDeclaration is called when exiting the doubleDesignatorDeclaration production. + ExitDoubleDesignatorDeclaration(c *DoubleDesignatorDeclarationContext) + + // ExitNoDesignatorDeclaration is called when exiting the noDesignatorDeclaration production. + ExitNoDesignatorDeclaration(c *NoDesignatorDeclarationContext) + + // ExitBitDeclaration is called when exiting the bitDeclaration production. + ExitBitDeclaration(c *BitDeclarationContext) + + // ExitClassicalVariableDeclaration is called when exiting the classicalVariableDeclaration production. + ExitClassicalVariableDeclaration(c *ClassicalVariableDeclarationContext) + + // ExitClassicalDeclaration is called when exiting the classicalDeclaration production. + ExitClassicalDeclaration(c *ClassicalDeclarationContext) + + // ExitClassicalTypeList is called when exiting the classicalTypeList production. + ExitClassicalTypeList(c *ClassicalTypeListContext) + + // ExitClassicalArgument is called when exiting the classicalArgument production. + ExitClassicalArgument(c *ClassicalArgumentContext) + + // ExitClassicalArgumentList is called when exiting the classicalArgumentList production. + ExitClassicalArgumentList(c *ClassicalArgumentListContext) + + // ExitAliasStatement is called when exiting the aliasStatement production. + ExitAliasStatement(c *AliasStatementContext) + + // ExitConcatenateExpression is called when exiting the concatenateExpression production. + ExitConcatenateExpression(c *ConcatenateExpressionContext) + + // ExitRangeDefinition is called when exiting the rangeDefinition production. + ExitRangeDefinition(c *RangeDefinitionContext) + + // ExitQuantumGateDefinition is called when exiting the quantumGateDefinition production. + ExitQuantumGateDefinition(c *QuantumGateDefinitionContext) + + // ExitQuantumGateSignature is called when exiting the quantumGateSignature production. + ExitQuantumGateSignature(c *QuantumGateSignatureContext) + + // ExitQuantumBlock is called when exiting the quantumBlock production. + ExitQuantumBlock(c *QuantumBlockContext) + + // ExitQuantumStatement is called when exiting the quantumStatement production. + ExitQuantumStatement(c *QuantumStatementContext) + + // ExitQuantumInstruction is called when exiting the quantumInstruction production. + ExitQuantumInstruction(c *QuantumInstructionContext) + + // ExitQuantumMeasurement is called when exiting the quantumMeasurement production. + ExitQuantumMeasurement(c *QuantumMeasurementContext) + + // ExitQuantumMeasurementDeclaration is called when exiting the quantumMeasurementDeclaration production. + ExitQuantumMeasurementDeclaration(c *QuantumMeasurementDeclarationContext) + + // ExitQuantumBarrier is called when exiting the quantumBarrier production. + ExitQuantumBarrier(c *QuantumBarrierContext) + + // ExitQuantumGateModifier is called when exiting the quantumGateModifier production. + ExitQuantumGateModifier(c *QuantumGateModifierContext) + + // ExitQuantumGateCall is called when exiting the quantumGateCall production. + ExitQuantumGateCall(c *QuantumGateCallContext) + + // ExitQuantumGateName is called when exiting the quantumGateName production. + ExitQuantumGateName(c *QuantumGateNameContext) + + // ExitUnaryOperator is called when exiting the unaryOperator production. + ExitUnaryOperator(c *UnaryOperatorContext) + + // ExitBinaryOperator is called when exiting the binaryOperator production. + ExitBinaryOperator(c *BinaryOperatorContext) + + // ExitExpressionStatement is called when exiting the expressionStatement production. + ExitExpressionStatement(c *ExpressionStatementContext) + + // ExitExpression is called when exiting the expression production. + ExitExpression(c *ExpressionContext) + + // ExitExpressionTerminator is called when exiting the expressionTerminator production. + ExitExpressionTerminator(c *ExpressionTerminatorContext) + + // ExitExpressionList is called when exiting the expressionList production. + ExitExpressionList(c *ExpressionListContext) + + // ExitCall is called when exiting the call production. + ExitCall(c *CallContext) + + // ExitBuiltInMath is called when exiting the builtInMath production. + ExitBuiltInMath(c *BuiltInMathContext) + + // ExitCastOperator is called when exiting the castOperator production. + ExitCastOperator(c *CastOperatorContext) + + // ExitIncrementor is called when exiting the incrementor production. + ExitIncrementor(c *IncrementorContext) + + // ExitAssignmentExpression is called when exiting the assignmentExpression production. + ExitAssignmentExpression(c *AssignmentExpressionContext) + + // ExitAssignmentOperator is called when exiting the assignmentOperator production. + ExitAssignmentOperator(c *AssignmentOperatorContext) + + // ExitMembershipTest is called when exiting the membershipTest production. + ExitMembershipTest(c *MembershipTestContext) + + // ExitSetDeclaration is called when exiting the setDeclaration production. + ExitSetDeclaration(c *SetDeclarationContext) + + // ExitLoopBranchBlock is called when exiting the loopBranchBlock production. + ExitLoopBranchBlock(c *LoopBranchBlockContext) + + // ExitBranchingStatement is called when exiting the branchingStatement production. + ExitBranchingStatement(c *BranchingStatementContext) + + // ExitLoopStatement is called when exiting the loopStatement production. + ExitLoopStatement(c *LoopStatementContext) + + // ExitControlDirectiveStatement is called when exiting the controlDirectiveStatement production. + ExitControlDirectiveStatement(c *ControlDirectiveStatementContext) + + // ExitControlDirective is called when exiting the controlDirective production. + ExitControlDirective(c *ControlDirectiveContext) + + // ExitKernelDeclaration is called when exiting the kernelDeclaration production. + ExitKernelDeclaration(c *KernelDeclarationContext) + + // ExitSubroutineDefinition is called when exiting the subroutineDefinition production. + ExitSubroutineDefinition(c *SubroutineDefinitionContext) + + // ExitSubroutineArgumentList is called when exiting the subroutineArgumentList production. + ExitSubroutineArgumentList(c *SubroutineArgumentListContext) + + // ExitPragma is called when exiting the pragma production. + ExitPragma(c *PragmaContext) + + // ExitTimeUnit is called when exiting the timeUnit production. + ExitTimeUnit(c *TimeUnitContext) + + // ExitTimingType is called when exiting the timingType production. + ExitTimingType(c *TimingTypeContext) + + // ExitTimingBox is called when exiting the timingBox production. + ExitTimingBox(c *TimingBoxContext) + + // ExitTimeTerminator is called when exiting the timeTerminator production. + ExitTimeTerminator(c *TimeTerminatorContext) + + // ExitTimeIdentifier is called when exiting the timeIdentifier production. + ExitTimeIdentifier(c *TimeIdentifierContext) + + // ExitTimeInstructionName is called when exiting the timeInstructionName production. + ExitTimeInstructionName(c *TimeInstructionNameContext) + + // ExitTimeInstruction is called when exiting the timeInstruction production. + ExitTimeInstruction(c *TimeInstructionContext) + + // ExitTimeStatement is called when exiting the timeStatement production. + ExitTimeStatement(c *TimeStatementContext) + + // ExitCalibration is called when exiting the calibration production. + ExitCalibration(c *CalibrationContext) + + // ExitCalibrationGrammarDeclaration is called when exiting the calibrationGrammarDeclaration production. + ExitCalibrationGrammarDeclaration(c *CalibrationGrammarDeclarationContext) + + // ExitCalibrationDefinition is called when exiting the calibrationDefinition production. + ExitCalibrationDefinition(c *CalibrationDefinitionContext) + + // ExitCalibrationGrammar is called when exiting the calibrationGrammar production. + ExitCalibrationGrammar(c *CalibrationGrammarContext) + + // ExitCalibrationArgumentList is called when exiting the calibrationArgumentList production. + ExitCalibrationArgumentList(c *CalibrationArgumentListContext) +} diff --git a/internal/qasm3/qasm3_parser.go b/internal/qasm3/qasm3_parser.go new file mode 100644 index 0000000..c977525 --- /dev/null +++ b/internal/qasm3/qasm3_parser.go @@ -0,0 +1,11874 @@ +// Code generated from ./qasm3.g4 by ANTLR 4.9. DO NOT EDIT. + +package parser // qasm3 + +import ( + "fmt" + "reflect" + "strconv" + + "github.com/antlr/antlr4/runtime/Go/antlr" +) + +// Suppress unused import errors +var _ = fmt.Printf +var _ = reflect.Copy +var _ = strconv.Itoa + +var parserATN = []uint16{ + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 116, 731, + 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, + 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, + 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, + 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, + 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, + 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, + 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, + 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, + 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, + 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, + 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, + 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, + 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, + 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, + 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, + 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, + 3, 2, 3, 2, 7, 2, 175, 10, 2, 12, 2, 14, 2, 178, 11, 2, 3, 3, 5, 3, 181, + 10, 3, 3, 3, 7, 3, 184, 10, 3, 12, 3, 14, 3, 187, 11, 3, 3, 4, 3, 4, 3, + 4, 3, 4, 5, 4, 193, 10, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, + 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 212, 10, + 6, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 218, 10, 7, 3, 8, 3, 8, 3, 8, 5, 8, 223, + 10, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, + 5, 11, 235, 10, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, + 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 7, 14, 251, 10, 14, 12, 14, + 14, 14, 254, 11, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 262, + 10, 15, 3, 16, 3, 16, 3, 16, 7, 16, 267, 10, 16, 12, 16, 14, 16, 270, 11, + 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, + 3, 20, 3, 20, 5, 20, 284, 10, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 7, + 21, 291, 10, 21, 12, 21, 14, 21, 294, 11, 21, 3, 21, 3, 21, 3, 22, 3, 22, + 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 306, 10, 25, 3, 26, 3, + 26, 5, 26, 310, 10, 26, 3, 26, 3, 26, 5, 26, 314, 10, 26, 3, 26, 3, 26, + 3, 26, 5, 26, 319, 10, 26, 5, 26, 321, 10, 26, 3, 27, 3, 27, 3, 27, 3, + 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, + 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 5, + 32, 347, 10, 32, 3, 33, 3, 33, 5, 33, 351, 10, 33, 3, 34, 3, 34, 3, 34, + 7, 34, 356, 10, 34, 12, 34, 14, 34, 359, 11, 34, 3, 34, 3, 34, 3, 35, 3, + 35, 3, 35, 3, 36, 3, 36, 3, 36, 7, 36, 369, 10, 36, 12, 36, 14, 36, 372, + 11, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, + 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 392, + 10, 38, 3, 39, 3, 39, 5, 39, 396, 10, 39, 3, 39, 3, 39, 5, 39, 400, 10, + 39, 3, 39, 3, 39, 5, 39, 404, 10, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, + 3, 40, 3, 41, 3, 41, 3, 41, 5, 41, 415, 10, 41, 3, 41, 5, 41, 418, 10, + 41, 3, 41, 3, 41, 3, 42, 3, 42, 7, 42, 424, 10, 42, 12, 42, 14, 42, 427, + 11, 42, 3, 42, 3, 42, 3, 43, 3, 43, 5, 43, 433, 10, 43, 3, 43, 3, 43, 3, + 44, 3, 44, 3, 44, 5, 44, 440, 10, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, + 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 5, 46, 453, 10, 46, 3, 47, 3, + 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 464, 10, 48, + 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 5, 49, 471, 10, 49, 3, 49, 5, 49, 474, + 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, + 5, 50, 485, 10, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, + 53, 3, 53, 5, 53, 496, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, + 3, 54, 3, 54, 5, 54, 506, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 512, + 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, + 3, 54, 3, 54, 7, 54, 525, 10, 54, 12, 54, 14, 54, 528, 11, 54, 3, 55, 3, + 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 536, 10, 55, 3, 56, 3, 56, 3, 56, + 7, 56, 541, 10, 56, 12, 56, 14, 56, 544, 11, 56, 3, 56, 3, 56, 3, 57, 3, + 57, 3, 57, 5, 57, 551, 10, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, + 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, + 64, 3, 64, 3, 64, 3, 64, 5, 64, 573, 10, 64, 3, 65, 3, 65, 5, 65, 577, + 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 5, 66, 586, 10, + 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 595, 10, 67, + 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, + 70, 5, 70, 608, 10, 70, 3, 70, 5, 70, 611, 10, 70, 3, 70, 5, 70, 614, 10, + 70, 3, 70, 5, 70, 617, 10, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, + 5, 71, 625, 10, 71, 3, 71, 5, 71, 628, 10, 71, 3, 71, 5, 71, 631, 10, 71, + 3, 71, 3, 71, 3, 72, 3, 72, 5, 72, 637, 10, 72, 3, 73, 3, 73, 3, 73, 3, + 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 5, 75, 649, 10, 75, 5, 75, + 651, 10, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 5, 76, 660, + 10, 76, 3, 77, 3, 77, 5, 77, 664, 10, 77, 3, 78, 3, 78, 5, 78, 668, 10, + 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 674, 10, 78, 3, 79, 3, 79, 3, 80, + 3, 80, 3, 80, 5, 80, 681, 10, 80, 3, 80, 5, 80, 684, 10, 80, 3, 80, 3, + 80, 3, 80, 5, 80, 689, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 695, + 10, 81, 3, 82, 3, 82, 5, 82, 699, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, + 84, 3, 84, 5, 84, 707, 10, 84, 3, 84, 3, 84, 3, 84, 5, 84, 712, 10, 84, + 3, 84, 5, 84, 715, 10, 84, 3, 84, 3, 84, 5, 84, 719, 10, 84, 3, 84, 3, + 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 5, 86, 729, 10, 86, 3, 86, + 2, 3, 106, 87, 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, 2, 15, 3, 2, 115, 116, 3, 2, 5, 6, 3, 2, 7, 8, 3, 2, + 9, 12, 3, 2, 28, 29, 4, 2, 17, 17, 30, 47, 3, 2, 49, 56, 3, 2, 57, 58, + 4, 2, 59, 68, 105, 106, 3, 2, 74, 76, 3, 2, 80, 84, 3, 2, 90, 91, 4, 2, + 94, 94, 113, 113, 2, 750, 2, 172, 3, 2, 2, 2, 4, 180, 3, 2, 2, 2, 6, 188, + 3, 2, 2, 2, 8, 196, 3, 2, 2, 2, 10, 211, 3, 2, 2, 2, 12, 217, 3, 2, 2, + 2, 14, 222, 3, 2, 2, 2, 16, 226, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 231, + 3, 2, 2, 2, 22, 238, 3, 2, 2, 2, 24, 242, 3, 2, 2, 2, 26, 252, 3, 2, 2, + 2, 28, 257, 3, 2, 2, 2, 30, 268, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 276, + 3, 2, 2, 2, 36, 278, 3, 2, 2, 2, 38, 281, 3, 2, 2, 2, 40, 292, 3, 2, 2, + 2, 42, 297, 3, 2, 2, 2, 44, 299, 3, 2, 2, 2, 46, 301, 3, 2, 2, 2, 48, 305, + 3, 2, 2, 2, 50, 320, 3, 2, 2, 2, 52, 322, 3, 2, 2, 2, 54, 327, 3, 2, 2, + 2, 56, 331, 3, 2, 2, 2, 58, 335, 3, 2, 2, 2, 60, 338, 3, 2, 2, 2, 62, 346, + 3, 2, 2, 2, 64, 348, 3, 2, 2, 2, 66, 357, 3, 2, 2, 2, 68, 362, 3, 2, 2, + 2, 70, 370, 3, 2, 2, 2, 72, 375, 3, 2, 2, 2, 74, 380, 3, 2, 2, 2, 76, 393, + 3, 2, 2, 2, 78, 407, 3, 2, 2, 2, 80, 411, 3, 2, 2, 2, 82, 421, 3, 2, 2, + 2, 84, 432, 3, 2, 2, 2, 86, 439, 3, 2, 2, 2, 88, 441, 3, 2, 2, 2, 90, 452, + 3, 2, 2, 2, 92, 454, 3, 2, 2, 2, 94, 463, 3, 2, 2, 2, 96, 467, 3, 2, 2, + 2, 98, 484, 3, 2, 2, 2, 100, 486, 3, 2, 2, 2, 102, 488, 3, 2, 2, 2, 104, + 495, 3, 2, 2, 2, 106, 511, 3, 2, 2, 2, 108, 535, 3, 2, 2, 2, 110, 542, + 3, 2, 2, 2, 112, 550, 3, 2, 2, 2, 114, 552, 3, 2, 2, 2, 116, 554, 3, 2, + 2, 2, 118, 556, 3, 2, 2, 2, 120, 558, 3, 2, 2, 2, 122, 561, 3, 2, 2, 2, + 124, 563, 3, 2, 2, 2, 126, 572, 3, 2, 2, 2, 128, 576, 3, 2, 2, 2, 130, + 578, 3, 2, 2, 2, 132, 594, 3, 2, 2, 2, 134, 598, 3, 2, 2, 2, 136, 601, + 3, 2, 2, 2, 138, 603, 3, 2, 2, 2, 140, 620, 3, 2, 2, 2, 142, 636, 3, 2, + 2, 2, 144, 638, 3, 2, 2, 2, 146, 643, 3, 2, 2, 2, 148, 650, 3, 2, 2, 2, + 150, 659, 3, 2, 2, 2, 152, 663, 3, 2, 2, 2, 154, 673, 3, 2, 2, 2, 156, + 675, 3, 2, 2, 2, 158, 677, 3, 2, 2, 2, 160, 694, 3, 2, 2, 2, 162, 698, + 3, 2, 2, 2, 164, 700, 3, 2, 2, 2, 166, 704, 3, 2, 2, 2, 168, 724, 3, 2, + 2, 2, 170, 728, 3, 2, 2, 2, 172, 176, 5, 4, 3, 2, 173, 175, 5, 10, 6, 2, + 174, 173, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, + 177, 3, 2, 2, 2, 177, 3, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, + 6, 4, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 185, 3, 2, 2, + 2, 182, 184, 5, 8, 5, 2, 183, 182, 3, 2, 2, 2, 184, 187, 3, 2, 2, 2, 185, + 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 5, 3, 2, 2, 2, 187, 185, 3, + 2, 2, 2, 188, 189, 7, 3, 2, 2, 189, 192, 7, 110, 2, 2, 190, 191, 7, 103, + 2, 2, 191, 193, 7, 110, 2, 2, 192, 190, 3, 2, 2, 2, 192, 193, 3, 2, 2, + 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 102, 2, 2, 195, 7, 3, 2, 2, 2, 196, + 197, 7, 4, 2, 2, 197, 198, 7, 114, 2, 2, 198, 199, 7, 102, 2, 2, 199, 9, + 3, 2, 2, 2, 200, 212, 5, 12, 7, 2, 201, 212, 5, 104, 53, 2, 202, 212, 5, + 14, 8, 2, 203, 212, 5, 130, 66, 2, 204, 212, 5, 132, 67, 2, 205, 212, 5, + 134, 68, 2, 206, 212, 5, 72, 37, 2, 207, 212, 5, 84, 43, 2, 208, 212, 5, + 160, 81, 2, 209, 212, 5, 144, 73, 2, 210, 212, 5, 16, 9, 2, 211, 200, 3, + 2, 2, 2, 211, 201, 3, 2, 2, 2, 211, 202, 3, 2, 2, 2, 211, 203, 3, 2, 2, + 2, 211, 204, 3, 2, 2, 2, 211, 205, 3, 2, 2, 2, 211, 206, 3, 2, 2, 2, 211, + 207, 3, 2, 2, 2, 211, 208, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 210, + 3, 2, 2, 2, 212, 11, 3, 2, 2, 2, 213, 218, 5, 140, 71, 2, 214, 218, 5, + 138, 70, 2, 215, 218, 5, 78, 40, 2, 216, 218, 5, 166, 84, 2, 217, 213, + 3, 2, 2, 2, 217, 214, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 217, 216, 3, 2, + 2, 2, 218, 13, 3, 2, 2, 2, 219, 223, 5, 36, 19, 2, 220, 223, 5, 64, 33, + 2, 221, 223, 5, 52, 27, 2, 222, 219, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, + 222, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 7, 102, 2, 2, 225, + 15, 3, 2, 2, 2, 226, 227, 9, 2, 2, 2, 227, 17, 3, 2, 2, 2, 228, 229, 7, + 106, 2, 2, 229, 230, 5, 64, 33, 2, 230, 19, 3, 2, 2, 2, 231, 234, 7, 97, + 2, 2, 232, 235, 5, 20, 11, 2, 233, 235, 5, 10, 6, 2, 234, 232, 3, 2, 2, + 2, 234, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 237, 7, 98, 2, 2, 237, + 21, 3, 2, 2, 2, 238, 239, 7, 95, 2, 2, 239, 240, 5, 106, 54, 2, 240, 241, + 7, 96, 2, 2, 241, 23, 3, 2, 2, 2, 242, 243, 7, 95, 2, 2, 243, 244, 5, 106, + 54, 2, 244, 245, 7, 104, 2, 2, 245, 246, 5, 106, 54, 2, 246, 247, 7, 96, + 2, 2, 247, 25, 3, 2, 2, 2, 248, 249, 7, 113, 2, 2, 249, 251, 7, 104, 2, + 2, 250, 248, 3, 2, 2, 2, 251, 254, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 252, + 253, 3, 2, 2, 2, 253, 255, 3, 2, 2, 2, 254, 252, 3, 2, 2, 2, 255, 256, + 7, 113, 2, 2, 256, 27, 3, 2, 2, 2, 257, 261, 7, 113, 2, 2, 258, 262, 5, + 22, 12, 2, 259, 262, 5, 24, 13, 2, 260, 262, 5, 76, 39, 2, 261, 258, 3, + 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 261, 262, 3, 2, 2, + 2, 262, 29, 3, 2, 2, 2, 263, 264, 5, 28, 15, 2, 264, 265, 7, 104, 2, 2, + 265, 267, 3, 2, 2, 2, 266, 263, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, + 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 268, + 3, 2, 2, 2, 271, 272, 5, 28, 15, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 101, + 2, 2, 274, 275, 7, 113, 2, 2, 275, 33, 3, 2, 2, 2, 276, 277, 9, 3, 2, 2, + 277, 35, 3, 2, 2, 2, 278, 279, 5, 34, 18, 2, 279, 280, 5, 30, 16, 2, 280, + 37, 3, 2, 2, 2, 281, 283, 5, 34, 18, 2, 282, 284, 5, 22, 12, 2, 283, 282, + 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 286, 5, 32, + 17, 2, 286, 39, 3, 2, 2, 2, 287, 288, 5, 38, 20, 2, 288, 289, 7, 104, 2, + 2, 289, 291, 3, 2, 2, 2, 290, 287, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, + 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 292, + 3, 2, 2, 2, 295, 296, 5, 38, 20, 2, 296, 41, 3, 2, 2, 2, 297, 298, 9, 4, + 2, 2, 298, 43, 3, 2, 2, 2, 299, 300, 9, 5, 2, 2, 300, 45, 3, 2, 2, 2, 301, + 302, 7, 13, 2, 2, 302, 47, 3, 2, 2, 2, 303, 306, 7, 14, 2, 2, 304, 306, + 5, 148, 75, 2, 305, 303, 3, 2, 2, 2, 305, 304, 3, 2, 2, 2, 306, 49, 3, + 2, 2, 2, 307, 309, 5, 44, 23, 2, 308, 310, 5, 22, 12, 2, 309, 308, 3, 2, + 2, 2, 309, 310, 3, 2, 2, 2, 310, 321, 3, 2, 2, 2, 311, 313, 5, 46, 24, + 2, 312, 314, 5, 24, 13, 2, 313, 312, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, + 314, 321, 3, 2, 2, 2, 315, 321, 5, 48, 25, 2, 316, 318, 5, 42, 22, 2, 317, + 319, 5, 22, 12, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 321, + 3, 2, 2, 2, 320, 307, 3, 2, 2, 2, 320, 311, 3, 2, 2, 2, 320, 315, 3, 2, + 2, 2, 320, 316, 3, 2, 2, 2, 321, 51, 3, 2, 2, 2, 322, 323, 7, 15, 2, 2, + 323, 324, 7, 113, 2, 2, 324, 325, 7, 105, 2, 2, 325, 326, 5, 106, 54, 2, + 326, 53, 3, 2, 2, 2, 327, 328, 5, 44, 23, 2, 328, 329, 5, 22, 12, 2, 329, + 330, 7, 113, 2, 2, 330, 55, 3, 2, 2, 2, 331, 332, 5, 46, 24, 2, 332, 333, + 5, 24, 13, 2, 333, 334, 7, 113, 2, 2, 334, 57, 3, 2, 2, 2, 335, 336, 5, + 48, 25, 2, 336, 337, 7, 113, 2, 2, 337, 59, 3, 2, 2, 2, 338, 339, 5, 42, + 22, 2, 339, 340, 7, 113, 2, 2, 340, 341, 5, 22, 12, 2, 341, 61, 3, 2, 2, + 2, 342, 347, 5, 54, 28, 2, 343, 347, 5, 56, 29, 2, 344, 347, 5, 58, 30, + 2, 345, 347, 5, 60, 31, 2, 346, 342, 3, 2, 2, 2, 346, 343, 3, 2, 2, 2, + 346, 344, 3, 2, 2, 2, 346, 345, 3, 2, 2, 2, 347, 63, 3, 2, 2, 2, 348, 350, + 5, 62, 32, 2, 349, 351, 5, 120, 61, 2, 350, 349, 3, 2, 2, 2, 350, 351, + 3, 2, 2, 2, 351, 65, 3, 2, 2, 2, 352, 353, 5, 50, 26, 2, 353, 354, 7, 104, + 2, 2, 354, 356, 3, 2, 2, 2, 355, 352, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, + 357, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 360, 3, 2, 2, 2, 359, + 357, 3, 2, 2, 2, 360, 361, 5, 50, 26, 2, 361, 67, 3, 2, 2, 2, 362, 363, + 5, 50, 26, 2, 363, 364, 5, 32, 17, 2, 364, 69, 3, 2, 2, 2, 365, 366, 5, + 68, 35, 2, 366, 367, 7, 104, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, + 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, + 371, 373, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 68, 35, 2, 374, + 71, 3, 2, 2, 2, 375, 376, 7, 16, 2, 2, 376, 377, 7, 113, 2, 2, 377, 378, + 7, 105, 2, 2, 378, 379, 5, 74, 38, 2, 379, 73, 3, 2, 2, 2, 380, 391, 7, + 105, 2, 2, 381, 382, 7, 113, 2, 2, 382, 392, 5, 76, 39, 2, 383, 384, 7, + 113, 2, 2, 384, 385, 7, 17, 2, 2, 385, 392, 7, 113, 2, 2, 386, 387, 7, + 113, 2, 2, 387, 388, 7, 95, 2, 2, 388, 389, 5, 110, 56, 2, 389, 390, 7, + 96, 2, 2, 390, 392, 3, 2, 2, 2, 391, 381, 3, 2, 2, 2, 391, 383, 3, 2, 2, + 2, 391, 386, 3, 2, 2, 2, 392, 75, 3, 2, 2, 2, 393, 395, 7, 95, 2, 2, 394, + 396, 5, 106, 54, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, + 3, 2, 2, 2, 397, 399, 7, 101, 2, 2, 398, 400, 5, 106, 54, 2, 399, 398, + 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 403, 3, 2, 2, 2, 401, 402, 7, 101, + 2, 2, 402, 404, 5, 106, 54, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, + 2, 404, 405, 3, 2, 2, 2, 405, 406, 7, 96, 2, 2, 406, 77, 3, 2, 2, 2, 407, + 408, 7, 18, 2, 2, 408, 409, 5, 80, 41, 2, 409, 410, 5, 82, 42, 2, 410, + 79, 3, 2, 2, 2, 411, 417, 7, 113, 2, 2, 412, 414, 7, 99, 2, 2, 413, 415, + 5, 70, 36, 2, 414, 413, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 416, 3, + 2, 2, 2, 416, 418, 7, 100, 2, 2, 417, 412, 3, 2, 2, 2, 417, 418, 3, 2, + 2, 2, 418, 419, 3, 2, 2, 2, 419, 420, 5, 26, 14, 2, 420, 81, 3, 2, 2, 2, + 421, 425, 7, 97, 2, 2, 422, 424, 5, 84, 43, 2, 423, 422, 3, 2, 2, 2, 424, + 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, + 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 7, 98, 2, 2, 429, 83, 3, 2, + 2, 2, 430, 433, 5, 86, 44, 2, 431, 433, 5, 90, 46, 2, 432, 430, 3, 2, 2, + 2, 432, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 435, 7, 102, 2, 2, + 435, 85, 3, 2, 2, 2, 436, 440, 5, 96, 49, 2, 437, 440, 5, 88, 45, 2, 438, + 440, 5, 92, 47, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, + 3, 2, 2, 2, 440, 87, 3, 2, 2, 2, 441, 442, 7, 19, 2, 2, 442, 443, 5, 30, + 16, 2, 443, 89, 3, 2, 2, 2, 444, 445, 5, 88, 45, 2, 445, 446, 7, 106, 2, + 2, 446, 447, 5, 30, 16, 2, 447, 453, 3, 2, 2, 2, 448, 449, 5, 30, 16, 2, + 449, 450, 7, 105, 2, 2, 450, 451, 5, 88, 45, 2, 451, 453, 3, 2, 2, 2, 452, + 444, 3, 2, 2, 2, 452, 448, 3, 2, 2, 2, 453, 91, 3, 2, 2, 2, 454, 455, 7, + 20, 2, 2, 455, 456, 5, 30, 16, 2, 456, 93, 3, 2, 2, 2, 457, 464, 7, 21, + 2, 2, 458, 459, 7, 22, 2, 2, 459, 460, 7, 99, 2, 2, 460, 461, 7, 110, 2, + 2, 461, 464, 7, 100, 2, 2, 462, 464, 7, 23, 2, 2, 463, 457, 3, 2, 2, 2, + 463, 458, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, + 466, 7, 24, 2, 2, 466, 95, 3, 2, 2, 2, 467, 473, 5, 98, 50, 2, 468, 470, + 7, 99, 2, 2, 469, 471, 5, 110, 56, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, + 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 7, 100, 2, 2, 473, 468, 3, 2, + 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 5, 30, 16, + 2, 476, 97, 3, 2, 2, 2, 477, 485, 7, 25, 2, 2, 478, 485, 7, 26, 2, 2, 479, + 485, 7, 27, 2, 2, 480, 485, 7, 113, 2, 2, 481, 482, 5, 94, 48, 2, 482, + 483, 5, 98, 50, 2, 483, 485, 3, 2, 2, 2, 484, 477, 3, 2, 2, 2, 484, 478, + 3, 2, 2, 2, 484, 479, 3, 2, 2, 2, 484, 480, 3, 2, 2, 2, 484, 481, 3, 2, + 2, 2, 485, 99, 3, 2, 2, 2, 486, 487, 9, 6, 2, 2, 487, 101, 3, 2, 2, 2, + 488, 489, 9, 7, 2, 2, 489, 103, 3, 2, 2, 2, 490, 491, 5, 106, 54, 2, 491, + 492, 7, 102, 2, 2, 492, 496, 3, 2, 2, 2, 493, 494, 7, 48, 2, 2, 494, 496, + 5, 104, 53, 2, 495, 490, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 496, 105, 3, + 2, 2, 2, 497, 498, 8, 54, 1, 2, 498, 499, 5, 100, 51, 2, 499, 500, 5, 106, + 54, 9, 500, 512, 3, 2, 2, 2, 501, 512, 5, 124, 63, 2, 502, 503, 5, 112, + 57, 2, 503, 505, 7, 99, 2, 2, 504, 506, 5, 110, 56, 2, 505, 504, 3, 2, + 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 100, 2, + 2, 508, 512, 3, 2, 2, 2, 509, 512, 5, 88, 45, 2, 510, 512, 5, 108, 55, + 2, 511, 497, 3, 2, 2, 2, 511, 501, 3, 2, 2, 2, 511, 502, 3, 2, 2, 2, 511, + 509, 3, 2, 2, 2, 511, 510, 3, 2, 2, 2, 512, 526, 3, 2, 2, 2, 513, 514, + 12, 10, 2, 2, 514, 515, 5, 102, 52, 2, 515, 516, 5, 106, 54, 11, 516, 525, + 3, 2, 2, 2, 517, 518, 12, 7, 2, 2, 518, 519, 7, 95, 2, 2, 519, 520, 5, + 106, 54, 2, 520, 521, 7, 96, 2, 2, 521, 525, 3, 2, 2, 2, 522, 523, 12, + 5, 2, 2, 523, 525, 5, 118, 60, 2, 524, 513, 3, 2, 2, 2, 524, 517, 3, 2, + 2, 2, 524, 522, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, + 526, 527, 3, 2, 2, 2, 527, 107, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 529, + 536, 7, 107, 2, 2, 530, 536, 7, 110, 2, 2, 531, 536, 7, 112, 2, 2, 532, + 536, 7, 113, 2, 2, 533, 536, 7, 114, 2, 2, 534, 536, 5, 152, 77, 2, 535, + 529, 3, 2, 2, 2, 535, 530, 3, 2, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, + 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 109, 3, 2, + 2, 2, 537, 538, 5, 106, 54, 2, 538, 539, 7, 104, 2, 2, 539, 541, 3, 2, + 2, 2, 540, 537, 3, 2, 2, 2, 541, 544, 3, 2, 2, 2, 542, 540, 3, 2, 2, 2, + 542, 543, 3, 2, 2, 2, 543, 545, 3, 2, 2, 2, 544, 542, 3, 2, 2, 2, 545, + 546, 5, 106, 54, 2, 546, 111, 3, 2, 2, 2, 547, 551, 7, 113, 2, 2, 548, + 551, 5, 114, 58, 2, 549, 551, 5, 116, 59, 2, 550, 547, 3, 2, 2, 2, 550, + 548, 3, 2, 2, 2, 550, 549, 3, 2, 2, 2, 551, 113, 3, 2, 2, 2, 552, 553, + 9, 8, 2, 2, 553, 115, 3, 2, 2, 2, 554, 555, 5, 50, 26, 2, 555, 117, 3, + 2, 2, 2, 556, 557, 9, 9, 2, 2, 557, 119, 3, 2, 2, 2, 558, 559, 5, 122, + 62, 2, 559, 560, 5, 106, 54, 2, 560, 121, 3, 2, 2, 2, 561, 562, 9, 10, + 2, 2, 562, 123, 3, 2, 2, 2, 563, 564, 7, 113, 2, 2, 564, 565, 7, 69, 2, + 2, 565, 566, 5, 126, 64, 2, 566, 125, 3, 2, 2, 2, 567, 568, 7, 97, 2, 2, + 568, 569, 5, 110, 56, 2, 569, 570, 7, 98, 2, 2, 570, 573, 3, 2, 2, 2, 571, + 573, 5, 76, 39, 2, 572, 567, 3, 2, 2, 2, 572, 571, 3, 2, 2, 2, 573, 127, + 3, 2, 2, 2, 574, 577, 5, 10, 6, 2, 575, 577, 5, 20, 11, 2, 576, 574, 3, + 2, 2, 2, 576, 575, 3, 2, 2, 2, 577, 129, 3, 2, 2, 2, 578, 579, 7, 70, 2, + 2, 579, 580, 7, 99, 2, 2, 580, 581, 5, 106, 54, 2, 581, 582, 7, 100, 2, + 2, 582, 585, 5, 128, 65, 2, 583, 584, 7, 71, 2, 2, 584, 586, 5, 128, 65, + 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 131, 3, 2, 2, 2, 587, + 588, 7, 72, 2, 2, 588, 595, 5, 124, 63, 2, 589, 590, 7, 73, 2, 2, 590, + 591, 7, 99, 2, 2, 591, 592, 5, 106, 54, 2, 592, 593, 7, 100, 2, 2, 593, + 595, 3, 2, 2, 2, 594, 587, 3, 2, 2, 2, 594, 589, 3, 2, 2, 2, 595, 596, + 3, 2, 2, 2, 596, 597, 5, 128, 65, 2, 597, 133, 3, 2, 2, 2, 598, 599, 5, + 136, 69, 2, 599, 600, 7, 102, 2, 2, 600, 135, 3, 2, 2, 2, 601, 602, 9, + 11, 2, 2, 602, 137, 3, 2, 2, 2, 603, 604, 7, 77, 2, 2, 604, 610, 7, 113, + 2, 2, 605, 607, 7, 99, 2, 2, 606, 608, 5, 66, 34, 2, 607, 606, 3, 2, 2, + 2, 607, 608, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 611, 7, 100, 2, 2, + 610, 605, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 613, 3, 2, 2, 2, 612, + 614, 5, 18, 10, 2, 613, 612, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 616, + 3, 2, 2, 2, 615, 617, 5, 50, 26, 2, 616, 615, 3, 2, 2, 2, 616, 617, 3, + 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 619, 7, 102, 2, 2, 619, 139, 3, 2, + 2, 2, 620, 621, 7, 78, 2, 2, 621, 627, 7, 113, 2, 2, 622, 624, 7, 99, 2, + 2, 623, 625, 5, 142, 72, 2, 624, 623, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, + 625, 626, 3, 2, 2, 2, 626, 628, 7, 100, 2, 2, 627, 622, 3, 2, 2, 2, 627, + 628, 3, 2, 2, 2, 628, 630, 3, 2, 2, 2, 629, 631, 5, 18, 10, 2, 630, 629, + 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 633, 5, 20, + 11, 2, 633, 141, 3, 2, 2, 2, 634, 637, 5, 70, 36, 2, 635, 637, 5, 40, 21, + 2, 636, 634, 3, 2, 2, 2, 636, 635, 3, 2, 2, 2, 637, 143, 3, 2, 2, 2, 638, + 639, 7, 79, 2, 2, 639, 640, 7, 97, 2, 2, 640, 641, 11, 2, 2, 2, 641, 642, + 7, 98, 2, 2, 642, 145, 3, 2, 2, 2, 643, 644, 9, 12, 2, 2, 644, 147, 3, + 2, 2, 2, 645, 651, 7, 85, 2, 2, 646, 648, 7, 86, 2, 2, 647, 649, 7, 110, + 2, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 3, 2, 2, 2, + 650, 645, 3, 2, 2, 2, 650, 646, 3, 2, 2, 2, 651, 149, 3, 2, 2, 2, 652, + 653, 7, 87, 2, 2, 653, 654, 7, 113, 2, 2, 654, 660, 5, 82, 42, 2, 655, + 656, 7, 88, 2, 2, 656, 657, 5, 146, 74, 2, 657, 658, 5, 82, 42, 2, 658, + 660, 3, 2, 2, 2, 659, 652, 3, 2, 2, 2, 659, 655, 3, 2, 2, 2, 660, 151, + 3, 2, 2, 2, 661, 664, 5, 154, 78, 2, 662, 664, 7, 89, 2, 2, 663, 661, 3, + 2, 2, 2, 663, 662, 3, 2, 2, 2, 664, 153, 3, 2, 2, 2, 665, 667, 7, 113, + 2, 2, 666, 668, 5, 146, 74, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, + 2, 668, 674, 3, 2, 2, 2, 669, 670, 7, 56, 2, 2, 670, 671, 7, 99, 2, 2, + 671, 672, 7, 113, 2, 2, 672, 674, 7, 100, 2, 2, 673, 665, 3, 2, 2, 2, 673, + 669, 3, 2, 2, 2, 674, 155, 3, 2, 2, 2, 675, 676, 9, 13, 2, 2, 676, 157, + 3, 2, 2, 2, 677, 683, 5, 156, 79, 2, 678, 680, 7, 99, 2, 2, 679, 681, 5, + 110, 56, 2, 680, 679, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 682, 3, 2, + 2, 2, 682, 684, 7, 100, 2, 2, 683, 678, 3, 2, 2, 2, 683, 684, 3, 2, 2, + 2, 684, 685, 3, 2, 2, 2, 685, 688, 5, 22, 12, 2, 686, 689, 5, 76, 39, 2, + 687, 689, 5, 30, 16, 2, 688, 686, 3, 2, 2, 2, 688, 687, 3, 2, 2, 2, 689, + 159, 3, 2, 2, 2, 690, 691, 5, 158, 80, 2, 691, 692, 7, 102, 2, 2, 692, + 695, 3, 2, 2, 2, 693, 695, 5, 150, 76, 2, 694, 690, 3, 2, 2, 2, 694, 693, + 3, 2, 2, 2, 695, 161, 3, 2, 2, 2, 696, 699, 5, 164, 83, 2, 697, 699, 5, + 166, 84, 2, 698, 696, 3, 2, 2, 2, 698, 697, 3, 2, 2, 2, 699, 163, 3, 2, + 2, 2, 700, 701, 7, 92, 2, 2, 701, 702, 5, 168, 85, 2, 702, 703, 7, 102, + 2, 2, 703, 165, 3, 2, 2, 2, 704, 706, 7, 93, 2, 2, 705, 707, 5, 168, 85, + 2, 706, 705, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, + 714, 7, 113, 2, 2, 709, 711, 7, 99, 2, 2, 710, 712, 5, 170, 86, 2, 711, + 710, 3, 2, 2, 2, 711, 712, 3, 2, 2, 2, 712, 713, 3, 2, 2, 2, 713, 715, + 7, 100, 2, 2, 714, 709, 3, 2, 2, 2, 714, 715, 3, 2, 2, 2, 715, 716, 3, + 2, 2, 2, 716, 718, 5, 26, 14, 2, 717, 719, 5, 18, 10, 2, 718, 717, 3, 2, + 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 7, 97, 2, 2, + 721, 722, 11, 2, 2, 2, 722, 723, 7, 98, 2, 2, 723, 167, 3, 2, 2, 2, 724, + 725, 9, 14, 2, 2, 725, 169, 3, 2, 2, 2, 726, 729, 5, 70, 36, 2, 727, 729, + 5, 110, 56, 2, 728, 726, 3, 2, 2, 2, 728, 727, 3, 2, 2, 2, 729, 171, 3, + 2, 2, 2, 74, 176, 180, 185, 192, 211, 217, 222, 234, 252, 261, 268, 283, + 292, 305, 309, 313, 318, 320, 346, 350, 357, 370, 391, 395, 399, 403, 414, + 417, 425, 432, 439, 452, 463, 470, 473, 484, 495, 505, 511, 524, 526, 535, + 542, 550, 572, 576, 585, 594, 607, 610, 613, 616, 624, 627, 630, 636, 648, + 650, 659, 663, 667, 673, 680, 683, 688, 694, 698, 706, 711, 714, 718, 728, +} +var literalNames = []string{ + "", "'OPENQASM'", "'include'", "'qubit'", "'qreg'", "'bit'", "'creg'", + "'int'", "'uint'", "'float'", "'angle'", "'fixed'", "'bool'", "'const'", + "'let'", "'||'", "'gate'", "'measure'", "'barrier'", "'inv'", "'pow'", + "'ctrl'", "'@'", "'CX'", "'U'", "'reset'", "'~'", "'!'", "'+'", "'-'", + "'*'", "'/'", "'<<'", "'>>'", "'rotl'", "'rotr'", "'&&'", "'&'", "'|'", + "'^'", "'>'", "'<'", "'>='", "'<='", "'=='", "'!='", "'return'", "'sin'", + "'cos'", "'tan'", "'exp'", "'ln'", "'sqrt'", "'popcount'", "'lengthof'", + "'++'", "'--'", "'+='", "'-='", "'*='", "'/='", "'&='", "'|='", "'~='", + "'^='", "'<<='", "'>>='", "'in'", "'if'", "'else'", "'for'", "'while'", + "'break'", "'continue'", "'end'", "'kernel'", "'def'", "'#pragma'", "'dt'", + "'ns'", "'us'", "'ms'", "'s'", "'length'", "'stretch'", "'boxas'", "'boxto'", + "'stretchinf'", "'delay'", "'rotary'", "'defcalgrammar'", "'defcal'", "'openpulse'", + "'['", "']'", "'{'", "'}'", "'('", "')'", "':'", "';'", "'.'", "','", "'='", + "'->'", +} +var symbolicNames = []string{ + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "LBRACKET", "RBRACKET", "LBRACE", "RBRACE", "LPAREN", "RPAREN", + "COLON", "SEMICOLON", "DOT", "COMMA", "ASSIGN", "ARROW", "Constant", "Whitespace", + "Newline", "Integer", "Float", "RealNumber", "Identifier", "StringLiteral", + "LineComment", "BlockComment", +} + +var ruleNames = []string{ + "program", "header", "version", "include", "statement", "globalStatement", + "declarationStatement", "comment", "returnSignature", "programBlock", "designator", + "doubleDesignator", "identifierList", "indexIdentifier", "indexIdentifierList", + "association", "quantumType", "quantumDeclaration", "quantumArgument", + "quantumArgumentList", "bitType", "singleDesignatorType", "doubleDesignatorType", + "noDesignatorType", "classicalType", "constantDeclaration", "singleDesignatorDeclaration", + "doubleDesignatorDeclaration", "noDesignatorDeclaration", "bitDeclaration", + "classicalVariableDeclaration", "classicalDeclaration", "classicalTypeList", + "classicalArgument", "classicalArgumentList", "aliasStatement", "concatenateExpression", + "rangeDefinition", "quantumGateDefinition", "quantumGateSignature", "quantumBlock", + "quantumStatement", "quantumInstruction", "quantumMeasurement", "quantumMeasurementDeclaration", + "quantumBarrier", "quantumGateModifier", "quantumGateCall", "quantumGateName", + "unaryOperator", "binaryOperator", "expressionStatement", "expression", + "expressionTerminator", "expressionList", "call", "builtInMath", "castOperator", + "incrementor", "assignmentExpression", "assignmentOperator", "membershipTest", + "setDeclaration", "loopBranchBlock", "branchingStatement", "loopStatement", + "controlDirectiveStatement", "controlDirective", "kernelDeclaration", "subroutineDefinition", + "subroutineArgumentList", "pragma", "timeUnit", "timingType", "timingBox", + "timeTerminator", "timeIdentifier", "timeInstructionName", "timeInstruction", + "timeStatement", "calibration", "calibrationGrammarDeclaration", "calibrationDefinition", + "calibrationGrammar", "calibrationArgumentList", +} + +type qasm3Parser struct { + *antlr.BaseParser +} + +// Newqasm3Parser produces a new parser instance for the optional input antlr.TokenStream. +// +// The *qasm3Parser instance produced may be reused by calling the SetInputStream method. +// The initial parser configuration is expensive to construct, and the object is not thread-safe; +// however, if used within a Golang sync.Pool, the construction cost amortizes well and the +// objects can be used in a thread-safe manner. +func Newqasm3Parser(input antlr.TokenStream) *qasm3Parser { + this := new(qasm3Parser) + deserializer := antlr.NewATNDeserializer(nil) + deserializedATN := deserializer.DeserializeFromUInt16(parserATN) + decisionToDFA := make([]*antlr.DFA, len(deserializedATN.DecisionToState)) + for index, ds := range deserializedATN.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(ds, index) + } + this.BaseParser = antlr.NewBaseParser(input) + + this.Interpreter = antlr.NewParserATNSimulator(this, deserializedATN, decisionToDFA, antlr.NewPredictionContextCache()) + this.RuleNames = ruleNames + this.LiteralNames = literalNames + this.SymbolicNames = symbolicNames + this.GrammarFileName = "qasm3.g4" + + return this +} + +// qasm3Parser tokens. +const ( + qasm3ParserEOF = antlr.TokenEOF + qasm3ParserT__0 = 1 + qasm3ParserT__1 = 2 + qasm3ParserT__2 = 3 + qasm3ParserT__3 = 4 + qasm3ParserT__4 = 5 + qasm3ParserT__5 = 6 + qasm3ParserT__6 = 7 + qasm3ParserT__7 = 8 + qasm3ParserT__8 = 9 + qasm3ParserT__9 = 10 + qasm3ParserT__10 = 11 + qasm3ParserT__11 = 12 + qasm3ParserT__12 = 13 + qasm3ParserT__13 = 14 + qasm3ParserT__14 = 15 + qasm3ParserT__15 = 16 + qasm3ParserT__16 = 17 + qasm3ParserT__17 = 18 + qasm3ParserT__18 = 19 + qasm3ParserT__19 = 20 + qasm3ParserT__20 = 21 + qasm3ParserT__21 = 22 + qasm3ParserT__22 = 23 + qasm3ParserT__23 = 24 + qasm3ParserT__24 = 25 + qasm3ParserT__25 = 26 + qasm3ParserT__26 = 27 + qasm3ParserT__27 = 28 + qasm3ParserT__28 = 29 + qasm3ParserT__29 = 30 + qasm3ParserT__30 = 31 + qasm3ParserT__31 = 32 + qasm3ParserT__32 = 33 + qasm3ParserT__33 = 34 + qasm3ParserT__34 = 35 + qasm3ParserT__35 = 36 + qasm3ParserT__36 = 37 + qasm3ParserT__37 = 38 + qasm3ParserT__38 = 39 + qasm3ParserT__39 = 40 + qasm3ParserT__40 = 41 + qasm3ParserT__41 = 42 + qasm3ParserT__42 = 43 + qasm3ParserT__43 = 44 + qasm3ParserT__44 = 45 + qasm3ParserT__45 = 46 + qasm3ParserT__46 = 47 + qasm3ParserT__47 = 48 + qasm3ParserT__48 = 49 + qasm3ParserT__49 = 50 + qasm3ParserT__50 = 51 + qasm3ParserT__51 = 52 + qasm3ParserT__52 = 53 + qasm3ParserT__53 = 54 + qasm3ParserT__54 = 55 + qasm3ParserT__55 = 56 + qasm3ParserT__56 = 57 + qasm3ParserT__57 = 58 + qasm3ParserT__58 = 59 + qasm3ParserT__59 = 60 + qasm3ParserT__60 = 61 + qasm3ParserT__61 = 62 + qasm3ParserT__62 = 63 + qasm3ParserT__63 = 64 + qasm3ParserT__64 = 65 + qasm3ParserT__65 = 66 + qasm3ParserT__66 = 67 + qasm3ParserT__67 = 68 + qasm3ParserT__68 = 69 + qasm3ParserT__69 = 70 + qasm3ParserT__70 = 71 + qasm3ParserT__71 = 72 + qasm3ParserT__72 = 73 + qasm3ParserT__73 = 74 + qasm3ParserT__74 = 75 + qasm3ParserT__75 = 76 + qasm3ParserT__76 = 77 + qasm3ParserT__77 = 78 + qasm3ParserT__78 = 79 + qasm3ParserT__79 = 80 + qasm3ParserT__80 = 81 + qasm3ParserT__81 = 82 + qasm3ParserT__82 = 83 + qasm3ParserT__83 = 84 + qasm3ParserT__84 = 85 + qasm3ParserT__85 = 86 + qasm3ParserT__86 = 87 + qasm3ParserT__87 = 88 + qasm3ParserT__88 = 89 + qasm3ParserT__89 = 90 + qasm3ParserT__90 = 91 + qasm3ParserT__91 = 92 + qasm3ParserLBRACKET = 93 + qasm3ParserRBRACKET = 94 + qasm3ParserLBRACE = 95 + qasm3ParserRBRACE = 96 + qasm3ParserLPAREN = 97 + qasm3ParserRPAREN = 98 + qasm3ParserCOLON = 99 + qasm3ParserSEMICOLON = 100 + qasm3ParserDOT = 101 + qasm3ParserCOMMA = 102 + qasm3ParserASSIGN = 103 + qasm3ParserARROW = 104 + qasm3ParserConstant = 105 + qasm3ParserWhitespace = 106 + qasm3ParserNewline = 107 + qasm3ParserInteger = 108 + qasm3ParserFloat = 109 + qasm3ParserRealNumber = 110 + qasm3ParserIdentifier = 111 + qasm3ParserStringLiteral = 112 + qasm3ParserLineComment = 113 + qasm3ParserBlockComment = 114 +) + +// qasm3Parser rules. +const ( + qasm3ParserRULE_program = 0 + qasm3ParserRULE_header = 1 + qasm3ParserRULE_version = 2 + qasm3ParserRULE_include = 3 + qasm3ParserRULE_statement = 4 + qasm3ParserRULE_globalStatement = 5 + qasm3ParserRULE_declarationStatement = 6 + qasm3ParserRULE_comment = 7 + qasm3ParserRULE_returnSignature = 8 + qasm3ParserRULE_programBlock = 9 + qasm3ParserRULE_designator = 10 + qasm3ParserRULE_doubleDesignator = 11 + qasm3ParserRULE_identifierList = 12 + qasm3ParserRULE_indexIdentifier = 13 + qasm3ParserRULE_indexIdentifierList = 14 + qasm3ParserRULE_association = 15 + qasm3ParserRULE_quantumType = 16 + qasm3ParserRULE_quantumDeclaration = 17 + qasm3ParserRULE_quantumArgument = 18 + qasm3ParserRULE_quantumArgumentList = 19 + qasm3ParserRULE_bitType = 20 + qasm3ParserRULE_singleDesignatorType = 21 + qasm3ParserRULE_doubleDesignatorType = 22 + qasm3ParserRULE_noDesignatorType = 23 + qasm3ParserRULE_classicalType = 24 + qasm3ParserRULE_constantDeclaration = 25 + qasm3ParserRULE_singleDesignatorDeclaration = 26 + qasm3ParserRULE_doubleDesignatorDeclaration = 27 + qasm3ParserRULE_noDesignatorDeclaration = 28 + qasm3ParserRULE_bitDeclaration = 29 + qasm3ParserRULE_classicalVariableDeclaration = 30 + qasm3ParserRULE_classicalDeclaration = 31 + qasm3ParserRULE_classicalTypeList = 32 + qasm3ParserRULE_classicalArgument = 33 + qasm3ParserRULE_classicalArgumentList = 34 + qasm3ParserRULE_aliasStatement = 35 + qasm3ParserRULE_concatenateExpression = 36 + qasm3ParserRULE_rangeDefinition = 37 + qasm3ParserRULE_quantumGateDefinition = 38 + qasm3ParserRULE_quantumGateSignature = 39 + qasm3ParserRULE_quantumBlock = 40 + qasm3ParserRULE_quantumStatement = 41 + qasm3ParserRULE_quantumInstruction = 42 + qasm3ParserRULE_quantumMeasurement = 43 + qasm3ParserRULE_quantumMeasurementDeclaration = 44 + qasm3ParserRULE_quantumBarrier = 45 + qasm3ParserRULE_quantumGateModifier = 46 + qasm3ParserRULE_quantumGateCall = 47 + qasm3ParserRULE_quantumGateName = 48 + qasm3ParserRULE_unaryOperator = 49 + qasm3ParserRULE_binaryOperator = 50 + qasm3ParserRULE_expressionStatement = 51 + qasm3ParserRULE_expression = 52 + qasm3ParserRULE_expressionTerminator = 53 + qasm3ParserRULE_expressionList = 54 + qasm3ParserRULE_call = 55 + qasm3ParserRULE_builtInMath = 56 + qasm3ParserRULE_castOperator = 57 + qasm3ParserRULE_incrementor = 58 + qasm3ParserRULE_assignmentExpression = 59 + qasm3ParserRULE_assignmentOperator = 60 + qasm3ParserRULE_membershipTest = 61 + qasm3ParserRULE_setDeclaration = 62 + qasm3ParserRULE_loopBranchBlock = 63 + qasm3ParserRULE_branchingStatement = 64 + qasm3ParserRULE_loopStatement = 65 + qasm3ParserRULE_controlDirectiveStatement = 66 + qasm3ParserRULE_controlDirective = 67 + qasm3ParserRULE_kernelDeclaration = 68 + qasm3ParserRULE_subroutineDefinition = 69 + qasm3ParserRULE_subroutineArgumentList = 70 + qasm3ParserRULE_pragma = 71 + qasm3ParserRULE_timeUnit = 72 + qasm3ParserRULE_timingType = 73 + qasm3ParserRULE_timingBox = 74 + qasm3ParserRULE_timeTerminator = 75 + qasm3ParserRULE_timeIdentifier = 76 + qasm3ParserRULE_timeInstructionName = 77 + qasm3ParserRULE_timeInstruction = 78 + qasm3ParserRULE_timeStatement = 79 + qasm3ParserRULE_calibration = 80 + qasm3ParserRULE_calibrationGrammarDeclaration = 81 + qasm3ParserRULE_calibrationDefinition = 82 + qasm3ParserRULE_calibrationGrammar = 83 + qasm3ParserRULE_calibrationArgumentList = 84 +) + +// IProgramContext is an interface to support dynamic dispatch. +type IProgramContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // IsProgramContext differentiates from other interfaces. + IsProgramContext() +} + +type ProgramContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyProgramContext() *ProgramContext { + var p = new(ProgramContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = qasm3ParserRULE_program + return p +} + +func (*ProgramContext) IsProgramContext() {} + +func NewProgramContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *ProgramContext { + var p = new(ProgramContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = qasm3ParserRULE_program + + return p +} + +func (s *ProgramContext) GetParser() antlr.Parser { return s.parser } + +func (s *ProgramContext) Header() IHeaderContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IHeaderContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IHeaderContext) +} + +func (s *ProgramContext) AllStatement() []IStatementContext { + var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IStatementContext)(nil)).Elem()) + var tst = make([]IStatementContext, len(ts)) + + for i, t := range ts { + if t != nil { + tst[i] = t.(IStatementContext) + } + } + + return tst +} + +func (s *ProgramContext) Statement(i int) IStatementContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IStatementContext)(nil)).Elem(), i) + + if t == nil { + return nil + } + + return t.(IStatementContext) +} + +func (s *ProgramContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *ProgramContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *ProgramContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(qasm3Listener); ok { + listenerT.EnterProgram(s) + } +} + +func (s *ProgramContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(qasm3Listener); ok { + listenerT.ExitProgram(s) + } +} + +func (p *qasm3Parser) Program() (localctx IProgramContext) { + localctx = NewProgramContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 0, qasm3ParserRULE_program) + 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(170) + p.Header() + } + p.SetState(174) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + for (((_la)&-(0x1f+1)) == 0 && ((1< Date: Sat, 2 Jan 2021 23:33:36 +0300 Subject: [PATCH 2/4] wip example of teleport and parser of qams3 --- Makefile | 9 + cmd/qasm3/main.go | 37 + example/adder.qasm | 42 + example/config.yaml | 2 - example/stdgates.inc | 97 ++ example/teleport.qasm | 30 + go.mod | 1 + go.sum | 2 + internal/Makefile | 2 +- internal/qasm3.g4 | 2 +- internal/qasm3/qasm3.interp | 2 +- internal/qasm3/qasm3_base_listener.go | 3 +- internal/qasm3/qasm3_lexer.go | 2 +- internal/qasm3/qasm3_listener.go | 3 +- internal/qasm3/qasm3_parser.go | 1187 +++++++++++++------------ internal/qasm3_old.g4 | 98 -- pkg/machine/register.go | 17 +- pkg/machine/register_qasm3.go | 91 ++ 18 files changed, 929 insertions(+), 698 deletions(-) create mode 100644 cmd/qasm3/main.go create mode 100644 example/adder.qasm delete mode 100644 example/config.yaml create mode 100644 example/stdgates.inc create mode 100644 example/teleport.qasm delete mode 100644 internal/qasm3_old.g4 create mode 100644 pkg/machine/register_qasm3.go diff --git a/Makefile b/Makefile index 57fb5b4..fe3eecf 100644 --- a/Makefile +++ b/Makefile @@ -7,3 +7,12 @@ build: clean: rm -rf ./bin + +qasm3: + $(MAKE) -C ./internal $@ + +qasm3-go: + go build -o ./bin/qasm3 -v ./cmd/qasm3/. + +.PHONY: cmd-qasm +gen-qasm: qasm3 qasm3-go diff --git a/cmd/qasm3/main.go b/cmd/qasm3/main.go new file mode 100644 index 0000000..c04d519 --- /dev/null +++ b/cmd/qasm3/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/Quant-Team/qvm/pkg/machine" +) + +var ( + path string + debug bool +) + +func init() { + flag.StringVar(&path, "file", "", "file of qasm") + flag.BoolVar(&debug, "debug", false, "print debug token") + flag.Parse() +} + +func main() { + + register := machine.NewRegisterQasm(debug) + + register.ParseProgramm(path) + + w := os.Stdout + pp := register.Probability() + fmt.Fprintf(w, "q.Probability: %v\n", pp) + fmt.Fprintln(w, "Measure me ^^") + m := register.Measure() + fmt.Fprintln(w, "q.Measure:") + for _, q := range m { + fmt.Fprintf(w, "%v\n", q) + } +} diff --git a/example/adder.qasm b/example/adder.qasm new file mode 100644 index 0000000..800ec8e --- /dev/null +++ b/example/adder.qasm @@ -0,0 +1,42 @@ +/* + * quantum ripple-carry adder + * Cuccaro et al, quant-ph/0410184 + */ +OPENQASM 3; +include "stdgates.inc"; + +gate majority a, b, c { + cx c, b; + cx c, a; + ccx a, b, c; +} + +gate unmaj a, b, c { + ccx a, b, c; + cx c, a; + cx a, b; +} + +qubit cin[1], a[4], b[4], cout[1]; +bit ans[5]; +uint[4] a_in = 1; // a = 0001 +uint[4] b_in = 15; // b = 1111 +// initialize qubits +reset cin; +reset a; +reset b; +reset cout; + +// set input states +for i in [0: 3] { + if(bool(ain[i])) x a[i]; + if(bool(bin[i])) x b[i]; +} +// add a to b, storing result in b +majority cin[0], b[0], a[0]; +for i in [0: 2] { majority a[i], b[i + 1], a[i + 1]; } +cx a[3], cout[0]; +for i in [2: -1: 0] { unmaj a[i],b[i+1],a[i+1]; } +unmaj cin[0], b[0], a[0]; +measure b[0:3] -> ans[0:3]; +measure cout[0] -> ans[4]; diff --git a/example/config.yaml b/example/config.yaml deleted file mode 100644 index 06daf78..0000000 --- a/example/config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -register: - count_qubit: 2 diff --git a/example/stdgates.inc b/example/stdgates.inc new file mode 100644 index 0000000..8ca1317 --- /dev/null +++ b/example/stdgates.inc @@ -0,0 +1,97 @@ +// Standard gate library + +// phase gate (Z-rotation by lambda) +gate phase(angle[32]:lambda) q { U(0, 0, lambda) q; } +// controlled-NOT +gate cx c, t { CX c, t; } +// idle gate (identity) +gate id a { U(0, 0, 0) a; } +// Pauli gate: bit-flip +gate x a { U(pi, 0, pi) a; } +// Pauli gate: bit and phase flip +gate y a { U(pi, pi / 2, pi / 2) a; } +// Pauli gate: phase flip +gate z a { phase(pi) a; } +// Clifford gate: Hadamard +gate h a { U(pi / 2, 0, pi) a; } +// Clifford gate: sqrt(Z) phase gate +gate s a { phase(pi / 2) a; } +// Clifford gate: conjugate of sqrt(Z) +gate sdg a { phase(-pi / 2) a; } +// C3 gate: sqrt(S) phase gate +gate t a { phase(pi/4) a; } +// C3 gate: conjugate of sqrt(S) +gate tdg a { phase(-pi/4) a; } +// Rotation around X-axis +gate rx(angle[32]:theta) a { U(theta, -pi / 2, pi / 2) a; } +// rotation around Y-axis +gate ry(angle[32]:theta) a { U(theta, 0, 0) a; } +// rotation around Z axis +gate rz(angle[32]:phi) a { phase(phi) a; } +// controlled-Phase +gate cz a, b { h b; cx a, b; h b; } +// controlled-Y +gate cy a, b { sdg b; cx a, b; s b; } +// controlled-H +gate ch a, b { + h b; + sdg b; + cx a, b; + h b; + t b; + cx a, b; + t b; s a; + h b; + s b; + x b; +} +// Toffoli +gate ccx a, b, c +{ + h c; + cx b, c; + tdg c; + cx a, c; + t c; + cx b, c; + tdg c; + cx a, c; + t b; t c; h c; + cx a, b; + t a; tdg b; + cx a, b; +} +// controlled-swap +gate cswap a, b, c +{ + cx c, b; + ccx a, b, c; + cx c, b; +} +// controlled-rz +gate crz(angle[32]:lambda) a, b +{ + phase(lambda / 2) b; + cx a, b; + phase(-lambda / 2) b; + cx a, b; +} +// controlled-phase +gate cphase(angle[32]:lambda) a, b +{ + phase(lambda / 2) a; + cx a, b; + phase(-lambda / 2) b; + cx a, b; + phase(lambda / 2) b; +} +// controlled-U +gate cu(angle[32]:theta,angle[32]:phi,angle[32]:lambda) c, t +{ + // implements controlled-U(theta,phi,lambda) with target t and control c + phase((lambda - phi)/2) t; + cx c,t; + U(-theta / 2, 0, -(phi + lambda) / 2) t; + cx c, t; + U(theta / 2, phi, 0) t; +} diff --git a/example/teleport.qasm b/example/teleport.qasm new file mode 100644 index 0000000..07c2479 --- /dev/null +++ b/example/teleport.qasm @@ -0,0 +1,30 @@ +OPENQASM 3; + +include "stdgates.inc"; + +qubit q[3]; + +bit c0; +bit c1; +bit c2; + +gate post q { } +reset q; + +h q[1]; +cx q[1], q[2]; + +barrier q; + +cx q[0], q[1]; +h q[0]; + +c0 = measure q[0]; +c1 = measure q[1]; + +if(c0==1) { z q[2]; } +if(c1==1) { x q[2]; } + +post q[2]; + +c2 = measure q[2]; diff --git a/go.mod b/go.mod index 3fde572..fd05f53 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/Quant-Team/qvm go 1.13 require ( + github.com/antlr/antlr4 v0.0.0-20210101015028-491cb7861390 github.com/gorilla/mux v1.7.3 gorgonia.org/tensor v0.9.1 ) diff --git a/go.sum b/go.sum index 9f218e0..5a0156c 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,6 @@ github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/antlr/antlr4 v0.0.0-20210101015028-491cb7861390 h1:NWBORai/tEFrLdEEgdg7s8JQ9XKRy8B4itZhQC/TlK8= +github.com/antlr/antlr4 v0.0.0-20210101015028-491cb7861390/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= github.com/chewxy/hm v1.0.0 h1:zy/TSv3LV2nD3dwUEQL2VhXeoXbb9QkpmdRAVUFiA6k= github.com/chewxy/hm v1.0.0/go.mod h1:qg9YI4q6Fkj/whwHR1D+bOGeF7SniIP40VweVepLjg0= github.com/chewxy/math32 v1.0.0/go.mod h1:Miac6hA1ohdDUTagnvJy/q+aNnEk16qWUdb8ZVhvCN0= diff --git a/internal/Makefile b/internal/Makefile index b28b4e7..aa2f124 100644 --- a/internal/Makefile +++ b/internal/Makefile @@ -4,4 +4,4 @@ grun=java org.antlr.v4.gui.TestRig .PHONY: qasm3 qasm3: - $(antlr4) -Dlanguage=Go -o $@ ./$@.g4 + $(antlr4) -Dlanguage=Go -package $@ -o $@ ./$@.g4 diff --git a/internal/qasm3.g4 b/internal/qasm3.g4 index 7634db8..3c7f6ad 100644 --- a/internal/qasm3.g4 +++ b/internal/qasm3.g4 @@ -144,7 +144,7 @@ noDesignatorDeclaration ; bitDeclaration - : bitType Identifier designator + : bitType Identifier designator? ; classicalVariableDeclaration diff --git a/internal/qasm3/qasm3.interp b/internal/qasm3/qasm3.interp index 3c28134..d23e193 100644 --- a/internal/qasm3/qasm3.interp +++ b/internal/qasm3/qasm3.interp @@ -321,4 +321,4 @@ calibrationArgumentList atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 116, 731, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 3, 2, 3, 2, 7, 2, 175, 10, 2, 12, 2, 14, 2, 178, 11, 2, 3, 3, 5, 3, 181, 10, 3, 3, 3, 7, 3, 184, 10, 3, 12, 3, 14, 3, 187, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 193, 10, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 212, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 218, 10, 7, 3, 8, 3, 8, 3, 8, 5, 8, 223, 10, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 5, 11, 235, 10, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 7, 14, 251, 10, 14, 12, 14, 14, 14, 254, 11, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 262, 10, 15, 3, 16, 3, 16, 3, 16, 7, 16, 267, 10, 16, 12, 16, 14, 16, 270, 11, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 284, 10, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 7, 21, 291, 10, 21, 12, 21, 14, 21, 294, 11, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 306, 10, 25, 3, 26, 3, 26, 5, 26, 310, 10, 26, 3, 26, 3, 26, 5, 26, 314, 10, 26, 3, 26, 3, 26, 3, 26, 5, 26, 319, 10, 26, 5, 26, 321, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 347, 10, 32, 3, 33, 3, 33, 5, 33, 351, 10, 33, 3, 34, 3, 34, 3, 34, 7, 34, 356, 10, 34, 12, 34, 14, 34, 359, 11, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 7, 36, 369, 10, 36, 12, 36, 14, 36, 372, 11, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 392, 10, 38, 3, 39, 3, 39, 5, 39, 396, 10, 39, 3, 39, 3, 39, 5, 39, 400, 10, 39, 3, 39, 3, 39, 5, 39, 404, 10, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 5, 41, 415, 10, 41, 3, 41, 5, 41, 418, 10, 41, 3, 41, 3, 41, 3, 42, 3, 42, 7, 42, 424, 10, 42, 12, 42, 14, 42, 427, 11, 42, 3, 42, 3, 42, 3, 43, 3, 43, 5, 43, 433, 10, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 5, 44, 440, 10, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 5, 46, 453, 10, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 464, 10, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 5, 49, 471, 10, 49, 3, 49, 5, 49, 474, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 485, 10, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 496, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 506, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 512, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 525, 10, 54, 12, 54, 14, 54, 528, 11, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 536, 10, 55, 3, 56, 3, 56, 3, 56, 7, 56, 541, 10, 56, 12, 56, 14, 56, 544, 11, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 5, 57, 551, 10, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 5, 64, 573, 10, 64, 3, 65, 3, 65, 5, 65, 577, 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 5, 66, 586, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 595, 10, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 5, 70, 608, 10, 70, 3, 70, 5, 70, 611, 10, 70, 3, 70, 5, 70, 614, 10, 70, 3, 70, 5, 70, 617, 10, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 5, 71, 625, 10, 71, 3, 71, 5, 71, 628, 10, 71, 3, 71, 5, 71, 631, 10, 71, 3, 71, 3, 71, 3, 72, 3, 72, 5, 72, 637, 10, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 5, 75, 649, 10, 75, 5, 75, 651, 10, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 5, 76, 660, 10, 76, 3, 77, 3, 77, 5, 77, 664, 10, 77, 3, 78, 3, 78, 5, 78, 668, 10, 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 674, 10, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 5, 80, 681, 10, 80, 3, 80, 5, 80, 684, 10, 80, 3, 80, 3, 80, 3, 80, 5, 80, 689, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 695, 10, 81, 3, 82, 3, 82, 5, 82, 699, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 5, 84, 707, 10, 84, 3, 84, 3, 84, 3, 84, 5, 84, 712, 10, 84, 3, 84, 5, 84, 715, 10, 84, 3, 84, 3, 84, 5, 84, 719, 10, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 5, 86, 729, 10, 86, 3, 86, 2, 3, 106, 87, 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, 2, 15, 3, 2, 115, 116, 3, 2, 5, 6, 3, 2, 7, 8, 3, 2, 9, 12, 3, 2, 28, 29, 4, 2, 17, 17, 30, 47, 3, 2, 49, 56, 3, 2, 57, 58, 4, 2, 59, 68, 105, 106, 3, 2, 74, 76, 3, 2, 80, 84, 3, 2, 90, 91, 4, 2, 94, 94, 113, 113, 2, 750, 2, 172, 3, 2, 2, 2, 4, 180, 3, 2, 2, 2, 6, 188, 3, 2, 2, 2, 8, 196, 3, 2, 2, 2, 10, 211, 3, 2, 2, 2, 12, 217, 3, 2, 2, 2, 14, 222, 3, 2, 2, 2, 16, 226, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 231, 3, 2, 2, 2, 22, 238, 3, 2, 2, 2, 24, 242, 3, 2, 2, 2, 26, 252, 3, 2, 2, 2, 28, 257, 3, 2, 2, 2, 30, 268, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 276, 3, 2, 2, 2, 36, 278, 3, 2, 2, 2, 38, 281, 3, 2, 2, 2, 40, 292, 3, 2, 2, 2, 42, 297, 3, 2, 2, 2, 44, 299, 3, 2, 2, 2, 46, 301, 3, 2, 2, 2, 48, 305, 3, 2, 2, 2, 50, 320, 3, 2, 2, 2, 52, 322, 3, 2, 2, 2, 54, 327, 3, 2, 2, 2, 56, 331, 3, 2, 2, 2, 58, 335, 3, 2, 2, 2, 60, 338, 3, 2, 2, 2, 62, 346, 3, 2, 2, 2, 64, 348, 3, 2, 2, 2, 66, 357, 3, 2, 2, 2, 68, 362, 3, 2, 2, 2, 70, 370, 3, 2, 2, 2, 72, 375, 3, 2, 2, 2, 74, 380, 3, 2, 2, 2, 76, 393, 3, 2, 2, 2, 78, 407, 3, 2, 2, 2, 80, 411, 3, 2, 2, 2, 82, 421, 3, 2, 2, 2, 84, 432, 3, 2, 2, 2, 86, 439, 3, 2, 2, 2, 88, 441, 3, 2, 2, 2, 90, 452, 3, 2, 2, 2, 92, 454, 3, 2, 2, 2, 94, 463, 3, 2, 2, 2, 96, 467, 3, 2, 2, 2, 98, 484, 3, 2, 2, 2, 100, 486, 3, 2, 2, 2, 102, 488, 3, 2, 2, 2, 104, 495, 3, 2, 2, 2, 106, 511, 3, 2, 2, 2, 108, 535, 3, 2, 2, 2, 110, 542, 3, 2, 2, 2, 112, 550, 3, 2, 2, 2, 114, 552, 3, 2, 2, 2, 116, 554, 3, 2, 2, 2, 118, 556, 3, 2, 2, 2, 120, 558, 3, 2, 2, 2, 122, 561, 3, 2, 2, 2, 124, 563, 3, 2, 2, 2, 126, 572, 3, 2, 2, 2, 128, 576, 3, 2, 2, 2, 130, 578, 3, 2, 2, 2, 132, 594, 3, 2, 2, 2, 134, 598, 3, 2, 2, 2, 136, 601, 3, 2, 2, 2, 138, 603, 3, 2, 2, 2, 140, 620, 3, 2, 2, 2, 142, 636, 3, 2, 2, 2, 144, 638, 3, 2, 2, 2, 146, 643, 3, 2, 2, 2, 148, 650, 3, 2, 2, 2, 150, 659, 3, 2, 2, 2, 152, 663, 3, 2, 2, 2, 154, 673, 3, 2, 2, 2, 156, 675, 3, 2, 2, 2, 158, 677, 3, 2, 2, 2, 160, 694, 3, 2, 2, 2, 162, 698, 3, 2, 2, 2, 164, 700, 3, 2, 2, 2, 166, 704, 3, 2, 2, 2, 168, 724, 3, 2, 2, 2, 170, 728, 3, 2, 2, 2, 172, 176, 5, 4, 3, 2, 173, 175, 5, 10, 6, 2, 174, 173, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 3, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, 6, 4, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 185, 3, 2, 2, 2, 182, 184, 5, 8, 5, 2, 183, 182, 3, 2, 2, 2, 184, 187, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 5, 3, 2, 2, 2, 187, 185, 3, 2, 2, 2, 188, 189, 7, 3, 2, 2, 189, 192, 7, 110, 2, 2, 190, 191, 7, 103, 2, 2, 191, 193, 7, 110, 2, 2, 192, 190, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 102, 2, 2, 195, 7, 3, 2, 2, 2, 196, 197, 7, 4, 2, 2, 197, 198, 7, 114, 2, 2, 198, 199, 7, 102, 2, 2, 199, 9, 3, 2, 2, 2, 200, 212, 5, 12, 7, 2, 201, 212, 5, 104, 53, 2, 202, 212, 5, 14, 8, 2, 203, 212, 5, 130, 66, 2, 204, 212, 5, 132, 67, 2, 205, 212, 5, 134, 68, 2, 206, 212, 5, 72, 37, 2, 207, 212, 5, 84, 43, 2, 208, 212, 5, 160, 81, 2, 209, 212, 5, 144, 73, 2, 210, 212, 5, 16, 9, 2, 211, 200, 3, 2, 2, 2, 211, 201, 3, 2, 2, 2, 211, 202, 3, 2, 2, 2, 211, 203, 3, 2, 2, 2, 211, 204, 3, 2, 2, 2, 211, 205, 3, 2, 2, 2, 211, 206, 3, 2, 2, 2, 211, 207, 3, 2, 2, 2, 211, 208, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 210, 3, 2, 2, 2, 212, 11, 3, 2, 2, 2, 213, 218, 5, 140, 71, 2, 214, 218, 5, 138, 70, 2, 215, 218, 5, 78, 40, 2, 216, 218, 5, 166, 84, 2, 217, 213, 3, 2, 2, 2, 217, 214, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 217, 216, 3, 2, 2, 2, 218, 13, 3, 2, 2, 2, 219, 223, 5, 36, 19, 2, 220, 223, 5, 64, 33, 2, 221, 223, 5, 52, 27, 2, 222, 219, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, 222, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 7, 102, 2, 2, 225, 15, 3, 2, 2, 2, 226, 227, 9, 2, 2, 2, 227, 17, 3, 2, 2, 2, 228, 229, 7, 106, 2, 2, 229, 230, 5, 64, 33, 2, 230, 19, 3, 2, 2, 2, 231, 234, 7, 97, 2, 2, 232, 235, 5, 20, 11, 2, 233, 235, 5, 10, 6, 2, 234, 232, 3, 2, 2, 2, 234, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 237, 7, 98, 2, 2, 237, 21, 3, 2, 2, 2, 238, 239, 7, 95, 2, 2, 239, 240, 5, 106, 54, 2, 240, 241, 7, 96, 2, 2, 241, 23, 3, 2, 2, 2, 242, 243, 7, 95, 2, 2, 243, 244, 5, 106, 54, 2, 244, 245, 7, 104, 2, 2, 245, 246, 5, 106, 54, 2, 246, 247, 7, 96, 2, 2, 247, 25, 3, 2, 2, 2, 248, 249, 7, 113, 2, 2, 249, 251, 7, 104, 2, 2, 250, 248, 3, 2, 2, 2, 251, 254, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 255, 3, 2, 2, 2, 254, 252, 3, 2, 2, 2, 255, 256, 7, 113, 2, 2, 256, 27, 3, 2, 2, 2, 257, 261, 7, 113, 2, 2, 258, 262, 5, 22, 12, 2, 259, 262, 5, 24, 13, 2, 260, 262, 5, 76, 39, 2, 261, 258, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 29, 3, 2, 2, 2, 263, 264, 5, 28, 15, 2, 264, 265, 7, 104, 2, 2, 265, 267, 3, 2, 2, 2, 266, 263, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 268, 3, 2, 2, 2, 271, 272, 5, 28, 15, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 101, 2, 2, 274, 275, 7, 113, 2, 2, 275, 33, 3, 2, 2, 2, 276, 277, 9, 3, 2, 2, 277, 35, 3, 2, 2, 2, 278, 279, 5, 34, 18, 2, 279, 280, 5, 30, 16, 2, 280, 37, 3, 2, 2, 2, 281, 283, 5, 34, 18, 2, 282, 284, 5, 22, 12, 2, 283, 282, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 286, 5, 32, 17, 2, 286, 39, 3, 2, 2, 2, 287, 288, 5, 38, 20, 2, 288, 289, 7, 104, 2, 2, 289, 291, 3, 2, 2, 2, 290, 287, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 295, 296, 5, 38, 20, 2, 296, 41, 3, 2, 2, 2, 297, 298, 9, 4, 2, 2, 298, 43, 3, 2, 2, 2, 299, 300, 9, 5, 2, 2, 300, 45, 3, 2, 2, 2, 301, 302, 7, 13, 2, 2, 302, 47, 3, 2, 2, 2, 303, 306, 7, 14, 2, 2, 304, 306, 5, 148, 75, 2, 305, 303, 3, 2, 2, 2, 305, 304, 3, 2, 2, 2, 306, 49, 3, 2, 2, 2, 307, 309, 5, 44, 23, 2, 308, 310, 5, 22, 12, 2, 309, 308, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 321, 3, 2, 2, 2, 311, 313, 5, 46, 24, 2, 312, 314, 5, 24, 13, 2, 313, 312, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 321, 3, 2, 2, 2, 315, 321, 5, 48, 25, 2, 316, 318, 5, 42, 22, 2, 317, 319, 5, 22, 12, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 321, 3, 2, 2, 2, 320, 307, 3, 2, 2, 2, 320, 311, 3, 2, 2, 2, 320, 315, 3, 2, 2, 2, 320, 316, 3, 2, 2, 2, 321, 51, 3, 2, 2, 2, 322, 323, 7, 15, 2, 2, 323, 324, 7, 113, 2, 2, 324, 325, 7, 105, 2, 2, 325, 326, 5, 106, 54, 2, 326, 53, 3, 2, 2, 2, 327, 328, 5, 44, 23, 2, 328, 329, 5, 22, 12, 2, 329, 330, 7, 113, 2, 2, 330, 55, 3, 2, 2, 2, 331, 332, 5, 46, 24, 2, 332, 333, 5, 24, 13, 2, 333, 334, 7, 113, 2, 2, 334, 57, 3, 2, 2, 2, 335, 336, 5, 48, 25, 2, 336, 337, 7, 113, 2, 2, 337, 59, 3, 2, 2, 2, 338, 339, 5, 42, 22, 2, 339, 340, 7, 113, 2, 2, 340, 341, 5, 22, 12, 2, 341, 61, 3, 2, 2, 2, 342, 347, 5, 54, 28, 2, 343, 347, 5, 56, 29, 2, 344, 347, 5, 58, 30, 2, 345, 347, 5, 60, 31, 2, 346, 342, 3, 2, 2, 2, 346, 343, 3, 2, 2, 2, 346, 344, 3, 2, 2, 2, 346, 345, 3, 2, 2, 2, 347, 63, 3, 2, 2, 2, 348, 350, 5, 62, 32, 2, 349, 351, 5, 120, 61, 2, 350, 349, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 65, 3, 2, 2, 2, 352, 353, 5, 50, 26, 2, 353, 354, 7, 104, 2, 2, 354, 356, 3, 2, 2, 2, 355, 352, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 360, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, 360, 361, 5, 50, 26, 2, 361, 67, 3, 2, 2, 2, 362, 363, 5, 50, 26, 2, 363, 364, 5, 32, 17, 2, 364, 69, 3, 2, 2, 2, 365, 366, 5, 68, 35, 2, 366, 367, 7, 104, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 373, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 68, 35, 2, 374, 71, 3, 2, 2, 2, 375, 376, 7, 16, 2, 2, 376, 377, 7, 113, 2, 2, 377, 378, 7, 105, 2, 2, 378, 379, 5, 74, 38, 2, 379, 73, 3, 2, 2, 2, 380, 391, 7, 105, 2, 2, 381, 382, 7, 113, 2, 2, 382, 392, 5, 76, 39, 2, 383, 384, 7, 113, 2, 2, 384, 385, 7, 17, 2, 2, 385, 392, 7, 113, 2, 2, 386, 387, 7, 113, 2, 2, 387, 388, 7, 95, 2, 2, 388, 389, 5, 110, 56, 2, 389, 390, 7, 96, 2, 2, 390, 392, 3, 2, 2, 2, 391, 381, 3, 2, 2, 2, 391, 383, 3, 2, 2, 2, 391, 386, 3, 2, 2, 2, 392, 75, 3, 2, 2, 2, 393, 395, 7, 95, 2, 2, 394, 396, 5, 106, 54, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 399, 7, 101, 2, 2, 398, 400, 5, 106, 54, 2, 399, 398, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 403, 3, 2, 2, 2, 401, 402, 7, 101, 2, 2, 402, 404, 5, 106, 54, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 7, 96, 2, 2, 406, 77, 3, 2, 2, 2, 407, 408, 7, 18, 2, 2, 408, 409, 5, 80, 41, 2, 409, 410, 5, 82, 42, 2, 410, 79, 3, 2, 2, 2, 411, 417, 7, 113, 2, 2, 412, 414, 7, 99, 2, 2, 413, 415, 5, 70, 36, 2, 414, 413, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 418, 7, 100, 2, 2, 417, 412, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 420, 5, 26, 14, 2, 420, 81, 3, 2, 2, 2, 421, 425, 7, 97, 2, 2, 422, 424, 5, 84, 43, 2, 423, 422, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 7, 98, 2, 2, 429, 83, 3, 2, 2, 2, 430, 433, 5, 86, 44, 2, 431, 433, 5, 90, 46, 2, 432, 430, 3, 2, 2, 2, 432, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 435, 7, 102, 2, 2, 435, 85, 3, 2, 2, 2, 436, 440, 5, 96, 49, 2, 437, 440, 5, 88, 45, 2, 438, 440, 5, 92, 47, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, 3, 2, 2, 2, 440, 87, 3, 2, 2, 2, 441, 442, 7, 19, 2, 2, 442, 443, 5, 30, 16, 2, 443, 89, 3, 2, 2, 2, 444, 445, 5, 88, 45, 2, 445, 446, 7, 106, 2, 2, 446, 447, 5, 30, 16, 2, 447, 453, 3, 2, 2, 2, 448, 449, 5, 30, 16, 2, 449, 450, 7, 105, 2, 2, 450, 451, 5, 88, 45, 2, 451, 453, 3, 2, 2, 2, 452, 444, 3, 2, 2, 2, 452, 448, 3, 2, 2, 2, 453, 91, 3, 2, 2, 2, 454, 455, 7, 20, 2, 2, 455, 456, 5, 30, 16, 2, 456, 93, 3, 2, 2, 2, 457, 464, 7, 21, 2, 2, 458, 459, 7, 22, 2, 2, 459, 460, 7, 99, 2, 2, 460, 461, 7, 110, 2, 2, 461, 464, 7, 100, 2, 2, 462, 464, 7, 23, 2, 2, 463, 457, 3, 2, 2, 2, 463, 458, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 24, 2, 2, 466, 95, 3, 2, 2, 2, 467, 473, 5, 98, 50, 2, 468, 470, 7, 99, 2, 2, 469, 471, 5, 110, 56, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 7, 100, 2, 2, 473, 468, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 5, 30, 16, 2, 476, 97, 3, 2, 2, 2, 477, 485, 7, 25, 2, 2, 478, 485, 7, 26, 2, 2, 479, 485, 7, 27, 2, 2, 480, 485, 7, 113, 2, 2, 481, 482, 5, 94, 48, 2, 482, 483, 5, 98, 50, 2, 483, 485, 3, 2, 2, 2, 484, 477, 3, 2, 2, 2, 484, 478, 3, 2, 2, 2, 484, 479, 3, 2, 2, 2, 484, 480, 3, 2, 2, 2, 484, 481, 3, 2, 2, 2, 485, 99, 3, 2, 2, 2, 486, 487, 9, 6, 2, 2, 487, 101, 3, 2, 2, 2, 488, 489, 9, 7, 2, 2, 489, 103, 3, 2, 2, 2, 490, 491, 5, 106, 54, 2, 491, 492, 7, 102, 2, 2, 492, 496, 3, 2, 2, 2, 493, 494, 7, 48, 2, 2, 494, 496, 5, 104, 53, 2, 495, 490, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 496, 105, 3, 2, 2, 2, 497, 498, 8, 54, 1, 2, 498, 499, 5, 100, 51, 2, 499, 500, 5, 106, 54, 9, 500, 512, 3, 2, 2, 2, 501, 512, 5, 124, 63, 2, 502, 503, 5, 112, 57, 2, 503, 505, 7, 99, 2, 2, 504, 506, 5, 110, 56, 2, 505, 504, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 100, 2, 2, 508, 512, 3, 2, 2, 2, 509, 512, 5, 88, 45, 2, 510, 512, 5, 108, 55, 2, 511, 497, 3, 2, 2, 2, 511, 501, 3, 2, 2, 2, 511, 502, 3, 2, 2, 2, 511, 509, 3, 2, 2, 2, 511, 510, 3, 2, 2, 2, 512, 526, 3, 2, 2, 2, 513, 514, 12, 10, 2, 2, 514, 515, 5, 102, 52, 2, 515, 516, 5, 106, 54, 11, 516, 525, 3, 2, 2, 2, 517, 518, 12, 7, 2, 2, 518, 519, 7, 95, 2, 2, 519, 520, 5, 106, 54, 2, 520, 521, 7, 96, 2, 2, 521, 525, 3, 2, 2, 2, 522, 523, 12, 5, 2, 2, 523, 525, 5, 118, 60, 2, 524, 513, 3, 2, 2, 2, 524, 517, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 107, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 529, 536, 7, 107, 2, 2, 530, 536, 7, 110, 2, 2, 531, 536, 7, 112, 2, 2, 532, 536, 7, 113, 2, 2, 533, 536, 7, 114, 2, 2, 534, 536, 5, 152, 77, 2, 535, 529, 3, 2, 2, 2, 535, 530, 3, 2, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 109, 3, 2, 2, 2, 537, 538, 5, 106, 54, 2, 538, 539, 7, 104, 2, 2, 539, 541, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 541, 544, 3, 2, 2, 2, 542, 540, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 545, 3, 2, 2, 2, 544, 542, 3, 2, 2, 2, 545, 546, 5, 106, 54, 2, 546, 111, 3, 2, 2, 2, 547, 551, 7, 113, 2, 2, 548, 551, 5, 114, 58, 2, 549, 551, 5, 116, 59, 2, 550, 547, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 549, 3, 2, 2, 2, 551, 113, 3, 2, 2, 2, 552, 553, 9, 8, 2, 2, 553, 115, 3, 2, 2, 2, 554, 555, 5, 50, 26, 2, 555, 117, 3, 2, 2, 2, 556, 557, 9, 9, 2, 2, 557, 119, 3, 2, 2, 2, 558, 559, 5, 122, 62, 2, 559, 560, 5, 106, 54, 2, 560, 121, 3, 2, 2, 2, 561, 562, 9, 10, 2, 2, 562, 123, 3, 2, 2, 2, 563, 564, 7, 113, 2, 2, 564, 565, 7, 69, 2, 2, 565, 566, 5, 126, 64, 2, 566, 125, 3, 2, 2, 2, 567, 568, 7, 97, 2, 2, 568, 569, 5, 110, 56, 2, 569, 570, 7, 98, 2, 2, 570, 573, 3, 2, 2, 2, 571, 573, 5, 76, 39, 2, 572, 567, 3, 2, 2, 2, 572, 571, 3, 2, 2, 2, 573, 127, 3, 2, 2, 2, 574, 577, 5, 10, 6, 2, 575, 577, 5, 20, 11, 2, 576, 574, 3, 2, 2, 2, 576, 575, 3, 2, 2, 2, 577, 129, 3, 2, 2, 2, 578, 579, 7, 70, 2, 2, 579, 580, 7, 99, 2, 2, 580, 581, 5, 106, 54, 2, 581, 582, 7, 100, 2, 2, 582, 585, 5, 128, 65, 2, 583, 584, 7, 71, 2, 2, 584, 586, 5, 128, 65, 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 131, 3, 2, 2, 2, 587, 588, 7, 72, 2, 2, 588, 595, 5, 124, 63, 2, 589, 590, 7, 73, 2, 2, 590, 591, 7, 99, 2, 2, 591, 592, 5, 106, 54, 2, 592, 593, 7, 100, 2, 2, 593, 595, 3, 2, 2, 2, 594, 587, 3, 2, 2, 2, 594, 589, 3, 2, 2, 2, 595, 596, 3, 2, 2, 2, 596, 597, 5, 128, 65, 2, 597, 133, 3, 2, 2, 2, 598, 599, 5, 136, 69, 2, 599, 600, 7, 102, 2, 2, 600, 135, 3, 2, 2, 2, 601, 602, 9, 11, 2, 2, 602, 137, 3, 2, 2, 2, 603, 604, 7, 77, 2, 2, 604, 610, 7, 113, 2, 2, 605, 607, 7, 99, 2, 2, 606, 608, 5, 66, 34, 2, 607, 606, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 611, 7, 100, 2, 2, 610, 605, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 613, 3, 2, 2, 2, 612, 614, 5, 18, 10, 2, 613, 612, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 616, 3, 2, 2, 2, 615, 617, 5, 50, 26, 2, 616, 615, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 619, 7, 102, 2, 2, 619, 139, 3, 2, 2, 2, 620, 621, 7, 78, 2, 2, 621, 627, 7, 113, 2, 2, 622, 624, 7, 99, 2, 2, 623, 625, 5, 142, 72, 2, 624, 623, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 628, 7, 100, 2, 2, 627, 622, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 630, 3, 2, 2, 2, 629, 631, 5, 18, 10, 2, 630, 629, 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 633, 5, 20, 11, 2, 633, 141, 3, 2, 2, 2, 634, 637, 5, 70, 36, 2, 635, 637, 5, 40, 21, 2, 636, 634, 3, 2, 2, 2, 636, 635, 3, 2, 2, 2, 637, 143, 3, 2, 2, 2, 638, 639, 7, 79, 2, 2, 639, 640, 7, 97, 2, 2, 640, 641, 11, 2, 2, 2, 641, 642, 7, 98, 2, 2, 642, 145, 3, 2, 2, 2, 643, 644, 9, 12, 2, 2, 644, 147, 3, 2, 2, 2, 645, 651, 7, 85, 2, 2, 646, 648, 7, 86, 2, 2, 647, 649, 7, 110, 2, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 3, 2, 2, 2, 650, 645, 3, 2, 2, 2, 650, 646, 3, 2, 2, 2, 651, 149, 3, 2, 2, 2, 652, 653, 7, 87, 2, 2, 653, 654, 7, 113, 2, 2, 654, 660, 5, 82, 42, 2, 655, 656, 7, 88, 2, 2, 656, 657, 5, 146, 74, 2, 657, 658, 5, 82, 42, 2, 658, 660, 3, 2, 2, 2, 659, 652, 3, 2, 2, 2, 659, 655, 3, 2, 2, 2, 660, 151, 3, 2, 2, 2, 661, 664, 5, 154, 78, 2, 662, 664, 7, 89, 2, 2, 663, 661, 3, 2, 2, 2, 663, 662, 3, 2, 2, 2, 664, 153, 3, 2, 2, 2, 665, 667, 7, 113, 2, 2, 666, 668, 5, 146, 74, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 674, 3, 2, 2, 2, 669, 670, 7, 56, 2, 2, 670, 671, 7, 99, 2, 2, 671, 672, 7, 113, 2, 2, 672, 674, 7, 100, 2, 2, 673, 665, 3, 2, 2, 2, 673, 669, 3, 2, 2, 2, 674, 155, 3, 2, 2, 2, 675, 676, 9, 13, 2, 2, 676, 157, 3, 2, 2, 2, 677, 683, 5, 156, 79, 2, 678, 680, 7, 99, 2, 2, 679, 681, 5, 110, 56, 2, 680, 679, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 684, 7, 100, 2, 2, 683, 678, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 685, 3, 2, 2, 2, 685, 688, 5, 22, 12, 2, 686, 689, 5, 76, 39, 2, 687, 689, 5, 30, 16, 2, 688, 686, 3, 2, 2, 2, 688, 687, 3, 2, 2, 2, 689, 159, 3, 2, 2, 2, 690, 691, 5, 158, 80, 2, 691, 692, 7, 102, 2, 2, 692, 695, 3, 2, 2, 2, 693, 695, 5, 150, 76, 2, 694, 690, 3, 2, 2, 2, 694, 693, 3, 2, 2, 2, 695, 161, 3, 2, 2, 2, 696, 699, 5, 164, 83, 2, 697, 699, 5, 166, 84, 2, 698, 696, 3, 2, 2, 2, 698, 697, 3, 2, 2, 2, 699, 163, 3, 2, 2, 2, 700, 701, 7, 92, 2, 2, 701, 702, 5, 168, 85, 2, 702, 703, 7, 102, 2, 2, 703, 165, 3, 2, 2, 2, 704, 706, 7, 93, 2, 2, 705, 707, 5, 168, 85, 2, 706, 705, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 714, 7, 113, 2, 2, 709, 711, 7, 99, 2, 2, 710, 712, 5, 170, 86, 2, 711, 710, 3, 2, 2, 2, 711, 712, 3, 2, 2, 2, 712, 713, 3, 2, 2, 2, 713, 715, 7, 100, 2, 2, 714, 709, 3, 2, 2, 2, 714, 715, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 718, 5, 26, 14, 2, 717, 719, 5, 18, 10, 2, 718, 717, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 7, 97, 2, 2, 721, 722, 11, 2, 2, 2, 722, 723, 7, 98, 2, 2, 723, 167, 3, 2, 2, 2, 724, 725, 9, 14, 2, 2, 725, 169, 3, 2, 2, 2, 726, 729, 5, 70, 36, 2, 727, 729, 5, 110, 56, 2, 728, 726, 3, 2, 2, 2, 728, 727, 3, 2, 2, 2, 729, 171, 3, 2, 2, 2, 74, 176, 180, 185, 192, 211, 217, 222, 234, 252, 261, 268, 283, 292, 305, 309, 313, 318, 320, 346, 350, 357, 370, 391, 395, 399, 403, 414, 417, 425, 432, 439, 452, 463, 470, 473, 484, 495, 505, 511, 524, 526, 535, 542, 550, 572, 576, 585, 594, 607, 610, 613, 616, 624, 627, 630, 636, 648, 650, 659, 663, 667, 673, 680, 683, 688, 694, 698, 706, 711, 714, 718, 728] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 116, 732, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 3, 2, 3, 2, 7, 2, 175, 10, 2, 12, 2, 14, 2, 178, 11, 2, 3, 3, 5, 3, 181, 10, 3, 3, 3, 7, 3, 184, 10, 3, 12, 3, 14, 3, 187, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 193, 10, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 212, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 218, 10, 7, 3, 8, 3, 8, 3, 8, 5, 8, 223, 10, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 5, 11, 235, 10, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 7, 14, 251, 10, 14, 12, 14, 14, 14, 254, 11, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 262, 10, 15, 3, 16, 3, 16, 3, 16, 7, 16, 267, 10, 16, 12, 16, 14, 16, 270, 11, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 284, 10, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 7, 21, 291, 10, 21, 12, 21, 14, 21, 294, 11, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 306, 10, 25, 3, 26, 3, 26, 5, 26, 310, 10, 26, 3, 26, 3, 26, 5, 26, 314, 10, 26, 3, 26, 3, 26, 3, 26, 5, 26, 319, 10, 26, 5, 26, 321, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 5, 31, 342, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 348, 10, 32, 3, 33, 3, 33, 5, 33, 352, 10, 33, 3, 34, 3, 34, 3, 34, 7, 34, 357, 10, 34, 12, 34, 14, 34, 360, 11, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 7, 36, 370, 10, 36, 12, 36, 14, 36, 373, 11, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 393, 10, 38, 3, 39, 3, 39, 5, 39, 397, 10, 39, 3, 39, 3, 39, 5, 39, 401, 10, 39, 3, 39, 3, 39, 5, 39, 405, 10, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 5, 41, 416, 10, 41, 3, 41, 5, 41, 419, 10, 41, 3, 41, 3, 41, 3, 42, 3, 42, 7, 42, 425, 10, 42, 12, 42, 14, 42, 428, 11, 42, 3, 42, 3, 42, 3, 43, 3, 43, 5, 43, 434, 10, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 5, 44, 441, 10, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 5, 46, 454, 10, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 465, 10, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 5, 49, 472, 10, 49, 3, 49, 5, 49, 475, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 486, 10, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 497, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 507, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 513, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 526, 10, 54, 12, 54, 14, 54, 529, 11, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 537, 10, 55, 3, 56, 3, 56, 3, 56, 7, 56, 542, 10, 56, 12, 56, 14, 56, 545, 11, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 5, 57, 552, 10, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 5, 64, 574, 10, 64, 3, 65, 3, 65, 5, 65, 578, 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 5, 66, 587, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 596, 10, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 5, 70, 609, 10, 70, 3, 70, 5, 70, 612, 10, 70, 3, 70, 5, 70, 615, 10, 70, 3, 70, 5, 70, 618, 10, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 5, 71, 626, 10, 71, 3, 71, 5, 71, 629, 10, 71, 3, 71, 5, 71, 632, 10, 71, 3, 71, 3, 71, 3, 72, 3, 72, 5, 72, 638, 10, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 5, 75, 650, 10, 75, 5, 75, 652, 10, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 5, 76, 661, 10, 76, 3, 77, 3, 77, 5, 77, 665, 10, 77, 3, 78, 3, 78, 5, 78, 669, 10, 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 675, 10, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 5, 80, 682, 10, 80, 3, 80, 5, 80, 685, 10, 80, 3, 80, 3, 80, 3, 80, 5, 80, 690, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 696, 10, 81, 3, 82, 3, 82, 5, 82, 700, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 5, 84, 708, 10, 84, 3, 84, 3, 84, 3, 84, 5, 84, 713, 10, 84, 3, 84, 5, 84, 716, 10, 84, 3, 84, 3, 84, 5, 84, 720, 10, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 5, 86, 730, 10, 86, 3, 86, 2, 3, 106, 87, 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, 2, 15, 3, 2, 115, 116, 3, 2, 5, 6, 3, 2, 7, 8, 3, 2, 9, 12, 3, 2, 28, 29, 4, 2, 17, 17, 30, 47, 3, 2, 49, 56, 3, 2, 57, 58, 4, 2, 59, 68, 105, 106, 3, 2, 74, 76, 3, 2, 80, 84, 3, 2, 90, 91, 4, 2, 94, 94, 113, 113, 2, 752, 2, 172, 3, 2, 2, 2, 4, 180, 3, 2, 2, 2, 6, 188, 3, 2, 2, 2, 8, 196, 3, 2, 2, 2, 10, 211, 3, 2, 2, 2, 12, 217, 3, 2, 2, 2, 14, 222, 3, 2, 2, 2, 16, 226, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 231, 3, 2, 2, 2, 22, 238, 3, 2, 2, 2, 24, 242, 3, 2, 2, 2, 26, 252, 3, 2, 2, 2, 28, 257, 3, 2, 2, 2, 30, 268, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 276, 3, 2, 2, 2, 36, 278, 3, 2, 2, 2, 38, 281, 3, 2, 2, 2, 40, 292, 3, 2, 2, 2, 42, 297, 3, 2, 2, 2, 44, 299, 3, 2, 2, 2, 46, 301, 3, 2, 2, 2, 48, 305, 3, 2, 2, 2, 50, 320, 3, 2, 2, 2, 52, 322, 3, 2, 2, 2, 54, 327, 3, 2, 2, 2, 56, 331, 3, 2, 2, 2, 58, 335, 3, 2, 2, 2, 60, 338, 3, 2, 2, 2, 62, 347, 3, 2, 2, 2, 64, 349, 3, 2, 2, 2, 66, 358, 3, 2, 2, 2, 68, 363, 3, 2, 2, 2, 70, 371, 3, 2, 2, 2, 72, 376, 3, 2, 2, 2, 74, 381, 3, 2, 2, 2, 76, 394, 3, 2, 2, 2, 78, 408, 3, 2, 2, 2, 80, 412, 3, 2, 2, 2, 82, 422, 3, 2, 2, 2, 84, 433, 3, 2, 2, 2, 86, 440, 3, 2, 2, 2, 88, 442, 3, 2, 2, 2, 90, 453, 3, 2, 2, 2, 92, 455, 3, 2, 2, 2, 94, 464, 3, 2, 2, 2, 96, 468, 3, 2, 2, 2, 98, 485, 3, 2, 2, 2, 100, 487, 3, 2, 2, 2, 102, 489, 3, 2, 2, 2, 104, 496, 3, 2, 2, 2, 106, 512, 3, 2, 2, 2, 108, 536, 3, 2, 2, 2, 110, 543, 3, 2, 2, 2, 112, 551, 3, 2, 2, 2, 114, 553, 3, 2, 2, 2, 116, 555, 3, 2, 2, 2, 118, 557, 3, 2, 2, 2, 120, 559, 3, 2, 2, 2, 122, 562, 3, 2, 2, 2, 124, 564, 3, 2, 2, 2, 126, 573, 3, 2, 2, 2, 128, 577, 3, 2, 2, 2, 130, 579, 3, 2, 2, 2, 132, 595, 3, 2, 2, 2, 134, 599, 3, 2, 2, 2, 136, 602, 3, 2, 2, 2, 138, 604, 3, 2, 2, 2, 140, 621, 3, 2, 2, 2, 142, 637, 3, 2, 2, 2, 144, 639, 3, 2, 2, 2, 146, 644, 3, 2, 2, 2, 148, 651, 3, 2, 2, 2, 150, 660, 3, 2, 2, 2, 152, 664, 3, 2, 2, 2, 154, 674, 3, 2, 2, 2, 156, 676, 3, 2, 2, 2, 158, 678, 3, 2, 2, 2, 160, 695, 3, 2, 2, 2, 162, 699, 3, 2, 2, 2, 164, 701, 3, 2, 2, 2, 166, 705, 3, 2, 2, 2, 168, 725, 3, 2, 2, 2, 170, 729, 3, 2, 2, 2, 172, 176, 5, 4, 3, 2, 173, 175, 5, 10, 6, 2, 174, 173, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 3, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, 6, 4, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 185, 3, 2, 2, 2, 182, 184, 5, 8, 5, 2, 183, 182, 3, 2, 2, 2, 184, 187, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 5, 3, 2, 2, 2, 187, 185, 3, 2, 2, 2, 188, 189, 7, 3, 2, 2, 189, 192, 7, 110, 2, 2, 190, 191, 7, 103, 2, 2, 191, 193, 7, 110, 2, 2, 192, 190, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 102, 2, 2, 195, 7, 3, 2, 2, 2, 196, 197, 7, 4, 2, 2, 197, 198, 7, 114, 2, 2, 198, 199, 7, 102, 2, 2, 199, 9, 3, 2, 2, 2, 200, 212, 5, 12, 7, 2, 201, 212, 5, 104, 53, 2, 202, 212, 5, 14, 8, 2, 203, 212, 5, 130, 66, 2, 204, 212, 5, 132, 67, 2, 205, 212, 5, 134, 68, 2, 206, 212, 5, 72, 37, 2, 207, 212, 5, 84, 43, 2, 208, 212, 5, 160, 81, 2, 209, 212, 5, 144, 73, 2, 210, 212, 5, 16, 9, 2, 211, 200, 3, 2, 2, 2, 211, 201, 3, 2, 2, 2, 211, 202, 3, 2, 2, 2, 211, 203, 3, 2, 2, 2, 211, 204, 3, 2, 2, 2, 211, 205, 3, 2, 2, 2, 211, 206, 3, 2, 2, 2, 211, 207, 3, 2, 2, 2, 211, 208, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 210, 3, 2, 2, 2, 212, 11, 3, 2, 2, 2, 213, 218, 5, 140, 71, 2, 214, 218, 5, 138, 70, 2, 215, 218, 5, 78, 40, 2, 216, 218, 5, 166, 84, 2, 217, 213, 3, 2, 2, 2, 217, 214, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 217, 216, 3, 2, 2, 2, 218, 13, 3, 2, 2, 2, 219, 223, 5, 36, 19, 2, 220, 223, 5, 64, 33, 2, 221, 223, 5, 52, 27, 2, 222, 219, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, 222, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 7, 102, 2, 2, 225, 15, 3, 2, 2, 2, 226, 227, 9, 2, 2, 2, 227, 17, 3, 2, 2, 2, 228, 229, 7, 106, 2, 2, 229, 230, 5, 64, 33, 2, 230, 19, 3, 2, 2, 2, 231, 234, 7, 97, 2, 2, 232, 235, 5, 20, 11, 2, 233, 235, 5, 10, 6, 2, 234, 232, 3, 2, 2, 2, 234, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 237, 7, 98, 2, 2, 237, 21, 3, 2, 2, 2, 238, 239, 7, 95, 2, 2, 239, 240, 5, 106, 54, 2, 240, 241, 7, 96, 2, 2, 241, 23, 3, 2, 2, 2, 242, 243, 7, 95, 2, 2, 243, 244, 5, 106, 54, 2, 244, 245, 7, 104, 2, 2, 245, 246, 5, 106, 54, 2, 246, 247, 7, 96, 2, 2, 247, 25, 3, 2, 2, 2, 248, 249, 7, 113, 2, 2, 249, 251, 7, 104, 2, 2, 250, 248, 3, 2, 2, 2, 251, 254, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 255, 3, 2, 2, 2, 254, 252, 3, 2, 2, 2, 255, 256, 7, 113, 2, 2, 256, 27, 3, 2, 2, 2, 257, 261, 7, 113, 2, 2, 258, 262, 5, 22, 12, 2, 259, 262, 5, 24, 13, 2, 260, 262, 5, 76, 39, 2, 261, 258, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 29, 3, 2, 2, 2, 263, 264, 5, 28, 15, 2, 264, 265, 7, 104, 2, 2, 265, 267, 3, 2, 2, 2, 266, 263, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 268, 3, 2, 2, 2, 271, 272, 5, 28, 15, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 101, 2, 2, 274, 275, 7, 113, 2, 2, 275, 33, 3, 2, 2, 2, 276, 277, 9, 3, 2, 2, 277, 35, 3, 2, 2, 2, 278, 279, 5, 34, 18, 2, 279, 280, 5, 30, 16, 2, 280, 37, 3, 2, 2, 2, 281, 283, 5, 34, 18, 2, 282, 284, 5, 22, 12, 2, 283, 282, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 286, 5, 32, 17, 2, 286, 39, 3, 2, 2, 2, 287, 288, 5, 38, 20, 2, 288, 289, 7, 104, 2, 2, 289, 291, 3, 2, 2, 2, 290, 287, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 295, 296, 5, 38, 20, 2, 296, 41, 3, 2, 2, 2, 297, 298, 9, 4, 2, 2, 298, 43, 3, 2, 2, 2, 299, 300, 9, 5, 2, 2, 300, 45, 3, 2, 2, 2, 301, 302, 7, 13, 2, 2, 302, 47, 3, 2, 2, 2, 303, 306, 7, 14, 2, 2, 304, 306, 5, 148, 75, 2, 305, 303, 3, 2, 2, 2, 305, 304, 3, 2, 2, 2, 306, 49, 3, 2, 2, 2, 307, 309, 5, 44, 23, 2, 308, 310, 5, 22, 12, 2, 309, 308, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 321, 3, 2, 2, 2, 311, 313, 5, 46, 24, 2, 312, 314, 5, 24, 13, 2, 313, 312, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 321, 3, 2, 2, 2, 315, 321, 5, 48, 25, 2, 316, 318, 5, 42, 22, 2, 317, 319, 5, 22, 12, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 321, 3, 2, 2, 2, 320, 307, 3, 2, 2, 2, 320, 311, 3, 2, 2, 2, 320, 315, 3, 2, 2, 2, 320, 316, 3, 2, 2, 2, 321, 51, 3, 2, 2, 2, 322, 323, 7, 15, 2, 2, 323, 324, 7, 113, 2, 2, 324, 325, 7, 105, 2, 2, 325, 326, 5, 106, 54, 2, 326, 53, 3, 2, 2, 2, 327, 328, 5, 44, 23, 2, 328, 329, 5, 22, 12, 2, 329, 330, 7, 113, 2, 2, 330, 55, 3, 2, 2, 2, 331, 332, 5, 46, 24, 2, 332, 333, 5, 24, 13, 2, 333, 334, 7, 113, 2, 2, 334, 57, 3, 2, 2, 2, 335, 336, 5, 48, 25, 2, 336, 337, 7, 113, 2, 2, 337, 59, 3, 2, 2, 2, 338, 339, 5, 42, 22, 2, 339, 341, 7, 113, 2, 2, 340, 342, 5, 22, 12, 2, 341, 340, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 61, 3, 2, 2, 2, 343, 348, 5, 54, 28, 2, 344, 348, 5, 56, 29, 2, 345, 348, 5, 58, 30, 2, 346, 348, 5, 60, 31, 2, 347, 343, 3, 2, 2, 2, 347, 344, 3, 2, 2, 2, 347, 345, 3, 2, 2, 2, 347, 346, 3, 2, 2, 2, 348, 63, 3, 2, 2, 2, 349, 351, 5, 62, 32, 2, 350, 352, 5, 120, 61, 2, 351, 350, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 65, 3, 2, 2, 2, 353, 354, 5, 50, 26, 2, 354, 355, 7, 104, 2, 2, 355, 357, 3, 2, 2, 2, 356, 353, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 362, 5, 50, 26, 2, 362, 67, 3, 2, 2, 2, 363, 364, 5, 50, 26, 2, 364, 365, 5, 32, 17, 2, 365, 69, 3, 2, 2, 2, 366, 367, 5, 68, 35, 2, 367, 368, 7, 104, 2, 2, 368, 370, 3, 2, 2, 2, 369, 366, 3, 2, 2, 2, 370, 373, 3, 2, 2, 2, 371, 369, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 374, 3, 2, 2, 2, 373, 371, 3, 2, 2, 2, 374, 375, 5, 68, 35, 2, 375, 71, 3, 2, 2, 2, 376, 377, 7, 16, 2, 2, 377, 378, 7, 113, 2, 2, 378, 379, 7, 105, 2, 2, 379, 380, 5, 74, 38, 2, 380, 73, 3, 2, 2, 2, 381, 392, 7, 105, 2, 2, 382, 383, 7, 113, 2, 2, 383, 393, 5, 76, 39, 2, 384, 385, 7, 113, 2, 2, 385, 386, 7, 17, 2, 2, 386, 393, 7, 113, 2, 2, 387, 388, 7, 113, 2, 2, 388, 389, 7, 95, 2, 2, 389, 390, 5, 110, 56, 2, 390, 391, 7, 96, 2, 2, 391, 393, 3, 2, 2, 2, 392, 382, 3, 2, 2, 2, 392, 384, 3, 2, 2, 2, 392, 387, 3, 2, 2, 2, 393, 75, 3, 2, 2, 2, 394, 396, 7, 95, 2, 2, 395, 397, 5, 106, 54, 2, 396, 395, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 400, 7, 101, 2, 2, 399, 401, 5, 106, 54, 2, 400, 399, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 403, 7, 101, 2, 2, 403, 405, 5, 106, 54, 2, 404, 402, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 407, 7, 96, 2, 2, 407, 77, 3, 2, 2, 2, 408, 409, 7, 18, 2, 2, 409, 410, 5, 80, 41, 2, 410, 411, 5, 82, 42, 2, 411, 79, 3, 2, 2, 2, 412, 418, 7, 113, 2, 2, 413, 415, 7, 99, 2, 2, 414, 416, 5, 70, 36, 2, 415, 414, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 419, 7, 100, 2, 2, 418, 413, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 421, 5, 26, 14, 2, 421, 81, 3, 2, 2, 2, 422, 426, 7, 97, 2, 2, 423, 425, 5, 84, 43, 2, 424, 423, 3, 2, 2, 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 430, 7, 98, 2, 2, 430, 83, 3, 2, 2, 2, 431, 434, 5, 86, 44, 2, 432, 434, 5, 90, 46, 2, 433, 431, 3, 2, 2, 2, 433, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 7, 102, 2, 2, 436, 85, 3, 2, 2, 2, 437, 441, 5, 96, 49, 2, 438, 441, 5, 88, 45, 2, 439, 441, 5, 92, 47, 2, 440, 437, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 439, 3, 2, 2, 2, 441, 87, 3, 2, 2, 2, 442, 443, 7, 19, 2, 2, 443, 444, 5, 30, 16, 2, 444, 89, 3, 2, 2, 2, 445, 446, 5, 88, 45, 2, 446, 447, 7, 106, 2, 2, 447, 448, 5, 30, 16, 2, 448, 454, 3, 2, 2, 2, 449, 450, 5, 30, 16, 2, 450, 451, 7, 105, 2, 2, 451, 452, 5, 88, 45, 2, 452, 454, 3, 2, 2, 2, 453, 445, 3, 2, 2, 2, 453, 449, 3, 2, 2, 2, 454, 91, 3, 2, 2, 2, 455, 456, 7, 20, 2, 2, 456, 457, 5, 30, 16, 2, 457, 93, 3, 2, 2, 2, 458, 465, 7, 21, 2, 2, 459, 460, 7, 22, 2, 2, 460, 461, 7, 99, 2, 2, 461, 462, 7, 110, 2, 2, 462, 465, 7, 100, 2, 2, 463, 465, 7, 23, 2, 2, 464, 458, 3, 2, 2, 2, 464, 459, 3, 2, 2, 2, 464, 463, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 24, 2, 2, 467, 95, 3, 2, 2, 2, 468, 474, 5, 98, 50, 2, 469, 471, 7, 99, 2, 2, 470, 472, 5, 110, 56, 2, 471, 470, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 475, 7, 100, 2, 2, 474, 469, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 5, 30, 16, 2, 477, 97, 3, 2, 2, 2, 478, 486, 7, 25, 2, 2, 479, 486, 7, 26, 2, 2, 480, 486, 7, 27, 2, 2, 481, 486, 7, 113, 2, 2, 482, 483, 5, 94, 48, 2, 483, 484, 5, 98, 50, 2, 484, 486, 3, 2, 2, 2, 485, 478, 3, 2, 2, 2, 485, 479, 3, 2, 2, 2, 485, 480, 3, 2, 2, 2, 485, 481, 3, 2, 2, 2, 485, 482, 3, 2, 2, 2, 486, 99, 3, 2, 2, 2, 487, 488, 9, 6, 2, 2, 488, 101, 3, 2, 2, 2, 489, 490, 9, 7, 2, 2, 490, 103, 3, 2, 2, 2, 491, 492, 5, 106, 54, 2, 492, 493, 7, 102, 2, 2, 493, 497, 3, 2, 2, 2, 494, 495, 7, 48, 2, 2, 495, 497, 5, 104, 53, 2, 496, 491, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 497, 105, 3, 2, 2, 2, 498, 499, 8, 54, 1, 2, 499, 500, 5, 100, 51, 2, 500, 501, 5, 106, 54, 9, 501, 513, 3, 2, 2, 2, 502, 513, 5, 124, 63, 2, 503, 504, 5, 112, 57, 2, 504, 506, 7, 99, 2, 2, 505, 507, 5, 110, 56, 2, 506, 505, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 100, 2, 2, 509, 513, 3, 2, 2, 2, 510, 513, 5, 88, 45, 2, 511, 513, 5, 108, 55, 2, 512, 498, 3, 2, 2, 2, 512, 502, 3, 2, 2, 2, 512, 503, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 511, 3, 2, 2, 2, 513, 527, 3, 2, 2, 2, 514, 515, 12, 10, 2, 2, 515, 516, 5, 102, 52, 2, 516, 517, 5, 106, 54, 11, 517, 526, 3, 2, 2, 2, 518, 519, 12, 7, 2, 2, 519, 520, 7, 95, 2, 2, 520, 521, 5, 106, 54, 2, 521, 522, 7, 96, 2, 2, 522, 526, 3, 2, 2, 2, 523, 524, 12, 5, 2, 2, 524, 526, 5, 118, 60, 2, 525, 514, 3, 2, 2, 2, 525, 518, 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 107, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 537, 7, 107, 2, 2, 531, 537, 7, 110, 2, 2, 532, 537, 7, 112, 2, 2, 533, 537, 7, 113, 2, 2, 534, 537, 7, 114, 2, 2, 535, 537, 5, 152, 77, 2, 536, 530, 3, 2, 2, 2, 536, 531, 3, 2, 2, 2, 536, 532, 3, 2, 2, 2, 536, 533, 3, 2, 2, 2, 536, 534, 3, 2, 2, 2, 536, 535, 3, 2, 2, 2, 537, 109, 3, 2, 2, 2, 538, 539, 5, 106, 54, 2, 539, 540, 7, 104, 2, 2, 540, 542, 3, 2, 2, 2, 541, 538, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 546, 547, 5, 106, 54, 2, 547, 111, 3, 2, 2, 2, 548, 552, 7, 113, 2, 2, 549, 552, 5, 114, 58, 2, 550, 552, 5, 116, 59, 2, 551, 548, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 551, 550, 3, 2, 2, 2, 552, 113, 3, 2, 2, 2, 553, 554, 9, 8, 2, 2, 554, 115, 3, 2, 2, 2, 555, 556, 5, 50, 26, 2, 556, 117, 3, 2, 2, 2, 557, 558, 9, 9, 2, 2, 558, 119, 3, 2, 2, 2, 559, 560, 5, 122, 62, 2, 560, 561, 5, 106, 54, 2, 561, 121, 3, 2, 2, 2, 562, 563, 9, 10, 2, 2, 563, 123, 3, 2, 2, 2, 564, 565, 7, 113, 2, 2, 565, 566, 7, 69, 2, 2, 566, 567, 5, 126, 64, 2, 567, 125, 3, 2, 2, 2, 568, 569, 7, 97, 2, 2, 569, 570, 5, 110, 56, 2, 570, 571, 7, 98, 2, 2, 571, 574, 3, 2, 2, 2, 572, 574, 5, 76, 39, 2, 573, 568, 3, 2, 2, 2, 573, 572, 3, 2, 2, 2, 574, 127, 3, 2, 2, 2, 575, 578, 5, 10, 6, 2, 576, 578, 5, 20, 11, 2, 577, 575, 3, 2, 2, 2, 577, 576, 3, 2, 2, 2, 578, 129, 3, 2, 2, 2, 579, 580, 7, 70, 2, 2, 580, 581, 7, 99, 2, 2, 581, 582, 5, 106, 54, 2, 582, 583, 7, 100, 2, 2, 583, 586, 5, 128, 65, 2, 584, 585, 7, 71, 2, 2, 585, 587, 5, 128, 65, 2, 586, 584, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 131, 3, 2, 2, 2, 588, 589, 7, 72, 2, 2, 589, 596, 5, 124, 63, 2, 590, 591, 7, 73, 2, 2, 591, 592, 7, 99, 2, 2, 592, 593, 5, 106, 54, 2, 593, 594, 7, 100, 2, 2, 594, 596, 3, 2, 2, 2, 595, 588, 3, 2, 2, 2, 595, 590, 3, 2, 2, 2, 596, 597, 3, 2, 2, 2, 597, 598, 5, 128, 65, 2, 598, 133, 3, 2, 2, 2, 599, 600, 5, 136, 69, 2, 600, 601, 7, 102, 2, 2, 601, 135, 3, 2, 2, 2, 602, 603, 9, 11, 2, 2, 603, 137, 3, 2, 2, 2, 604, 605, 7, 77, 2, 2, 605, 611, 7, 113, 2, 2, 606, 608, 7, 99, 2, 2, 607, 609, 5, 66, 34, 2, 608, 607, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 7, 100, 2, 2, 611, 606, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 614, 3, 2, 2, 2, 613, 615, 5, 18, 10, 2, 614, 613, 3, 2, 2, 2, 614, 615, 3, 2, 2, 2, 615, 617, 3, 2, 2, 2, 616, 618, 5, 50, 26, 2, 617, 616, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 620, 7, 102, 2, 2, 620, 139, 3, 2, 2, 2, 621, 622, 7, 78, 2, 2, 622, 628, 7, 113, 2, 2, 623, 625, 7, 99, 2, 2, 624, 626, 5, 142, 72, 2, 625, 624, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 627, 3, 2, 2, 2, 627, 629, 7, 100, 2, 2, 628, 623, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 631, 3, 2, 2, 2, 630, 632, 5, 18, 10, 2, 631, 630, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 633, 3, 2, 2, 2, 633, 634, 5, 20, 11, 2, 634, 141, 3, 2, 2, 2, 635, 638, 5, 70, 36, 2, 636, 638, 5, 40, 21, 2, 637, 635, 3, 2, 2, 2, 637, 636, 3, 2, 2, 2, 638, 143, 3, 2, 2, 2, 639, 640, 7, 79, 2, 2, 640, 641, 7, 97, 2, 2, 641, 642, 11, 2, 2, 2, 642, 643, 7, 98, 2, 2, 643, 145, 3, 2, 2, 2, 644, 645, 9, 12, 2, 2, 645, 147, 3, 2, 2, 2, 646, 652, 7, 85, 2, 2, 647, 649, 7, 86, 2, 2, 648, 650, 7, 110, 2, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 3, 2, 2, 2, 651, 646, 3, 2, 2, 2, 651, 647, 3, 2, 2, 2, 652, 149, 3, 2, 2, 2, 653, 654, 7, 87, 2, 2, 654, 655, 7, 113, 2, 2, 655, 661, 5, 82, 42, 2, 656, 657, 7, 88, 2, 2, 657, 658, 5, 146, 74, 2, 658, 659, 5, 82, 42, 2, 659, 661, 3, 2, 2, 2, 660, 653, 3, 2, 2, 2, 660, 656, 3, 2, 2, 2, 661, 151, 3, 2, 2, 2, 662, 665, 5, 154, 78, 2, 663, 665, 7, 89, 2, 2, 664, 662, 3, 2, 2, 2, 664, 663, 3, 2, 2, 2, 665, 153, 3, 2, 2, 2, 666, 668, 7, 113, 2, 2, 667, 669, 5, 146, 74, 2, 668, 667, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 675, 3, 2, 2, 2, 670, 671, 7, 56, 2, 2, 671, 672, 7, 99, 2, 2, 672, 673, 7, 113, 2, 2, 673, 675, 7, 100, 2, 2, 674, 666, 3, 2, 2, 2, 674, 670, 3, 2, 2, 2, 675, 155, 3, 2, 2, 2, 676, 677, 9, 13, 2, 2, 677, 157, 3, 2, 2, 2, 678, 684, 5, 156, 79, 2, 679, 681, 7, 99, 2, 2, 680, 682, 5, 110, 56, 2, 681, 680, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 685, 7, 100, 2, 2, 684, 679, 3, 2, 2, 2, 684, 685, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 689, 5, 22, 12, 2, 687, 690, 5, 76, 39, 2, 688, 690, 5, 30, 16, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, 159, 3, 2, 2, 2, 691, 692, 5, 158, 80, 2, 692, 693, 7, 102, 2, 2, 693, 696, 3, 2, 2, 2, 694, 696, 5, 150, 76, 2, 695, 691, 3, 2, 2, 2, 695, 694, 3, 2, 2, 2, 696, 161, 3, 2, 2, 2, 697, 700, 5, 164, 83, 2, 698, 700, 5, 166, 84, 2, 699, 697, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 163, 3, 2, 2, 2, 701, 702, 7, 92, 2, 2, 702, 703, 5, 168, 85, 2, 703, 704, 7, 102, 2, 2, 704, 165, 3, 2, 2, 2, 705, 707, 7, 93, 2, 2, 706, 708, 5, 168, 85, 2, 707, 706, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 715, 7, 113, 2, 2, 710, 712, 7, 99, 2, 2, 711, 713, 5, 170, 86, 2, 712, 711, 3, 2, 2, 2, 712, 713, 3, 2, 2, 2, 713, 714, 3, 2, 2, 2, 714, 716, 7, 100, 2, 2, 715, 710, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 717, 3, 2, 2, 2, 717, 719, 5, 26, 14, 2, 718, 720, 5, 18, 10, 2, 719, 718, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 722, 7, 97, 2, 2, 722, 723, 11, 2, 2, 2, 723, 724, 7, 98, 2, 2, 724, 167, 3, 2, 2, 2, 725, 726, 9, 14, 2, 2, 726, 169, 3, 2, 2, 2, 727, 730, 5, 70, 36, 2, 728, 730, 5, 110, 56, 2, 729, 727, 3, 2, 2, 2, 729, 728, 3, 2, 2, 2, 730, 171, 3, 2, 2, 2, 75, 176, 180, 185, 192, 211, 217, 222, 234, 252, 261, 268, 283, 292, 305, 309, 313, 318, 320, 341, 347, 351, 358, 371, 392, 396, 400, 404, 415, 418, 426, 433, 440, 453, 464, 471, 474, 485, 496, 506, 512, 525, 527, 536, 543, 551, 573, 577, 586, 595, 608, 611, 614, 617, 625, 628, 631, 637, 649, 651, 660, 664, 668, 674, 681, 684, 689, 695, 699, 707, 712, 715, 719, 729] \ No newline at end of file diff --git a/internal/qasm3/qasm3_base_listener.go b/internal/qasm3/qasm3_base_listener.go index fe7a97e..4ef35e5 100644 --- a/internal/qasm3/qasm3_base_listener.go +++ b/internal/qasm3/qasm3_base_listener.go @@ -1,7 +1,6 @@ // Code generated from ./qasm3.g4 by ANTLR 4.9. DO NOT EDIT. -package parser // qasm3 - +package qasm3 // qasm3 import "github.com/antlr/antlr4/runtime/Go/antlr" // Baseqasm3Listener is a complete listener for a parse tree produced by qasm3Parser. diff --git a/internal/qasm3/qasm3_lexer.go b/internal/qasm3/qasm3_lexer.go index 0d6e7c6..405d3cc 100644 --- a/internal/qasm3/qasm3_lexer.go +++ b/internal/qasm3/qasm3_lexer.go @@ -1,6 +1,6 @@ // Code generated from ./qasm3.g4 by ANTLR 4.9. DO NOT EDIT. -package parser +package qasm3 import ( "fmt" diff --git a/internal/qasm3/qasm3_listener.go b/internal/qasm3/qasm3_listener.go index 528aab6..af93dd0 100644 --- a/internal/qasm3/qasm3_listener.go +++ b/internal/qasm3/qasm3_listener.go @@ -1,7 +1,6 @@ // Code generated from ./qasm3.g4 by ANTLR 4.9. DO NOT EDIT. -package parser // qasm3 - +package qasm3 // qasm3 import "github.com/antlr/antlr4/runtime/Go/antlr" // qasm3Listener is a complete listener for a parse tree produced by qasm3Parser. diff --git a/internal/qasm3/qasm3_parser.go b/internal/qasm3/qasm3_parser.go index c977525..f3bbda8 100644 --- a/internal/qasm3/qasm3_parser.go +++ b/internal/qasm3/qasm3_parser.go @@ -1,7 +1,6 @@ // Code generated from ./qasm3.g4 by ANTLR 4.9. DO NOT EDIT. -package parser // qasm3 - +package qasm3 // qasm3 import ( "fmt" "reflect" @@ -16,7 +15,7 @@ var _ = reflect.Copy var _ = strconv.Itoa var parserATN = []uint16{ - 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 116, 731, + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 116, 732, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, @@ -50,296 +49,298 @@ var parserATN = []uint16{ 26, 5, 26, 310, 10, 26, 3, 26, 3, 26, 5, 26, 314, 10, 26, 3, 26, 3, 26, 3, 26, 5, 26, 319, 10, 26, 5, 26, 321, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, - 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 5, - 32, 347, 10, 32, 3, 33, 3, 33, 5, 33, 351, 10, 33, 3, 34, 3, 34, 3, 34, - 7, 34, 356, 10, 34, 12, 34, 14, 34, 359, 11, 34, 3, 34, 3, 34, 3, 35, 3, - 35, 3, 35, 3, 36, 3, 36, 3, 36, 7, 36, 369, 10, 36, 12, 36, 14, 36, 372, - 11, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, - 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 392, - 10, 38, 3, 39, 3, 39, 5, 39, 396, 10, 39, 3, 39, 3, 39, 5, 39, 400, 10, - 39, 3, 39, 3, 39, 5, 39, 404, 10, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, - 3, 40, 3, 41, 3, 41, 3, 41, 5, 41, 415, 10, 41, 3, 41, 5, 41, 418, 10, - 41, 3, 41, 3, 41, 3, 42, 3, 42, 7, 42, 424, 10, 42, 12, 42, 14, 42, 427, - 11, 42, 3, 42, 3, 42, 3, 43, 3, 43, 5, 43, 433, 10, 43, 3, 43, 3, 43, 3, - 44, 3, 44, 3, 44, 5, 44, 440, 10, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, - 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 5, 46, 453, 10, 46, 3, 47, 3, - 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 464, 10, 48, - 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 5, 49, 471, 10, 49, 3, 49, 5, 49, 474, - 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, - 5, 50, 485, 10, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, - 53, 3, 53, 5, 53, 496, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, - 3, 54, 3, 54, 5, 54, 506, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 512, - 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, - 3, 54, 3, 54, 7, 54, 525, 10, 54, 12, 54, 14, 54, 528, 11, 54, 3, 55, 3, - 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 536, 10, 55, 3, 56, 3, 56, 3, 56, - 7, 56, 541, 10, 56, 12, 56, 14, 56, 544, 11, 56, 3, 56, 3, 56, 3, 57, 3, - 57, 3, 57, 5, 57, 551, 10, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, - 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, - 64, 3, 64, 3, 64, 3, 64, 5, 64, 573, 10, 64, 3, 65, 3, 65, 5, 65, 577, - 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 5, 66, 586, 10, - 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 595, 10, 67, - 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, - 70, 5, 70, 608, 10, 70, 3, 70, 5, 70, 611, 10, 70, 3, 70, 5, 70, 614, 10, - 70, 3, 70, 5, 70, 617, 10, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, - 5, 71, 625, 10, 71, 3, 71, 5, 71, 628, 10, 71, 3, 71, 5, 71, 631, 10, 71, - 3, 71, 3, 71, 3, 72, 3, 72, 5, 72, 637, 10, 72, 3, 73, 3, 73, 3, 73, 3, - 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 5, 75, 649, 10, 75, 5, 75, - 651, 10, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 5, 76, 660, - 10, 76, 3, 77, 3, 77, 5, 77, 664, 10, 77, 3, 78, 3, 78, 5, 78, 668, 10, - 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 674, 10, 78, 3, 79, 3, 79, 3, 80, - 3, 80, 3, 80, 5, 80, 681, 10, 80, 3, 80, 5, 80, 684, 10, 80, 3, 80, 3, - 80, 3, 80, 5, 80, 689, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 695, - 10, 81, 3, 82, 3, 82, 5, 82, 699, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, - 84, 3, 84, 5, 84, 707, 10, 84, 3, 84, 3, 84, 3, 84, 5, 84, 712, 10, 84, - 3, 84, 5, 84, 715, 10, 84, 3, 84, 3, 84, 5, 84, 719, 10, 84, 3, 84, 3, - 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 5, 86, 729, 10, 86, 3, 86, - 2, 3, 106, 87, 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, 2, 15, 3, 2, 115, 116, 3, 2, 5, 6, 3, 2, 7, 8, 3, 2, - 9, 12, 3, 2, 28, 29, 4, 2, 17, 17, 30, 47, 3, 2, 49, 56, 3, 2, 57, 58, - 4, 2, 59, 68, 105, 106, 3, 2, 74, 76, 3, 2, 80, 84, 3, 2, 90, 91, 4, 2, - 94, 94, 113, 113, 2, 750, 2, 172, 3, 2, 2, 2, 4, 180, 3, 2, 2, 2, 6, 188, - 3, 2, 2, 2, 8, 196, 3, 2, 2, 2, 10, 211, 3, 2, 2, 2, 12, 217, 3, 2, 2, - 2, 14, 222, 3, 2, 2, 2, 16, 226, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 231, - 3, 2, 2, 2, 22, 238, 3, 2, 2, 2, 24, 242, 3, 2, 2, 2, 26, 252, 3, 2, 2, - 2, 28, 257, 3, 2, 2, 2, 30, 268, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 276, - 3, 2, 2, 2, 36, 278, 3, 2, 2, 2, 38, 281, 3, 2, 2, 2, 40, 292, 3, 2, 2, - 2, 42, 297, 3, 2, 2, 2, 44, 299, 3, 2, 2, 2, 46, 301, 3, 2, 2, 2, 48, 305, - 3, 2, 2, 2, 50, 320, 3, 2, 2, 2, 52, 322, 3, 2, 2, 2, 54, 327, 3, 2, 2, - 2, 56, 331, 3, 2, 2, 2, 58, 335, 3, 2, 2, 2, 60, 338, 3, 2, 2, 2, 62, 346, - 3, 2, 2, 2, 64, 348, 3, 2, 2, 2, 66, 357, 3, 2, 2, 2, 68, 362, 3, 2, 2, - 2, 70, 370, 3, 2, 2, 2, 72, 375, 3, 2, 2, 2, 74, 380, 3, 2, 2, 2, 76, 393, - 3, 2, 2, 2, 78, 407, 3, 2, 2, 2, 80, 411, 3, 2, 2, 2, 82, 421, 3, 2, 2, - 2, 84, 432, 3, 2, 2, 2, 86, 439, 3, 2, 2, 2, 88, 441, 3, 2, 2, 2, 90, 452, - 3, 2, 2, 2, 92, 454, 3, 2, 2, 2, 94, 463, 3, 2, 2, 2, 96, 467, 3, 2, 2, - 2, 98, 484, 3, 2, 2, 2, 100, 486, 3, 2, 2, 2, 102, 488, 3, 2, 2, 2, 104, - 495, 3, 2, 2, 2, 106, 511, 3, 2, 2, 2, 108, 535, 3, 2, 2, 2, 110, 542, - 3, 2, 2, 2, 112, 550, 3, 2, 2, 2, 114, 552, 3, 2, 2, 2, 116, 554, 3, 2, - 2, 2, 118, 556, 3, 2, 2, 2, 120, 558, 3, 2, 2, 2, 122, 561, 3, 2, 2, 2, - 124, 563, 3, 2, 2, 2, 126, 572, 3, 2, 2, 2, 128, 576, 3, 2, 2, 2, 130, - 578, 3, 2, 2, 2, 132, 594, 3, 2, 2, 2, 134, 598, 3, 2, 2, 2, 136, 601, - 3, 2, 2, 2, 138, 603, 3, 2, 2, 2, 140, 620, 3, 2, 2, 2, 142, 636, 3, 2, - 2, 2, 144, 638, 3, 2, 2, 2, 146, 643, 3, 2, 2, 2, 148, 650, 3, 2, 2, 2, - 150, 659, 3, 2, 2, 2, 152, 663, 3, 2, 2, 2, 154, 673, 3, 2, 2, 2, 156, - 675, 3, 2, 2, 2, 158, 677, 3, 2, 2, 2, 160, 694, 3, 2, 2, 2, 162, 698, - 3, 2, 2, 2, 164, 700, 3, 2, 2, 2, 166, 704, 3, 2, 2, 2, 168, 724, 3, 2, - 2, 2, 170, 728, 3, 2, 2, 2, 172, 176, 5, 4, 3, 2, 173, 175, 5, 10, 6, 2, - 174, 173, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, - 177, 3, 2, 2, 2, 177, 3, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, - 6, 4, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 185, 3, 2, 2, - 2, 182, 184, 5, 8, 5, 2, 183, 182, 3, 2, 2, 2, 184, 187, 3, 2, 2, 2, 185, - 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 5, 3, 2, 2, 2, 187, 185, 3, - 2, 2, 2, 188, 189, 7, 3, 2, 2, 189, 192, 7, 110, 2, 2, 190, 191, 7, 103, - 2, 2, 191, 193, 7, 110, 2, 2, 192, 190, 3, 2, 2, 2, 192, 193, 3, 2, 2, - 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 102, 2, 2, 195, 7, 3, 2, 2, 2, 196, - 197, 7, 4, 2, 2, 197, 198, 7, 114, 2, 2, 198, 199, 7, 102, 2, 2, 199, 9, - 3, 2, 2, 2, 200, 212, 5, 12, 7, 2, 201, 212, 5, 104, 53, 2, 202, 212, 5, - 14, 8, 2, 203, 212, 5, 130, 66, 2, 204, 212, 5, 132, 67, 2, 205, 212, 5, - 134, 68, 2, 206, 212, 5, 72, 37, 2, 207, 212, 5, 84, 43, 2, 208, 212, 5, - 160, 81, 2, 209, 212, 5, 144, 73, 2, 210, 212, 5, 16, 9, 2, 211, 200, 3, - 2, 2, 2, 211, 201, 3, 2, 2, 2, 211, 202, 3, 2, 2, 2, 211, 203, 3, 2, 2, - 2, 211, 204, 3, 2, 2, 2, 211, 205, 3, 2, 2, 2, 211, 206, 3, 2, 2, 2, 211, - 207, 3, 2, 2, 2, 211, 208, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 210, - 3, 2, 2, 2, 212, 11, 3, 2, 2, 2, 213, 218, 5, 140, 71, 2, 214, 218, 5, - 138, 70, 2, 215, 218, 5, 78, 40, 2, 216, 218, 5, 166, 84, 2, 217, 213, - 3, 2, 2, 2, 217, 214, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 217, 216, 3, 2, - 2, 2, 218, 13, 3, 2, 2, 2, 219, 223, 5, 36, 19, 2, 220, 223, 5, 64, 33, - 2, 221, 223, 5, 52, 27, 2, 222, 219, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, - 222, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 7, 102, 2, 2, 225, - 15, 3, 2, 2, 2, 226, 227, 9, 2, 2, 2, 227, 17, 3, 2, 2, 2, 228, 229, 7, - 106, 2, 2, 229, 230, 5, 64, 33, 2, 230, 19, 3, 2, 2, 2, 231, 234, 7, 97, - 2, 2, 232, 235, 5, 20, 11, 2, 233, 235, 5, 10, 6, 2, 234, 232, 3, 2, 2, - 2, 234, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 237, 7, 98, 2, 2, 237, - 21, 3, 2, 2, 2, 238, 239, 7, 95, 2, 2, 239, 240, 5, 106, 54, 2, 240, 241, - 7, 96, 2, 2, 241, 23, 3, 2, 2, 2, 242, 243, 7, 95, 2, 2, 243, 244, 5, 106, - 54, 2, 244, 245, 7, 104, 2, 2, 245, 246, 5, 106, 54, 2, 246, 247, 7, 96, - 2, 2, 247, 25, 3, 2, 2, 2, 248, 249, 7, 113, 2, 2, 249, 251, 7, 104, 2, - 2, 250, 248, 3, 2, 2, 2, 251, 254, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 252, - 253, 3, 2, 2, 2, 253, 255, 3, 2, 2, 2, 254, 252, 3, 2, 2, 2, 255, 256, - 7, 113, 2, 2, 256, 27, 3, 2, 2, 2, 257, 261, 7, 113, 2, 2, 258, 262, 5, - 22, 12, 2, 259, 262, 5, 24, 13, 2, 260, 262, 5, 76, 39, 2, 261, 258, 3, - 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 261, 262, 3, 2, 2, - 2, 262, 29, 3, 2, 2, 2, 263, 264, 5, 28, 15, 2, 264, 265, 7, 104, 2, 2, - 265, 267, 3, 2, 2, 2, 266, 263, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, - 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 268, - 3, 2, 2, 2, 271, 272, 5, 28, 15, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 101, - 2, 2, 274, 275, 7, 113, 2, 2, 275, 33, 3, 2, 2, 2, 276, 277, 9, 3, 2, 2, - 277, 35, 3, 2, 2, 2, 278, 279, 5, 34, 18, 2, 279, 280, 5, 30, 16, 2, 280, - 37, 3, 2, 2, 2, 281, 283, 5, 34, 18, 2, 282, 284, 5, 22, 12, 2, 283, 282, - 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 286, 5, 32, - 17, 2, 286, 39, 3, 2, 2, 2, 287, 288, 5, 38, 20, 2, 288, 289, 7, 104, 2, - 2, 289, 291, 3, 2, 2, 2, 290, 287, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, - 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 292, - 3, 2, 2, 2, 295, 296, 5, 38, 20, 2, 296, 41, 3, 2, 2, 2, 297, 298, 9, 4, - 2, 2, 298, 43, 3, 2, 2, 2, 299, 300, 9, 5, 2, 2, 300, 45, 3, 2, 2, 2, 301, - 302, 7, 13, 2, 2, 302, 47, 3, 2, 2, 2, 303, 306, 7, 14, 2, 2, 304, 306, - 5, 148, 75, 2, 305, 303, 3, 2, 2, 2, 305, 304, 3, 2, 2, 2, 306, 49, 3, - 2, 2, 2, 307, 309, 5, 44, 23, 2, 308, 310, 5, 22, 12, 2, 309, 308, 3, 2, - 2, 2, 309, 310, 3, 2, 2, 2, 310, 321, 3, 2, 2, 2, 311, 313, 5, 46, 24, - 2, 312, 314, 5, 24, 13, 2, 313, 312, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, - 314, 321, 3, 2, 2, 2, 315, 321, 5, 48, 25, 2, 316, 318, 5, 42, 22, 2, 317, - 319, 5, 22, 12, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 321, - 3, 2, 2, 2, 320, 307, 3, 2, 2, 2, 320, 311, 3, 2, 2, 2, 320, 315, 3, 2, - 2, 2, 320, 316, 3, 2, 2, 2, 321, 51, 3, 2, 2, 2, 322, 323, 7, 15, 2, 2, - 323, 324, 7, 113, 2, 2, 324, 325, 7, 105, 2, 2, 325, 326, 5, 106, 54, 2, - 326, 53, 3, 2, 2, 2, 327, 328, 5, 44, 23, 2, 328, 329, 5, 22, 12, 2, 329, - 330, 7, 113, 2, 2, 330, 55, 3, 2, 2, 2, 331, 332, 5, 46, 24, 2, 332, 333, - 5, 24, 13, 2, 333, 334, 7, 113, 2, 2, 334, 57, 3, 2, 2, 2, 335, 336, 5, - 48, 25, 2, 336, 337, 7, 113, 2, 2, 337, 59, 3, 2, 2, 2, 338, 339, 5, 42, - 22, 2, 339, 340, 7, 113, 2, 2, 340, 341, 5, 22, 12, 2, 341, 61, 3, 2, 2, - 2, 342, 347, 5, 54, 28, 2, 343, 347, 5, 56, 29, 2, 344, 347, 5, 58, 30, - 2, 345, 347, 5, 60, 31, 2, 346, 342, 3, 2, 2, 2, 346, 343, 3, 2, 2, 2, - 346, 344, 3, 2, 2, 2, 346, 345, 3, 2, 2, 2, 347, 63, 3, 2, 2, 2, 348, 350, - 5, 62, 32, 2, 349, 351, 5, 120, 61, 2, 350, 349, 3, 2, 2, 2, 350, 351, - 3, 2, 2, 2, 351, 65, 3, 2, 2, 2, 352, 353, 5, 50, 26, 2, 353, 354, 7, 104, - 2, 2, 354, 356, 3, 2, 2, 2, 355, 352, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, - 357, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 360, 3, 2, 2, 2, 359, - 357, 3, 2, 2, 2, 360, 361, 5, 50, 26, 2, 361, 67, 3, 2, 2, 2, 362, 363, - 5, 50, 26, 2, 363, 364, 5, 32, 17, 2, 364, 69, 3, 2, 2, 2, 365, 366, 5, - 68, 35, 2, 366, 367, 7, 104, 2, 2, 367, 369, 3, 2, 2, 2, 368, 365, 3, 2, - 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, - 371, 373, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 374, 5, 68, 35, 2, 374, - 71, 3, 2, 2, 2, 375, 376, 7, 16, 2, 2, 376, 377, 7, 113, 2, 2, 377, 378, - 7, 105, 2, 2, 378, 379, 5, 74, 38, 2, 379, 73, 3, 2, 2, 2, 380, 391, 7, - 105, 2, 2, 381, 382, 7, 113, 2, 2, 382, 392, 5, 76, 39, 2, 383, 384, 7, - 113, 2, 2, 384, 385, 7, 17, 2, 2, 385, 392, 7, 113, 2, 2, 386, 387, 7, - 113, 2, 2, 387, 388, 7, 95, 2, 2, 388, 389, 5, 110, 56, 2, 389, 390, 7, - 96, 2, 2, 390, 392, 3, 2, 2, 2, 391, 381, 3, 2, 2, 2, 391, 383, 3, 2, 2, - 2, 391, 386, 3, 2, 2, 2, 392, 75, 3, 2, 2, 2, 393, 395, 7, 95, 2, 2, 394, - 396, 5, 106, 54, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, - 3, 2, 2, 2, 397, 399, 7, 101, 2, 2, 398, 400, 5, 106, 54, 2, 399, 398, - 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 403, 3, 2, 2, 2, 401, 402, 7, 101, - 2, 2, 402, 404, 5, 106, 54, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, - 2, 404, 405, 3, 2, 2, 2, 405, 406, 7, 96, 2, 2, 406, 77, 3, 2, 2, 2, 407, - 408, 7, 18, 2, 2, 408, 409, 5, 80, 41, 2, 409, 410, 5, 82, 42, 2, 410, - 79, 3, 2, 2, 2, 411, 417, 7, 113, 2, 2, 412, 414, 7, 99, 2, 2, 413, 415, - 5, 70, 36, 2, 414, 413, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 416, 3, - 2, 2, 2, 416, 418, 7, 100, 2, 2, 417, 412, 3, 2, 2, 2, 417, 418, 3, 2, - 2, 2, 418, 419, 3, 2, 2, 2, 419, 420, 5, 26, 14, 2, 420, 81, 3, 2, 2, 2, - 421, 425, 7, 97, 2, 2, 422, 424, 5, 84, 43, 2, 423, 422, 3, 2, 2, 2, 424, - 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, - 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 7, 98, 2, 2, 429, 83, 3, 2, - 2, 2, 430, 433, 5, 86, 44, 2, 431, 433, 5, 90, 46, 2, 432, 430, 3, 2, 2, - 2, 432, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 435, 7, 102, 2, 2, - 435, 85, 3, 2, 2, 2, 436, 440, 5, 96, 49, 2, 437, 440, 5, 88, 45, 2, 438, - 440, 5, 92, 47, 2, 439, 436, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 438, - 3, 2, 2, 2, 440, 87, 3, 2, 2, 2, 441, 442, 7, 19, 2, 2, 442, 443, 5, 30, - 16, 2, 443, 89, 3, 2, 2, 2, 444, 445, 5, 88, 45, 2, 445, 446, 7, 106, 2, - 2, 446, 447, 5, 30, 16, 2, 447, 453, 3, 2, 2, 2, 448, 449, 5, 30, 16, 2, - 449, 450, 7, 105, 2, 2, 450, 451, 5, 88, 45, 2, 451, 453, 3, 2, 2, 2, 452, - 444, 3, 2, 2, 2, 452, 448, 3, 2, 2, 2, 453, 91, 3, 2, 2, 2, 454, 455, 7, - 20, 2, 2, 455, 456, 5, 30, 16, 2, 456, 93, 3, 2, 2, 2, 457, 464, 7, 21, - 2, 2, 458, 459, 7, 22, 2, 2, 459, 460, 7, 99, 2, 2, 460, 461, 7, 110, 2, - 2, 461, 464, 7, 100, 2, 2, 462, 464, 7, 23, 2, 2, 463, 457, 3, 2, 2, 2, - 463, 458, 3, 2, 2, 2, 463, 462, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, - 466, 7, 24, 2, 2, 466, 95, 3, 2, 2, 2, 467, 473, 5, 98, 50, 2, 468, 470, - 7, 99, 2, 2, 469, 471, 5, 110, 56, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, - 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 474, 7, 100, 2, 2, 473, 468, 3, 2, - 2, 2, 473, 474, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 5, 30, 16, - 2, 476, 97, 3, 2, 2, 2, 477, 485, 7, 25, 2, 2, 478, 485, 7, 26, 2, 2, 479, - 485, 7, 27, 2, 2, 480, 485, 7, 113, 2, 2, 481, 482, 5, 94, 48, 2, 482, - 483, 5, 98, 50, 2, 483, 485, 3, 2, 2, 2, 484, 477, 3, 2, 2, 2, 484, 478, - 3, 2, 2, 2, 484, 479, 3, 2, 2, 2, 484, 480, 3, 2, 2, 2, 484, 481, 3, 2, - 2, 2, 485, 99, 3, 2, 2, 2, 486, 487, 9, 6, 2, 2, 487, 101, 3, 2, 2, 2, - 488, 489, 9, 7, 2, 2, 489, 103, 3, 2, 2, 2, 490, 491, 5, 106, 54, 2, 491, - 492, 7, 102, 2, 2, 492, 496, 3, 2, 2, 2, 493, 494, 7, 48, 2, 2, 494, 496, - 5, 104, 53, 2, 495, 490, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 496, 105, 3, - 2, 2, 2, 497, 498, 8, 54, 1, 2, 498, 499, 5, 100, 51, 2, 499, 500, 5, 106, - 54, 9, 500, 512, 3, 2, 2, 2, 501, 512, 5, 124, 63, 2, 502, 503, 5, 112, - 57, 2, 503, 505, 7, 99, 2, 2, 504, 506, 5, 110, 56, 2, 505, 504, 3, 2, - 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 100, 2, - 2, 508, 512, 3, 2, 2, 2, 509, 512, 5, 88, 45, 2, 510, 512, 5, 108, 55, - 2, 511, 497, 3, 2, 2, 2, 511, 501, 3, 2, 2, 2, 511, 502, 3, 2, 2, 2, 511, - 509, 3, 2, 2, 2, 511, 510, 3, 2, 2, 2, 512, 526, 3, 2, 2, 2, 513, 514, - 12, 10, 2, 2, 514, 515, 5, 102, 52, 2, 515, 516, 5, 106, 54, 11, 516, 525, - 3, 2, 2, 2, 517, 518, 12, 7, 2, 2, 518, 519, 7, 95, 2, 2, 519, 520, 5, - 106, 54, 2, 520, 521, 7, 96, 2, 2, 521, 525, 3, 2, 2, 2, 522, 523, 12, - 5, 2, 2, 523, 525, 5, 118, 60, 2, 524, 513, 3, 2, 2, 2, 524, 517, 3, 2, - 2, 2, 524, 522, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, - 526, 527, 3, 2, 2, 2, 527, 107, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 529, - 536, 7, 107, 2, 2, 530, 536, 7, 110, 2, 2, 531, 536, 7, 112, 2, 2, 532, - 536, 7, 113, 2, 2, 533, 536, 7, 114, 2, 2, 534, 536, 5, 152, 77, 2, 535, - 529, 3, 2, 2, 2, 535, 530, 3, 2, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, - 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 109, 3, 2, - 2, 2, 537, 538, 5, 106, 54, 2, 538, 539, 7, 104, 2, 2, 539, 541, 3, 2, - 2, 2, 540, 537, 3, 2, 2, 2, 541, 544, 3, 2, 2, 2, 542, 540, 3, 2, 2, 2, - 542, 543, 3, 2, 2, 2, 543, 545, 3, 2, 2, 2, 544, 542, 3, 2, 2, 2, 545, - 546, 5, 106, 54, 2, 546, 111, 3, 2, 2, 2, 547, 551, 7, 113, 2, 2, 548, - 551, 5, 114, 58, 2, 549, 551, 5, 116, 59, 2, 550, 547, 3, 2, 2, 2, 550, - 548, 3, 2, 2, 2, 550, 549, 3, 2, 2, 2, 551, 113, 3, 2, 2, 2, 552, 553, - 9, 8, 2, 2, 553, 115, 3, 2, 2, 2, 554, 555, 5, 50, 26, 2, 555, 117, 3, - 2, 2, 2, 556, 557, 9, 9, 2, 2, 557, 119, 3, 2, 2, 2, 558, 559, 5, 122, - 62, 2, 559, 560, 5, 106, 54, 2, 560, 121, 3, 2, 2, 2, 561, 562, 9, 10, - 2, 2, 562, 123, 3, 2, 2, 2, 563, 564, 7, 113, 2, 2, 564, 565, 7, 69, 2, - 2, 565, 566, 5, 126, 64, 2, 566, 125, 3, 2, 2, 2, 567, 568, 7, 97, 2, 2, - 568, 569, 5, 110, 56, 2, 569, 570, 7, 98, 2, 2, 570, 573, 3, 2, 2, 2, 571, - 573, 5, 76, 39, 2, 572, 567, 3, 2, 2, 2, 572, 571, 3, 2, 2, 2, 573, 127, - 3, 2, 2, 2, 574, 577, 5, 10, 6, 2, 575, 577, 5, 20, 11, 2, 576, 574, 3, - 2, 2, 2, 576, 575, 3, 2, 2, 2, 577, 129, 3, 2, 2, 2, 578, 579, 7, 70, 2, - 2, 579, 580, 7, 99, 2, 2, 580, 581, 5, 106, 54, 2, 581, 582, 7, 100, 2, - 2, 582, 585, 5, 128, 65, 2, 583, 584, 7, 71, 2, 2, 584, 586, 5, 128, 65, - 2, 585, 583, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 131, 3, 2, 2, 2, 587, - 588, 7, 72, 2, 2, 588, 595, 5, 124, 63, 2, 589, 590, 7, 73, 2, 2, 590, - 591, 7, 99, 2, 2, 591, 592, 5, 106, 54, 2, 592, 593, 7, 100, 2, 2, 593, - 595, 3, 2, 2, 2, 594, 587, 3, 2, 2, 2, 594, 589, 3, 2, 2, 2, 595, 596, - 3, 2, 2, 2, 596, 597, 5, 128, 65, 2, 597, 133, 3, 2, 2, 2, 598, 599, 5, - 136, 69, 2, 599, 600, 7, 102, 2, 2, 600, 135, 3, 2, 2, 2, 601, 602, 9, - 11, 2, 2, 602, 137, 3, 2, 2, 2, 603, 604, 7, 77, 2, 2, 604, 610, 7, 113, - 2, 2, 605, 607, 7, 99, 2, 2, 606, 608, 5, 66, 34, 2, 607, 606, 3, 2, 2, - 2, 607, 608, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 611, 7, 100, 2, 2, - 610, 605, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 613, 3, 2, 2, 2, 612, - 614, 5, 18, 10, 2, 613, 612, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 616, - 3, 2, 2, 2, 615, 617, 5, 50, 26, 2, 616, 615, 3, 2, 2, 2, 616, 617, 3, - 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 619, 7, 102, 2, 2, 619, 139, 3, 2, - 2, 2, 620, 621, 7, 78, 2, 2, 621, 627, 7, 113, 2, 2, 622, 624, 7, 99, 2, - 2, 623, 625, 5, 142, 72, 2, 624, 623, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, - 625, 626, 3, 2, 2, 2, 626, 628, 7, 100, 2, 2, 627, 622, 3, 2, 2, 2, 627, - 628, 3, 2, 2, 2, 628, 630, 3, 2, 2, 2, 629, 631, 5, 18, 10, 2, 630, 629, - 3, 2, 2, 2, 630, 631, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 633, 5, 20, - 11, 2, 633, 141, 3, 2, 2, 2, 634, 637, 5, 70, 36, 2, 635, 637, 5, 40, 21, - 2, 636, 634, 3, 2, 2, 2, 636, 635, 3, 2, 2, 2, 637, 143, 3, 2, 2, 2, 638, - 639, 7, 79, 2, 2, 639, 640, 7, 97, 2, 2, 640, 641, 11, 2, 2, 2, 641, 642, - 7, 98, 2, 2, 642, 145, 3, 2, 2, 2, 643, 644, 9, 12, 2, 2, 644, 147, 3, - 2, 2, 2, 645, 651, 7, 85, 2, 2, 646, 648, 7, 86, 2, 2, 647, 649, 7, 110, - 2, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 3, 2, 2, 2, - 650, 645, 3, 2, 2, 2, 650, 646, 3, 2, 2, 2, 651, 149, 3, 2, 2, 2, 652, - 653, 7, 87, 2, 2, 653, 654, 7, 113, 2, 2, 654, 660, 5, 82, 42, 2, 655, - 656, 7, 88, 2, 2, 656, 657, 5, 146, 74, 2, 657, 658, 5, 82, 42, 2, 658, - 660, 3, 2, 2, 2, 659, 652, 3, 2, 2, 2, 659, 655, 3, 2, 2, 2, 660, 151, - 3, 2, 2, 2, 661, 664, 5, 154, 78, 2, 662, 664, 7, 89, 2, 2, 663, 661, 3, - 2, 2, 2, 663, 662, 3, 2, 2, 2, 664, 153, 3, 2, 2, 2, 665, 667, 7, 113, - 2, 2, 666, 668, 5, 146, 74, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, - 2, 668, 674, 3, 2, 2, 2, 669, 670, 7, 56, 2, 2, 670, 671, 7, 99, 2, 2, - 671, 672, 7, 113, 2, 2, 672, 674, 7, 100, 2, 2, 673, 665, 3, 2, 2, 2, 673, - 669, 3, 2, 2, 2, 674, 155, 3, 2, 2, 2, 675, 676, 9, 13, 2, 2, 676, 157, - 3, 2, 2, 2, 677, 683, 5, 156, 79, 2, 678, 680, 7, 99, 2, 2, 679, 681, 5, - 110, 56, 2, 680, 679, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 682, 3, 2, - 2, 2, 682, 684, 7, 100, 2, 2, 683, 678, 3, 2, 2, 2, 683, 684, 3, 2, 2, - 2, 684, 685, 3, 2, 2, 2, 685, 688, 5, 22, 12, 2, 686, 689, 5, 76, 39, 2, - 687, 689, 5, 30, 16, 2, 688, 686, 3, 2, 2, 2, 688, 687, 3, 2, 2, 2, 689, - 159, 3, 2, 2, 2, 690, 691, 5, 158, 80, 2, 691, 692, 7, 102, 2, 2, 692, - 695, 3, 2, 2, 2, 693, 695, 5, 150, 76, 2, 694, 690, 3, 2, 2, 2, 694, 693, - 3, 2, 2, 2, 695, 161, 3, 2, 2, 2, 696, 699, 5, 164, 83, 2, 697, 699, 5, - 166, 84, 2, 698, 696, 3, 2, 2, 2, 698, 697, 3, 2, 2, 2, 699, 163, 3, 2, - 2, 2, 700, 701, 7, 92, 2, 2, 701, 702, 5, 168, 85, 2, 702, 703, 7, 102, - 2, 2, 703, 165, 3, 2, 2, 2, 704, 706, 7, 93, 2, 2, 705, 707, 5, 168, 85, - 2, 706, 705, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, - 714, 7, 113, 2, 2, 709, 711, 7, 99, 2, 2, 710, 712, 5, 170, 86, 2, 711, - 710, 3, 2, 2, 2, 711, 712, 3, 2, 2, 2, 712, 713, 3, 2, 2, 2, 713, 715, - 7, 100, 2, 2, 714, 709, 3, 2, 2, 2, 714, 715, 3, 2, 2, 2, 715, 716, 3, - 2, 2, 2, 716, 718, 5, 26, 14, 2, 717, 719, 5, 18, 10, 2, 718, 717, 3, 2, - 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 7, 97, 2, 2, - 721, 722, 11, 2, 2, 2, 722, 723, 7, 98, 2, 2, 723, 167, 3, 2, 2, 2, 724, - 725, 9, 14, 2, 2, 725, 169, 3, 2, 2, 2, 726, 729, 5, 70, 36, 2, 727, 729, - 5, 110, 56, 2, 728, 726, 3, 2, 2, 2, 728, 727, 3, 2, 2, 2, 729, 171, 3, - 2, 2, 2, 74, 176, 180, 185, 192, 211, 217, 222, 234, 252, 261, 268, 283, - 292, 305, 309, 313, 318, 320, 346, 350, 357, 370, 391, 395, 399, 403, 414, - 417, 425, 432, 439, 452, 463, 470, 473, 484, 495, 505, 511, 524, 526, 535, - 542, 550, 572, 576, 585, 594, 607, 610, 613, 616, 624, 627, 630, 636, 648, - 650, 659, 663, 667, 673, 680, 683, 688, 694, 698, 706, 711, 714, 718, 728, + 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 5, 31, 342, 10, 31, 3, 32, 3, 32, 3, + 32, 3, 32, 5, 32, 348, 10, 32, 3, 33, 3, 33, 5, 33, 352, 10, 33, 3, 34, + 3, 34, 3, 34, 7, 34, 357, 10, 34, 12, 34, 14, 34, 360, 11, 34, 3, 34, 3, + 34, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 7, 36, 370, 10, 36, 12, 36, + 14, 36, 373, 11, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, + 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, + 5, 38, 393, 10, 38, 3, 39, 3, 39, 5, 39, 397, 10, 39, 3, 39, 3, 39, 5, + 39, 401, 10, 39, 3, 39, 3, 39, 5, 39, 405, 10, 39, 3, 39, 3, 39, 3, 40, + 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 5, 41, 416, 10, 41, 3, 41, 5, + 41, 419, 10, 41, 3, 41, 3, 41, 3, 42, 3, 42, 7, 42, 425, 10, 42, 12, 42, + 14, 42, 428, 11, 42, 3, 42, 3, 42, 3, 43, 3, 43, 5, 43, 434, 10, 43, 3, + 43, 3, 43, 3, 44, 3, 44, 3, 44, 5, 44, 441, 10, 44, 3, 45, 3, 45, 3, 45, + 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 5, 46, 454, 10, + 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, + 465, 10, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 5, 49, 472, 10, 49, 3, + 49, 5, 49, 475, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, + 3, 50, 3, 50, 5, 50, 486, 10, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, + 53, 3, 53, 3, 53, 3, 53, 5, 53, 497, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, + 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 507, 10, 54, 3, 54, 3, 54, 3, 54, 3, + 54, 5, 54, 513, 10, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, + 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 526, 10, 54, 12, 54, 14, 54, 529, 11, + 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 537, 10, 55, 3, 56, + 3, 56, 3, 56, 7, 56, 542, 10, 56, 12, 56, 14, 56, 545, 11, 56, 3, 56, 3, + 56, 3, 57, 3, 57, 3, 57, 5, 57, 552, 10, 57, 3, 58, 3, 58, 3, 59, 3, 59, + 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, + 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 5, 64, 574, 10, 64, 3, 65, 3, 65, + 5, 65, 578, 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 5, + 66, 587, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, + 596, 10, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, + 70, 3, 70, 3, 70, 5, 70, 609, 10, 70, 3, 70, 5, 70, 612, 10, 70, 3, 70, + 5, 70, 615, 10, 70, 3, 70, 5, 70, 618, 10, 70, 3, 70, 3, 70, 3, 71, 3, + 71, 3, 71, 3, 71, 5, 71, 626, 10, 71, 3, 71, 5, 71, 629, 10, 71, 3, 71, + 5, 71, 632, 10, 71, 3, 71, 3, 71, 3, 72, 3, 72, 5, 72, 638, 10, 72, 3, + 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 5, 75, + 650, 10, 75, 5, 75, 652, 10, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, + 76, 3, 76, 5, 76, 661, 10, 76, 3, 77, 3, 77, 5, 77, 665, 10, 77, 3, 78, + 3, 78, 5, 78, 669, 10, 78, 3, 78, 3, 78, 3, 78, 3, 78, 5, 78, 675, 10, + 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 5, 80, 682, 10, 80, 3, 80, 5, 80, + 685, 10, 80, 3, 80, 3, 80, 3, 80, 5, 80, 690, 10, 80, 3, 81, 3, 81, 3, + 81, 3, 81, 5, 81, 696, 10, 81, 3, 82, 3, 82, 5, 82, 700, 10, 82, 3, 83, + 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 5, 84, 708, 10, 84, 3, 84, 3, 84, 3, + 84, 5, 84, 713, 10, 84, 3, 84, 5, 84, 716, 10, 84, 3, 84, 3, 84, 5, 84, + 720, 10, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 5, + 86, 730, 10, 86, 3, 86, 2, 3, 106, 87, 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, 2, 15, 3, 2, 115, 116, + 3, 2, 5, 6, 3, 2, 7, 8, 3, 2, 9, 12, 3, 2, 28, 29, 4, 2, 17, 17, 30, 47, + 3, 2, 49, 56, 3, 2, 57, 58, 4, 2, 59, 68, 105, 106, 3, 2, 74, 76, 3, 2, + 80, 84, 3, 2, 90, 91, 4, 2, 94, 94, 113, 113, 2, 752, 2, 172, 3, 2, 2, + 2, 4, 180, 3, 2, 2, 2, 6, 188, 3, 2, 2, 2, 8, 196, 3, 2, 2, 2, 10, 211, + 3, 2, 2, 2, 12, 217, 3, 2, 2, 2, 14, 222, 3, 2, 2, 2, 16, 226, 3, 2, 2, + 2, 18, 228, 3, 2, 2, 2, 20, 231, 3, 2, 2, 2, 22, 238, 3, 2, 2, 2, 24, 242, + 3, 2, 2, 2, 26, 252, 3, 2, 2, 2, 28, 257, 3, 2, 2, 2, 30, 268, 3, 2, 2, + 2, 32, 273, 3, 2, 2, 2, 34, 276, 3, 2, 2, 2, 36, 278, 3, 2, 2, 2, 38, 281, + 3, 2, 2, 2, 40, 292, 3, 2, 2, 2, 42, 297, 3, 2, 2, 2, 44, 299, 3, 2, 2, + 2, 46, 301, 3, 2, 2, 2, 48, 305, 3, 2, 2, 2, 50, 320, 3, 2, 2, 2, 52, 322, + 3, 2, 2, 2, 54, 327, 3, 2, 2, 2, 56, 331, 3, 2, 2, 2, 58, 335, 3, 2, 2, + 2, 60, 338, 3, 2, 2, 2, 62, 347, 3, 2, 2, 2, 64, 349, 3, 2, 2, 2, 66, 358, + 3, 2, 2, 2, 68, 363, 3, 2, 2, 2, 70, 371, 3, 2, 2, 2, 72, 376, 3, 2, 2, + 2, 74, 381, 3, 2, 2, 2, 76, 394, 3, 2, 2, 2, 78, 408, 3, 2, 2, 2, 80, 412, + 3, 2, 2, 2, 82, 422, 3, 2, 2, 2, 84, 433, 3, 2, 2, 2, 86, 440, 3, 2, 2, + 2, 88, 442, 3, 2, 2, 2, 90, 453, 3, 2, 2, 2, 92, 455, 3, 2, 2, 2, 94, 464, + 3, 2, 2, 2, 96, 468, 3, 2, 2, 2, 98, 485, 3, 2, 2, 2, 100, 487, 3, 2, 2, + 2, 102, 489, 3, 2, 2, 2, 104, 496, 3, 2, 2, 2, 106, 512, 3, 2, 2, 2, 108, + 536, 3, 2, 2, 2, 110, 543, 3, 2, 2, 2, 112, 551, 3, 2, 2, 2, 114, 553, + 3, 2, 2, 2, 116, 555, 3, 2, 2, 2, 118, 557, 3, 2, 2, 2, 120, 559, 3, 2, + 2, 2, 122, 562, 3, 2, 2, 2, 124, 564, 3, 2, 2, 2, 126, 573, 3, 2, 2, 2, + 128, 577, 3, 2, 2, 2, 130, 579, 3, 2, 2, 2, 132, 595, 3, 2, 2, 2, 134, + 599, 3, 2, 2, 2, 136, 602, 3, 2, 2, 2, 138, 604, 3, 2, 2, 2, 140, 621, + 3, 2, 2, 2, 142, 637, 3, 2, 2, 2, 144, 639, 3, 2, 2, 2, 146, 644, 3, 2, + 2, 2, 148, 651, 3, 2, 2, 2, 150, 660, 3, 2, 2, 2, 152, 664, 3, 2, 2, 2, + 154, 674, 3, 2, 2, 2, 156, 676, 3, 2, 2, 2, 158, 678, 3, 2, 2, 2, 160, + 695, 3, 2, 2, 2, 162, 699, 3, 2, 2, 2, 164, 701, 3, 2, 2, 2, 166, 705, + 3, 2, 2, 2, 168, 725, 3, 2, 2, 2, 170, 729, 3, 2, 2, 2, 172, 176, 5, 4, + 3, 2, 173, 175, 5, 10, 6, 2, 174, 173, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, + 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 3, 3, 2, 2, 2, 178, 176, + 3, 2, 2, 2, 179, 181, 5, 6, 4, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, + 2, 2, 181, 185, 3, 2, 2, 2, 182, 184, 5, 8, 5, 2, 183, 182, 3, 2, 2, 2, + 184, 187, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, + 5, 3, 2, 2, 2, 187, 185, 3, 2, 2, 2, 188, 189, 7, 3, 2, 2, 189, 192, 7, + 110, 2, 2, 190, 191, 7, 103, 2, 2, 191, 193, 7, 110, 2, 2, 192, 190, 3, + 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 102, + 2, 2, 195, 7, 3, 2, 2, 2, 196, 197, 7, 4, 2, 2, 197, 198, 7, 114, 2, 2, + 198, 199, 7, 102, 2, 2, 199, 9, 3, 2, 2, 2, 200, 212, 5, 12, 7, 2, 201, + 212, 5, 104, 53, 2, 202, 212, 5, 14, 8, 2, 203, 212, 5, 130, 66, 2, 204, + 212, 5, 132, 67, 2, 205, 212, 5, 134, 68, 2, 206, 212, 5, 72, 37, 2, 207, + 212, 5, 84, 43, 2, 208, 212, 5, 160, 81, 2, 209, 212, 5, 144, 73, 2, 210, + 212, 5, 16, 9, 2, 211, 200, 3, 2, 2, 2, 211, 201, 3, 2, 2, 2, 211, 202, + 3, 2, 2, 2, 211, 203, 3, 2, 2, 2, 211, 204, 3, 2, 2, 2, 211, 205, 3, 2, + 2, 2, 211, 206, 3, 2, 2, 2, 211, 207, 3, 2, 2, 2, 211, 208, 3, 2, 2, 2, + 211, 209, 3, 2, 2, 2, 211, 210, 3, 2, 2, 2, 212, 11, 3, 2, 2, 2, 213, 218, + 5, 140, 71, 2, 214, 218, 5, 138, 70, 2, 215, 218, 5, 78, 40, 2, 216, 218, + 5, 166, 84, 2, 217, 213, 3, 2, 2, 2, 217, 214, 3, 2, 2, 2, 217, 215, 3, + 2, 2, 2, 217, 216, 3, 2, 2, 2, 218, 13, 3, 2, 2, 2, 219, 223, 5, 36, 19, + 2, 220, 223, 5, 64, 33, 2, 221, 223, 5, 52, 27, 2, 222, 219, 3, 2, 2, 2, + 222, 220, 3, 2, 2, 2, 222, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, + 225, 7, 102, 2, 2, 225, 15, 3, 2, 2, 2, 226, 227, 9, 2, 2, 2, 227, 17, + 3, 2, 2, 2, 228, 229, 7, 106, 2, 2, 229, 230, 5, 64, 33, 2, 230, 19, 3, + 2, 2, 2, 231, 234, 7, 97, 2, 2, 232, 235, 5, 20, 11, 2, 233, 235, 5, 10, + 6, 2, 234, 232, 3, 2, 2, 2, 234, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, + 236, 237, 7, 98, 2, 2, 237, 21, 3, 2, 2, 2, 238, 239, 7, 95, 2, 2, 239, + 240, 5, 106, 54, 2, 240, 241, 7, 96, 2, 2, 241, 23, 3, 2, 2, 2, 242, 243, + 7, 95, 2, 2, 243, 244, 5, 106, 54, 2, 244, 245, 7, 104, 2, 2, 245, 246, + 5, 106, 54, 2, 246, 247, 7, 96, 2, 2, 247, 25, 3, 2, 2, 2, 248, 249, 7, + 113, 2, 2, 249, 251, 7, 104, 2, 2, 250, 248, 3, 2, 2, 2, 251, 254, 3, 2, + 2, 2, 252, 250, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 255, 3, 2, 2, 2, + 254, 252, 3, 2, 2, 2, 255, 256, 7, 113, 2, 2, 256, 27, 3, 2, 2, 2, 257, + 261, 7, 113, 2, 2, 258, 262, 5, 22, 12, 2, 259, 262, 5, 24, 13, 2, 260, + 262, 5, 76, 39, 2, 261, 258, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, + 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 29, 3, 2, 2, 2, 263, 264, 5, 28, + 15, 2, 264, 265, 7, 104, 2, 2, 265, 267, 3, 2, 2, 2, 266, 263, 3, 2, 2, + 2, 267, 270, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, + 271, 3, 2, 2, 2, 270, 268, 3, 2, 2, 2, 271, 272, 5, 28, 15, 2, 272, 31, + 3, 2, 2, 2, 273, 274, 7, 101, 2, 2, 274, 275, 7, 113, 2, 2, 275, 33, 3, + 2, 2, 2, 276, 277, 9, 3, 2, 2, 277, 35, 3, 2, 2, 2, 278, 279, 5, 34, 18, + 2, 279, 280, 5, 30, 16, 2, 280, 37, 3, 2, 2, 2, 281, 283, 5, 34, 18, 2, + 282, 284, 5, 22, 12, 2, 283, 282, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, + 285, 3, 2, 2, 2, 285, 286, 5, 32, 17, 2, 286, 39, 3, 2, 2, 2, 287, 288, + 5, 38, 20, 2, 288, 289, 7, 104, 2, 2, 289, 291, 3, 2, 2, 2, 290, 287, 3, + 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, + 2, 293, 295, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 295, 296, 5, 38, 20, 2, + 296, 41, 3, 2, 2, 2, 297, 298, 9, 4, 2, 2, 298, 43, 3, 2, 2, 2, 299, 300, + 9, 5, 2, 2, 300, 45, 3, 2, 2, 2, 301, 302, 7, 13, 2, 2, 302, 47, 3, 2, + 2, 2, 303, 306, 7, 14, 2, 2, 304, 306, 5, 148, 75, 2, 305, 303, 3, 2, 2, + 2, 305, 304, 3, 2, 2, 2, 306, 49, 3, 2, 2, 2, 307, 309, 5, 44, 23, 2, 308, + 310, 5, 22, 12, 2, 309, 308, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 321, + 3, 2, 2, 2, 311, 313, 5, 46, 24, 2, 312, 314, 5, 24, 13, 2, 313, 312, 3, + 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 321, 3, 2, 2, 2, 315, 321, 5, 48, 25, + 2, 316, 318, 5, 42, 22, 2, 317, 319, 5, 22, 12, 2, 318, 317, 3, 2, 2, 2, + 318, 319, 3, 2, 2, 2, 319, 321, 3, 2, 2, 2, 320, 307, 3, 2, 2, 2, 320, + 311, 3, 2, 2, 2, 320, 315, 3, 2, 2, 2, 320, 316, 3, 2, 2, 2, 321, 51, 3, + 2, 2, 2, 322, 323, 7, 15, 2, 2, 323, 324, 7, 113, 2, 2, 324, 325, 7, 105, + 2, 2, 325, 326, 5, 106, 54, 2, 326, 53, 3, 2, 2, 2, 327, 328, 5, 44, 23, + 2, 328, 329, 5, 22, 12, 2, 329, 330, 7, 113, 2, 2, 330, 55, 3, 2, 2, 2, + 331, 332, 5, 46, 24, 2, 332, 333, 5, 24, 13, 2, 333, 334, 7, 113, 2, 2, + 334, 57, 3, 2, 2, 2, 335, 336, 5, 48, 25, 2, 336, 337, 7, 113, 2, 2, 337, + 59, 3, 2, 2, 2, 338, 339, 5, 42, 22, 2, 339, 341, 7, 113, 2, 2, 340, 342, + 5, 22, 12, 2, 341, 340, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 61, 3, 2, + 2, 2, 343, 348, 5, 54, 28, 2, 344, 348, 5, 56, 29, 2, 345, 348, 5, 58, + 30, 2, 346, 348, 5, 60, 31, 2, 347, 343, 3, 2, 2, 2, 347, 344, 3, 2, 2, + 2, 347, 345, 3, 2, 2, 2, 347, 346, 3, 2, 2, 2, 348, 63, 3, 2, 2, 2, 349, + 351, 5, 62, 32, 2, 350, 352, 5, 120, 61, 2, 351, 350, 3, 2, 2, 2, 351, + 352, 3, 2, 2, 2, 352, 65, 3, 2, 2, 2, 353, 354, 5, 50, 26, 2, 354, 355, + 7, 104, 2, 2, 355, 357, 3, 2, 2, 2, 356, 353, 3, 2, 2, 2, 357, 360, 3, + 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, + 2, 360, 358, 3, 2, 2, 2, 361, 362, 5, 50, 26, 2, 362, 67, 3, 2, 2, 2, 363, + 364, 5, 50, 26, 2, 364, 365, 5, 32, 17, 2, 365, 69, 3, 2, 2, 2, 366, 367, + 5, 68, 35, 2, 367, 368, 7, 104, 2, 2, 368, 370, 3, 2, 2, 2, 369, 366, 3, + 2, 2, 2, 370, 373, 3, 2, 2, 2, 371, 369, 3, 2, 2, 2, 371, 372, 3, 2, 2, + 2, 372, 374, 3, 2, 2, 2, 373, 371, 3, 2, 2, 2, 374, 375, 5, 68, 35, 2, + 375, 71, 3, 2, 2, 2, 376, 377, 7, 16, 2, 2, 377, 378, 7, 113, 2, 2, 378, + 379, 7, 105, 2, 2, 379, 380, 5, 74, 38, 2, 380, 73, 3, 2, 2, 2, 381, 392, + 7, 105, 2, 2, 382, 383, 7, 113, 2, 2, 383, 393, 5, 76, 39, 2, 384, 385, + 7, 113, 2, 2, 385, 386, 7, 17, 2, 2, 386, 393, 7, 113, 2, 2, 387, 388, + 7, 113, 2, 2, 388, 389, 7, 95, 2, 2, 389, 390, 5, 110, 56, 2, 390, 391, + 7, 96, 2, 2, 391, 393, 3, 2, 2, 2, 392, 382, 3, 2, 2, 2, 392, 384, 3, 2, + 2, 2, 392, 387, 3, 2, 2, 2, 393, 75, 3, 2, 2, 2, 394, 396, 7, 95, 2, 2, + 395, 397, 5, 106, 54, 2, 396, 395, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, + 398, 3, 2, 2, 2, 398, 400, 7, 101, 2, 2, 399, 401, 5, 106, 54, 2, 400, + 399, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 403, + 7, 101, 2, 2, 403, 405, 5, 106, 54, 2, 404, 402, 3, 2, 2, 2, 404, 405, + 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 407, 7, 96, 2, 2, 407, 77, 3, 2, + 2, 2, 408, 409, 7, 18, 2, 2, 409, 410, 5, 80, 41, 2, 410, 411, 5, 82, 42, + 2, 411, 79, 3, 2, 2, 2, 412, 418, 7, 113, 2, 2, 413, 415, 7, 99, 2, 2, + 414, 416, 5, 70, 36, 2, 415, 414, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, + 417, 3, 2, 2, 2, 417, 419, 7, 100, 2, 2, 418, 413, 3, 2, 2, 2, 418, 419, + 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 421, 5, 26, 14, 2, 421, 81, 3, 2, + 2, 2, 422, 426, 7, 97, 2, 2, 423, 425, 5, 84, 43, 2, 424, 423, 3, 2, 2, + 2, 425, 428, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, + 429, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 429, 430, 7, 98, 2, 2, 430, 83, + 3, 2, 2, 2, 431, 434, 5, 86, 44, 2, 432, 434, 5, 90, 46, 2, 433, 431, 3, + 2, 2, 2, 433, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 7, 102, + 2, 2, 436, 85, 3, 2, 2, 2, 437, 441, 5, 96, 49, 2, 438, 441, 5, 88, 45, + 2, 439, 441, 5, 92, 47, 2, 440, 437, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, + 440, 439, 3, 2, 2, 2, 441, 87, 3, 2, 2, 2, 442, 443, 7, 19, 2, 2, 443, + 444, 5, 30, 16, 2, 444, 89, 3, 2, 2, 2, 445, 446, 5, 88, 45, 2, 446, 447, + 7, 106, 2, 2, 447, 448, 5, 30, 16, 2, 448, 454, 3, 2, 2, 2, 449, 450, 5, + 30, 16, 2, 450, 451, 7, 105, 2, 2, 451, 452, 5, 88, 45, 2, 452, 454, 3, + 2, 2, 2, 453, 445, 3, 2, 2, 2, 453, 449, 3, 2, 2, 2, 454, 91, 3, 2, 2, + 2, 455, 456, 7, 20, 2, 2, 456, 457, 5, 30, 16, 2, 457, 93, 3, 2, 2, 2, + 458, 465, 7, 21, 2, 2, 459, 460, 7, 22, 2, 2, 460, 461, 7, 99, 2, 2, 461, + 462, 7, 110, 2, 2, 462, 465, 7, 100, 2, 2, 463, 465, 7, 23, 2, 2, 464, + 458, 3, 2, 2, 2, 464, 459, 3, 2, 2, 2, 464, 463, 3, 2, 2, 2, 465, 466, + 3, 2, 2, 2, 466, 467, 7, 24, 2, 2, 467, 95, 3, 2, 2, 2, 468, 474, 5, 98, + 50, 2, 469, 471, 7, 99, 2, 2, 470, 472, 5, 110, 56, 2, 471, 470, 3, 2, + 2, 2, 471, 472, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 475, 7, 100, 2, + 2, 474, 469, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, + 477, 5, 30, 16, 2, 477, 97, 3, 2, 2, 2, 478, 486, 7, 25, 2, 2, 479, 486, + 7, 26, 2, 2, 480, 486, 7, 27, 2, 2, 481, 486, 7, 113, 2, 2, 482, 483, 5, + 94, 48, 2, 483, 484, 5, 98, 50, 2, 484, 486, 3, 2, 2, 2, 485, 478, 3, 2, + 2, 2, 485, 479, 3, 2, 2, 2, 485, 480, 3, 2, 2, 2, 485, 481, 3, 2, 2, 2, + 485, 482, 3, 2, 2, 2, 486, 99, 3, 2, 2, 2, 487, 488, 9, 6, 2, 2, 488, 101, + 3, 2, 2, 2, 489, 490, 9, 7, 2, 2, 490, 103, 3, 2, 2, 2, 491, 492, 5, 106, + 54, 2, 492, 493, 7, 102, 2, 2, 493, 497, 3, 2, 2, 2, 494, 495, 7, 48, 2, + 2, 495, 497, 5, 104, 53, 2, 496, 491, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, + 497, 105, 3, 2, 2, 2, 498, 499, 8, 54, 1, 2, 499, 500, 5, 100, 51, 2, 500, + 501, 5, 106, 54, 9, 501, 513, 3, 2, 2, 2, 502, 513, 5, 124, 63, 2, 503, + 504, 5, 112, 57, 2, 504, 506, 7, 99, 2, 2, 505, 507, 5, 110, 56, 2, 506, + 505, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, + 7, 100, 2, 2, 509, 513, 3, 2, 2, 2, 510, 513, 5, 88, 45, 2, 511, 513, 5, + 108, 55, 2, 512, 498, 3, 2, 2, 2, 512, 502, 3, 2, 2, 2, 512, 503, 3, 2, + 2, 2, 512, 510, 3, 2, 2, 2, 512, 511, 3, 2, 2, 2, 513, 527, 3, 2, 2, 2, + 514, 515, 12, 10, 2, 2, 515, 516, 5, 102, 52, 2, 516, 517, 5, 106, 54, + 11, 517, 526, 3, 2, 2, 2, 518, 519, 12, 7, 2, 2, 519, 520, 7, 95, 2, 2, + 520, 521, 5, 106, 54, 2, 521, 522, 7, 96, 2, 2, 522, 526, 3, 2, 2, 2, 523, + 524, 12, 5, 2, 2, 524, 526, 5, 118, 60, 2, 525, 514, 3, 2, 2, 2, 525, 518, + 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, + 2, 2, 527, 528, 3, 2, 2, 2, 528, 107, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, + 530, 537, 7, 107, 2, 2, 531, 537, 7, 110, 2, 2, 532, 537, 7, 112, 2, 2, + 533, 537, 7, 113, 2, 2, 534, 537, 7, 114, 2, 2, 535, 537, 5, 152, 77, 2, + 536, 530, 3, 2, 2, 2, 536, 531, 3, 2, 2, 2, 536, 532, 3, 2, 2, 2, 536, + 533, 3, 2, 2, 2, 536, 534, 3, 2, 2, 2, 536, 535, 3, 2, 2, 2, 537, 109, + 3, 2, 2, 2, 538, 539, 5, 106, 54, 2, 539, 540, 7, 104, 2, 2, 540, 542, + 3, 2, 2, 2, 541, 538, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, + 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, + 546, 547, 5, 106, 54, 2, 547, 111, 3, 2, 2, 2, 548, 552, 7, 113, 2, 2, + 549, 552, 5, 114, 58, 2, 550, 552, 5, 116, 59, 2, 551, 548, 3, 2, 2, 2, + 551, 549, 3, 2, 2, 2, 551, 550, 3, 2, 2, 2, 552, 113, 3, 2, 2, 2, 553, + 554, 9, 8, 2, 2, 554, 115, 3, 2, 2, 2, 555, 556, 5, 50, 26, 2, 556, 117, + 3, 2, 2, 2, 557, 558, 9, 9, 2, 2, 558, 119, 3, 2, 2, 2, 559, 560, 5, 122, + 62, 2, 560, 561, 5, 106, 54, 2, 561, 121, 3, 2, 2, 2, 562, 563, 9, 10, + 2, 2, 563, 123, 3, 2, 2, 2, 564, 565, 7, 113, 2, 2, 565, 566, 7, 69, 2, + 2, 566, 567, 5, 126, 64, 2, 567, 125, 3, 2, 2, 2, 568, 569, 7, 97, 2, 2, + 569, 570, 5, 110, 56, 2, 570, 571, 7, 98, 2, 2, 571, 574, 3, 2, 2, 2, 572, + 574, 5, 76, 39, 2, 573, 568, 3, 2, 2, 2, 573, 572, 3, 2, 2, 2, 574, 127, + 3, 2, 2, 2, 575, 578, 5, 10, 6, 2, 576, 578, 5, 20, 11, 2, 577, 575, 3, + 2, 2, 2, 577, 576, 3, 2, 2, 2, 578, 129, 3, 2, 2, 2, 579, 580, 7, 70, 2, + 2, 580, 581, 7, 99, 2, 2, 581, 582, 5, 106, 54, 2, 582, 583, 7, 100, 2, + 2, 583, 586, 5, 128, 65, 2, 584, 585, 7, 71, 2, 2, 585, 587, 5, 128, 65, + 2, 586, 584, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 131, 3, 2, 2, 2, 588, + 589, 7, 72, 2, 2, 589, 596, 5, 124, 63, 2, 590, 591, 7, 73, 2, 2, 591, + 592, 7, 99, 2, 2, 592, 593, 5, 106, 54, 2, 593, 594, 7, 100, 2, 2, 594, + 596, 3, 2, 2, 2, 595, 588, 3, 2, 2, 2, 595, 590, 3, 2, 2, 2, 596, 597, + 3, 2, 2, 2, 597, 598, 5, 128, 65, 2, 598, 133, 3, 2, 2, 2, 599, 600, 5, + 136, 69, 2, 600, 601, 7, 102, 2, 2, 601, 135, 3, 2, 2, 2, 602, 603, 9, + 11, 2, 2, 603, 137, 3, 2, 2, 2, 604, 605, 7, 77, 2, 2, 605, 611, 7, 113, + 2, 2, 606, 608, 7, 99, 2, 2, 607, 609, 5, 66, 34, 2, 608, 607, 3, 2, 2, + 2, 608, 609, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 7, 100, 2, 2, + 611, 606, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 614, 3, 2, 2, 2, 613, + 615, 5, 18, 10, 2, 614, 613, 3, 2, 2, 2, 614, 615, 3, 2, 2, 2, 615, 617, + 3, 2, 2, 2, 616, 618, 5, 50, 26, 2, 617, 616, 3, 2, 2, 2, 617, 618, 3, + 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 620, 7, 102, 2, 2, 620, 139, 3, 2, + 2, 2, 621, 622, 7, 78, 2, 2, 622, 628, 7, 113, 2, 2, 623, 625, 7, 99, 2, + 2, 624, 626, 5, 142, 72, 2, 625, 624, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, + 626, 627, 3, 2, 2, 2, 627, 629, 7, 100, 2, 2, 628, 623, 3, 2, 2, 2, 628, + 629, 3, 2, 2, 2, 629, 631, 3, 2, 2, 2, 630, 632, 5, 18, 10, 2, 631, 630, + 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 633, 3, 2, 2, 2, 633, 634, 5, 20, + 11, 2, 634, 141, 3, 2, 2, 2, 635, 638, 5, 70, 36, 2, 636, 638, 5, 40, 21, + 2, 637, 635, 3, 2, 2, 2, 637, 636, 3, 2, 2, 2, 638, 143, 3, 2, 2, 2, 639, + 640, 7, 79, 2, 2, 640, 641, 7, 97, 2, 2, 641, 642, 11, 2, 2, 2, 642, 643, + 7, 98, 2, 2, 643, 145, 3, 2, 2, 2, 644, 645, 9, 12, 2, 2, 645, 147, 3, + 2, 2, 2, 646, 652, 7, 85, 2, 2, 647, 649, 7, 86, 2, 2, 648, 650, 7, 110, + 2, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 3, 2, 2, 2, + 651, 646, 3, 2, 2, 2, 651, 647, 3, 2, 2, 2, 652, 149, 3, 2, 2, 2, 653, + 654, 7, 87, 2, 2, 654, 655, 7, 113, 2, 2, 655, 661, 5, 82, 42, 2, 656, + 657, 7, 88, 2, 2, 657, 658, 5, 146, 74, 2, 658, 659, 5, 82, 42, 2, 659, + 661, 3, 2, 2, 2, 660, 653, 3, 2, 2, 2, 660, 656, 3, 2, 2, 2, 661, 151, + 3, 2, 2, 2, 662, 665, 5, 154, 78, 2, 663, 665, 7, 89, 2, 2, 664, 662, 3, + 2, 2, 2, 664, 663, 3, 2, 2, 2, 665, 153, 3, 2, 2, 2, 666, 668, 7, 113, + 2, 2, 667, 669, 5, 146, 74, 2, 668, 667, 3, 2, 2, 2, 668, 669, 3, 2, 2, + 2, 669, 675, 3, 2, 2, 2, 670, 671, 7, 56, 2, 2, 671, 672, 7, 99, 2, 2, + 672, 673, 7, 113, 2, 2, 673, 675, 7, 100, 2, 2, 674, 666, 3, 2, 2, 2, 674, + 670, 3, 2, 2, 2, 675, 155, 3, 2, 2, 2, 676, 677, 9, 13, 2, 2, 677, 157, + 3, 2, 2, 2, 678, 684, 5, 156, 79, 2, 679, 681, 7, 99, 2, 2, 680, 682, 5, + 110, 56, 2, 681, 680, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 3, 2, + 2, 2, 683, 685, 7, 100, 2, 2, 684, 679, 3, 2, 2, 2, 684, 685, 3, 2, 2, + 2, 685, 686, 3, 2, 2, 2, 686, 689, 5, 22, 12, 2, 687, 690, 5, 76, 39, 2, + 688, 690, 5, 30, 16, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, + 159, 3, 2, 2, 2, 691, 692, 5, 158, 80, 2, 692, 693, 7, 102, 2, 2, 693, + 696, 3, 2, 2, 2, 694, 696, 5, 150, 76, 2, 695, 691, 3, 2, 2, 2, 695, 694, + 3, 2, 2, 2, 696, 161, 3, 2, 2, 2, 697, 700, 5, 164, 83, 2, 698, 700, 5, + 166, 84, 2, 699, 697, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 163, 3, 2, + 2, 2, 701, 702, 7, 92, 2, 2, 702, 703, 5, 168, 85, 2, 703, 704, 7, 102, + 2, 2, 704, 165, 3, 2, 2, 2, 705, 707, 7, 93, 2, 2, 706, 708, 5, 168, 85, + 2, 707, 706, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, + 715, 7, 113, 2, 2, 710, 712, 7, 99, 2, 2, 711, 713, 5, 170, 86, 2, 712, + 711, 3, 2, 2, 2, 712, 713, 3, 2, 2, 2, 713, 714, 3, 2, 2, 2, 714, 716, + 7, 100, 2, 2, 715, 710, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 717, 3, + 2, 2, 2, 717, 719, 5, 26, 14, 2, 718, 720, 5, 18, 10, 2, 719, 718, 3, 2, + 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 722, 7, 97, 2, 2, + 722, 723, 11, 2, 2, 2, 723, 724, 7, 98, 2, 2, 724, 167, 3, 2, 2, 2, 725, + 726, 9, 14, 2, 2, 726, 169, 3, 2, 2, 2, 727, 730, 5, 70, 36, 2, 728, 730, + 5, 110, 56, 2, 729, 727, 3, 2, 2, 2, 729, 728, 3, 2, 2, 2, 730, 171, 3, + 2, 2, 2, 75, 176, 180, 185, 192, 211, 217, 222, 234, 252, 261, 268, 283, + 292, 305, 309, 313, 318, 320, 341, 347, 351, 358, 371, 392, 396, 400, 404, + 415, 418, 426, 433, 440, 453, 464, 471, 474, 485, 496, 506, 512, 525, 527, + 536, 543, 551, 573, 577, 586, 595, 608, 611, 614, 617, 625, 628, 631, 637, + 649, 651, 660, 664, 668, 674, 681, 684, 689, 695, 699, 707, 712, 715, 719, + 729, } var literalNames = []string{ "", "'OPENQASM'", "'include'", "'qubit'", "'qreg'", "'bit'", "'creg'", @@ -4438,6 +4439,7 @@ func (s *BitDeclarationContext) ExitRule(listener antlr.ParseTreeListener) { func (p *qasm3Parser) BitDeclaration() (localctx IBitDeclarationContext) { localctx = NewBitDeclarationContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 58, qasm3ParserRULE_bitDeclaration) + var _la int defer func() { p.ExitRule() @@ -4464,9 +4466,16 @@ func (p *qasm3Parser) BitDeclaration() (localctx IBitDeclarationContext) { p.SetState(337) p.Match(qasm3ParserIdentifier) } - { - p.SetState(338) - p.Designator() + p.SetState(339) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + if _la == qasm3ParserLBRACKET { + { + p.SetState(338) + p.Designator() + } + } return localctx @@ -4590,35 +4599,35 @@ func (p *qasm3Parser) ClassicalVariableDeclaration() (localctx IClassicalVariabl } }() - p.SetState(344) + p.SetState(345) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case qasm3ParserT__6, qasm3ParserT__7, qasm3ParserT__8, qasm3ParserT__9: p.EnterOuterAlt(localctx, 1) { - p.SetState(340) + p.SetState(341) p.SingleDesignatorDeclaration() } case qasm3ParserT__10: p.EnterOuterAlt(localctx, 2) { - p.SetState(341) + p.SetState(342) p.DoubleDesignatorDeclaration() } case qasm3ParserT__11, qasm3ParserT__82, qasm3ParserT__83: p.EnterOuterAlt(localctx, 3) { - p.SetState(342) + p.SetState(343) p.NoDesignatorDeclaration() } case qasm3ParserT__4, qasm3ParserT__5: p.EnterOuterAlt(localctx, 4) { - p.SetState(343) + p.SetState(344) p.BitDeclaration() } @@ -4730,16 +4739,16 @@ func (p *qasm3Parser) ClassicalDeclaration() (localctx IClassicalDeclarationCont p.EnterOuterAlt(localctx, 1) { - p.SetState(346) + p.SetState(347) p.ClassicalVariableDeclaration() } - p.SetState(348) + p.SetState(349) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if (((_la-57)&-(0x1f+1)) == 0 && ((1< Date: Sun, 3 Jan 2021 16:59:04 +0300 Subject: [PATCH 3/4] implement call gate --- cmd/qasm3/main.go | 7 +++--- example/teleport.qasm | 29 +++++++++++----------- pkg/machine/register.go | 36 +++++++++++++++++++++------- pkg/machine/register_qasm3.go | 45 ++++++++++++++++++++++++++++------- 4 files changed, 83 insertions(+), 34 deletions(-) diff --git a/cmd/qasm3/main.go b/cmd/qasm3/main.go index c04d519..8787372 100644 --- a/cmd/qasm3/main.go +++ b/cmd/qasm3/main.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "os" + stdpath "path" "github.com/Quant-Team/qvm/pkg/machine" ) @@ -21,10 +22,10 @@ func init() { func main() { - register := machine.NewRegisterQasm(debug) - - register.ParseProgramm(path) + dir := stdpath.Dir(path) + register := machine.NewRegisterQasm(debug, dir) + register.ParseProgram(path) w := os.Stdout pp := register.Probability() fmt.Fprintf(w, "q.Probability: %v\n", pp) diff --git a/example/teleport.qasm b/example/teleport.qasm index 07c2479..09db92a 100644 --- a/example/teleport.qasm +++ b/example/teleport.qasm @@ -2,29 +2,30 @@ OPENQASM 3; include "stdgates.inc"; -qubit q[3]; +gate post q { } + +qubit qb[3]; bit c0; bit c1; bit c2; -gate post q { } -reset q; +reset qb; -h q[1]; -cx q[1], q[2]; +h qb[1]; +cx qb[1], qb[2]; -barrier q; +barrier qb; -cx q[0], q[1]; -h q[0]; +cx qb[0], qb[1]; +h qb[0]; -c0 = measure q[0]; -c1 = measure q[1]; +c0 = measure qb[0]; +c1 = measure qb[1]; -if(c0==1) { z q[2]; } -if(c1==1) { x q[2]; } +if(c0==1) { z qb[2]; } +if(c1==1) { x qb[2]; } -post q[2]; +post qb[2]; -c2 = measure q[2]; +c2 = measure qb[2]; diff --git a/pkg/machine/register.go b/pkg/machine/register.go index f524607..1c2f076 100644 --- a/pkg/machine/register.go +++ b/pkg/machine/register.go @@ -15,13 +15,29 @@ type Register interface { Measure() []circuit.Qubiter } +type regPos [2]int + +func (r *register) NewRegPos(length int) regPos { + return regPos([2]int{len(r.q), length}) +} + +func (r regPos) GetStart() int { + return r[0] +} + +func (r regPos) GetEnd() int { + return r[1] +} + type register struct { *qasm3.Baseqasm3Listener - debug bool - bits map[string]Bit - gates map[string]struct{} - q []circuit.Qubiter + debug bool + dir string + bits map[string]Bit + gates map[string]struct{} + qbName map[string]regPos + q []circuit.Qubiter } type Bit int @@ -68,11 +84,13 @@ func NewRegister(cfg *config.Register, state []Bit) (r *register, err error) { return } -func NewRegisterQasm(debug bool) (r *register) { +func NewRegisterQasm(debug bool, dir string) (r *register) { return ®ister{ - debug: debug, - q: []circuit.Qubiter{}, - bits: map[string]Bit{}, - gates: map[string]struct{}{}, + debug: debug, + dir: dir, + q: []circuit.Qubiter{}, + qbName: map[string]regPos{}, + bits: map[string]Bit{}, + gates: map[string]struct{}{}, } } diff --git a/pkg/machine/register_qasm3.go b/pkg/machine/register_qasm3.go index dc9668e..e78641a 100644 --- a/pkg/machine/register_qasm3.go +++ b/pkg/machine/register_qasm3.go @@ -4,6 +4,7 @@ import ( "fmt" "io/ioutil" "os" + "path" "strconv" "strings" @@ -24,7 +25,8 @@ func (r *register) ExitVersion(c *qasm3.VersionContext) { func (r *register) ExitInclude(c *qasm3.IncludeContext) { include := c.StringLiteral().GetText() fmt.Println("Include:", include) - r.ParseProgramm(strings.ReplaceAll(include, "\"", "")) + ipath := path.Join(r.dir, strings.ReplaceAll(include, "\"", "")) + r.ParseProgram(ipath) } func (r *register) EnterQuantumDeclaration(c *qasm3.QuantumDeclarationContext) { @@ -35,8 +37,9 @@ func (r *register) EnterQuantumDeclaration(c *qasm3.QuantumDeclarationContext) { switch v2 := ch2.(type) { case *qasm3.DesignatorContext: i, _ := strconv.Atoi(v2.Expression().GetText()) + r.qbName[v.Identifier().GetText()] = r.NewRegPos(i) for j := 0; j < i; j++ { - r.q = append(r.q, circuit.Zero()) + r.q = append(r.q, nil) } } } @@ -44,26 +47,48 @@ func (r *register) EnterQuantumDeclaration(c *qasm3.QuantumDeclarationContext) { } } +func (r *register) EnterQuantumGateCall(c *qasm3.QuantumGateCallContext) { + v := c.QuantumGateName().GetText() + switch v { + case "reset": + qb := c.IndexIdentifierList().GetText() + rp := r.qbName[qb] + for j := rp.GetStart(); j < rp.GetEnd(); j++ { + r.q[j] = circuit.Zero() + } + default: + if _, ok := r.gates[v]; ok { + fmt.Println(">>>", v) + } + } +} + +func (r *register) EnterGlobalStatement(c *qasm3.GlobalStatementContext) { + fmt.Println(">>>", c.GetText()) +} + func (r *register) EnterQuantumGateDefinition(c *qasm3.QuantumGateDefinitionContext) { - signature := c.QuantumGateSignature().GetText() - if _, ok := r.gates[signature]; !ok { - r.gates[signature] = struct{}{} + signature := c.QuantumGateSignature().(*qasm3.QuantumGateSignatureContext) + i := signature.Identifier().GetText() + if _, ok := r.gates[i]; !ok { + r.gates[i] = struct{}{} return } - panic("gate " + signature + " exists") + panic("gate " + i + " exists") } func (r *register) ExitBitDeclaration(c *qasm3.BitDeclarationContext) { r.bits[c.Identifier().GetText()] = Zero } -func (r *register) ParseProgramm(path string) { +func (r *register) ParseProgram(path string) { qasmFile, err := ioutil.ReadFile(path) if err != nil { fmt.Println("read schema failed", err.Error()) os.Exit(2) } + fmt.Println("parse:", path) // Setup the input is := antlr.NewInputStream(string(qasmFile)) @@ -87,5 +112,9 @@ func (r *register) ParseProgramm(path string) { p := qasm3.Newqasm3Parser(stream) // Finally parse the expression (by walking the tree) - antlr.ParseTreeWalkerDefault.Walk(r, p.Program()) + var parse antlr.Tree = p.Program() + if parse == nil { + parse = p.Statement() + } + antlr.ParseTreeWalkerDefault.Walk(r, parse) } From bc9fc8413d85af755649a2fd1dbb52e59e811ea6 Mon Sep 17 00:00:00 2001 From: Alexandr Kozlenkov Date: Wed, 6 Jan 2021 01:57:11 +0300 Subject: [PATCH 4/4] added cnot for milti-qubit --- example/stdgates.inc | 128 +++++++++++++------------- go.mod | 1 + go.sum | 21 +++++ internal/qasm3.g4 | 4 +- internal/qasm3/qasm3Lexer.interp | 2 +- internal/qasm3/qasm3_lexer.go | 129 ++++++++++++++------------- pkg/circuit/gates/multi/cnot.go | 71 +++++++++++++++ pkg/circuit/gates/multi/cnot_test.go | 12 +++ pkg/machine/register_qasm3.go | 18 +++- 9 files changed, 253 insertions(+), 133 deletions(-) create mode 100644 pkg/circuit/gates/multi/cnot.go create mode 100644 pkg/circuit/gates/multi/cnot_test.go diff --git a/example/stdgates.inc b/example/stdgates.inc index 8ca1317..f6f7095 100644 --- a/example/stdgates.inc +++ b/example/stdgates.inc @@ -15,83 +15,83 @@ gate z a { phase(pi) a; } // Clifford gate: Hadamard gate h a { U(pi / 2, 0, pi) a; } // Clifford gate: sqrt(Z) phase gate -gate s a { phase(pi / 2) a; } +// gate s a { phase(pi / 2) a; } // Clifford gate: conjugate of sqrt(Z) -gate sdg a { phase(-pi / 2) a; } +// gate sdg a { phase(-pi / 2) a; } // C3 gate: sqrt(S) phase gate gate t a { phase(pi/4) a; } // C3 gate: conjugate of sqrt(S) -gate tdg a { phase(-pi/4) a; } +// gate tdg a { phase(-pi/4) a; } // Rotation around X-axis -gate rx(angle[32]:theta) a { U(theta, -pi / 2, pi / 2) a; } +// gate rx(angle[32]:theta) a { U(theta, -pi / 2, pi / 2) a; } // rotation around Y-axis -gate ry(angle[32]:theta) a { U(theta, 0, 0) a; } +// gate ry(angle[32]:theta) a { U(theta, 0, 0) a; } // rotation around Z axis -gate rz(angle[32]:phi) a { phase(phi) a; } +// gate rz(angle[32]:phi) a { phase(phi) a; } // controlled-Phase -gate cz a, b { h b; cx a, b; h b; } +// gate cz a, b { h b; cx a, b; h b; } // controlled-Y -gate cy a, b { sdg b; cx a, b; s b; } +// gate cy a, b { sdg b; cx a, b; s b; } // controlled-H -gate ch a, b { - h b; - sdg b; - cx a, b; - h b; - t b; - cx a, b; - t b; s a; - h b; - s b; - x b; -} +// gate ch a, b { + // h b; + // sdg b; + // cx a, b; + // h b; + // t b; + // cx a, b; + // t b; s a; + // h b; + // s b; + // x b; +// } // Toffoli -gate ccx a, b, c -{ - h c; - cx b, c; - tdg c; - cx a, c; - t c; - cx b, c; - tdg c; - cx a, c; - t b; t c; h c; - cx a, b; - t a; tdg b; - cx a, b; -} +// gate ccx a, b, c +// { + // h c; + // cx b, c; + // tdg c; + // cx a, c; + // t c; + // cx b, c; + // tdg c; + // cx a, c; + // t b; t c; h c; + // cx a, b; + // t a; tdg b; + // cx a, b; +// } // controlled-swap -gate cswap a, b, c -{ - cx c, b; - ccx a, b, c; - cx c, b; -} +// gate cswap a, b, c +// { + // cx c, b; + // ccx a, b, c; + // cx c, b; +// } // controlled-rz -gate crz(angle[32]:lambda) a, b -{ - phase(lambda / 2) b; - cx a, b; - phase(-lambda / 2) b; - cx a, b; -} +// gate crz(angle[32]:lambda) a, b +// { + // phase(lambda / 2) b; + // cx a, b; + // phase(-lambda / 2) b; + // cx a, b; +// } // controlled-phase -gate cphase(angle[32]:lambda) a, b -{ - phase(lambda / 2) a; - cx a, b; - phase(-lambda / 2) b; - cx a, b; - phase(lambda / 2) b; -} +// gate cphase(angle[32]:lambda) a, b +// { + // phase(lambda / 2) a; + // cx a, b; + // phase(-lambda / 2) b; + // cx a, b; + // phase(lambda / 2) b; +// } // controlled-U -gate cu(angle[32]:theta,angle[32]:phi,angle[32]:lambda) c, t -{ +// gate cu(angle[32]:theta,angle[32]:phi,angle[32]:lambda) c, t +// { // implements controlled-U(theta,phi,lambda) with target t and control c - phase((lambda - phi)/2) t; - cx c,t; - U(-theta / 2, 0, -(phi + lambda) / 2) t; - cx c, t; - U(theta / 2, phi, 0) t; -} + // phase((lambda - phi)/2) t; + // cx c,t; + // U(-theta / 2, 0, -(phi + lambda) / 2) t; + // cx c, t; + // U(theta / 2, phi, 0) t; +// } diff --git a/go.mod b/go.mod index fd05f53..67e5363 100644 --- a/go.mod +++ b/go.mod @@ -5,5 +5,6 @@ go 1.13 require ( github.com/antlr/antlr4 v0.0.0-20210101015028-491cb7861390 github.com/gorilla/mux v1.7.3 + github.com/sah4ez/cqc v0.0.0-20190718151448-d4941c908f85 gorgonia.org/tensor v0.9.1 ) diff --git a/go.sum b/go.sum index 5a0156c..1a1f847 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/antlr/antlr4 v0.0.0-20210101015028-491cb7861390 h1:NWBORai/tEFrLdEEgdg7s8JQ9XKRy8B4itZhQC/TlK8= github.com/antlr/antlr4 v0.0.0-20210101015028-491cb7861390/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= @@ -6,12 +7,18 @@ github.com/chewxy/hm v1.0.0/go.mod h1:qg9YI4q6Fkj/whwHR1D+bOGeF7SniIP40VweVepLjg github.com/chewxy/math32 v1.0.0/go.mod h1:Miac6hA1ohdDUTagnvJy/q+aNnEk16qWUdb8ZVhvCN0= github.com/chewxy/math32 v1.0.4 h1:dfqy3+BbCmet2zCkaDaIQv9fpMxnmYYlAEV2Iqe3DZo= github.com/chewxy/math32 v1.0.4/go.mod h1:dOB2rcuFrCn6UHrze36WSLVPKtzPMRAQvBvUwkSsLqs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/flatbuffers v1.11.0 h1:O7CEyB8Cb3/DmtxODGtLHcEvpr81Jm5qLg/hsHnxA2A= @@ -21,10 +28,13 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sah4ez/cqc v0.0.0-20190718151448-d4941c908f85 h1:l5nMoz6bstSNKlkbKzlLTBXK3Vnnhvqk8Z5rr073mkw= +github.com/sah4ez/cqc v0.0.0-20190718151448-d4941c908f85/go.mod h1:QmmaMli9W74merDHUSqfLfU+kM9WR2NLPmdjEjD55tQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= @@ -35,7 +45,14 @@ golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -43,6 +60,9 @@ gonum.org/v1/gonum v0.0.0-20190902003836-43865b531bee h1:4pVWuAEGpaPZ7dPfd6aA8Ly gonum.org/v1/gonum v0.0.0-20190902003836-43865b531bee/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -52,4 +72,5 @@ gorgonia.org/vecf32 v0.9.0 h1:PClazic1r+JVJ1dEzRXgeiVl4g1/Hf/w+wUSqnco1Xg= gorgonia.org/vecf32 v0.9.0/go.mod h1:NCc+5D2oxddRL11hd+pCB1PEyXWOyiQxfZ/1wwhOXCA= gorgonia.org/vecf64 v0.9.0 h1:bgZDP5x0OzBF64PjMGC3EvTdOoMEcmfAh1VCUnZFm1A= gorgonia.org/vecf64 v0.9.0/go.mod h1:hp7IOWCnRiVQKON73kkC/AUMtEXyf9kGlVrtPQ9ccVA= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/qasm3.g4 b/internal/qasm3.g4 index 3c7f6ad..234e302 100644 --- a/internal/qasm3.g4 +++ b/internal/qasm3.g4 @@ -450,7 +450,7 @@ ARROW : '->' ; Constant : 'pi' | 'π' | 'tau' | '𝜏' | 'euler' | 'e' ; Whitespace : [ \t]+ -> skip ; -Newline : [\r\n]+ -> skip ; +Newline : [\n]+ -> skip ; fragment Digit : [0-9] ; Integer : Digit+ ; @@ -482,5 +482,5 @@ fragment AnyString : ~[ \t\r\n]+? ; fragment Any : ( AnyString | Whitespace | Newline )+ ; fragment AnyBlock : LBRACE Any? RBRACE ; -LineComment : '//' Any ; // Token because Any matches all strings +LineComment : '//' ~('\r' | '\n')* ; // Token because Any matches all strings BlockComment : '/*' Any '*/' ; // Token because Any matches all strings diff --git a/internal/qasm3/qasm3Lexer.interp b/internal/qasm3/qasm3Lexer.interp index 55adbac..eb5a6a6 100644 --- a/internal/qasm3/qasm3Lexer.interp +++ b/internal/qasm3/qasm3Lexer.interp @@ -366,4 +366,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 116, 814, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 714, 10, 106, 3, 107, 6, 107, 717, 10, 107, 13, 107, 14, 107, 718, 3, 107, 3, 107, 3, 108, 6, 108, 724, 10, 108, 13, 108, 14, 108, 725, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 6, 110, 733, 10, 110, 13, 110, 14, 110, 734, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 7, 115, 746, 10, 115, 12, 115, 14, 115, 749, 11, 115, 3, 115, 3, 115, 6, 115, 753, 10, 115, 13, 115, 14, 115, 754, 3, 116, 3, 116, 3, 116, 5, 116, 760, 10, 116, 3, 116, 3, 116, 5, 116, 764, 10, 116, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 770, 10, 117, 3, 118, 3, 118, 7, 118, 774, 10, 118, 12, 118, 14, 118, 777, 11, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 6, 121, 786, 10, 121, 13, 121, 14, 121, 787, 3, 122, 3, 122, 3, 122, 6, 122, 793, 10, 122, 13, 122, 14, 122, 794, 3, 123, 3, 123, 5, 123, 799, 10, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 787, 2, 126, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 2, 219, 110, 221, 2, 223, 2, 225, 2, 227, 2, 229, 111, 231, 112, 233, 2, 235, 113, 237, 2, 239, 114, 241, 2, 243, 2, 245, 2, 247, 115, 249, 116, 3, 2, 11, 4, 2, 11, 11, 34, 34, 4, 2, 12, 12, 15, 15, 3, 2, 50, 59, 3, 2, 99, 124, 3, 2, 67, 92, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 36, 36, 41, 41, 5, 2, 11, 12, 15, 15, 34, 34, 3, 3, 2, 55057, 3, 55057, 3, 824, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 3, 251, 3, 2, 2, 2, 5, 260, 3, 2, 2, 2, 7, 268, 3, 2, 2, 2, 9, 274, 3, 2, 2, 2, 11, 279, 3, 2, 2, 2, 13, 283, 3, 2, 2, 2, 15, 288, 3, 2, 2, 2, 17, 292, 3, 2, 2, 2, 19, 297, 3, 2, 2, 2, 21, 303, 3, 2, 2, 2, 23, 309, 3, 2, 2, 2, 25, 315, 3, 2, 2, 2, 27, 320, 3, 2, 2, 2, 29, 326, 3, 2, 2, 2, 31, 330, 3, 2, 2, 2, 33, 333, 3, 2, 2, 2, 35, 338, 3, 2, 2, 2, 37, 346, 3, 2, 2, 2, 39, 354, 3, 2, 2, 2, 41, 358, 3, 2, 2, 2, 43, 362, 3, 2, 2, 2, 45, 367, 3, 2, 2, 2, 47, 369, 3, 2, 2, 2, 49, 372, 3, 2, 2, 2, 51, 374, 3, 2, 2, 2, 53, 380, 3, 2, 2, 2, 55, 382, 3, 2, 2, 2, 57, 384, 3, 2, 2, 2, 59, 386, 3, 2, 2, 2, 61, 388, 3, 2, 2, 2, 63, 390, 3, 2, 2, 2, 65, 392, 3, 2, 2, 2, 67, 395, 3, 2, 2, 2, 69, 398, 3, 2, 2, 2, 71, 403, 3, 2, 2, 2, 73, 408, 3, 2, 2, 2, 75, 411, 3, 2, 2, 2, 77, 413, 3, 2, 2, 2, 79, 415, 3, 2, 2, 2, 81, 417, 3, 2, 2, 2, 83, 419, 3, 2, 2, 2, 85, 421, 3, 2, 2, 2, 87, 424, 3, 2, 2, 2, 89, 427, 3, 2, 2, 2, 91, 430, 3, 2, 2, 2, 93, 433, 3, 2, 2, 2, 95, 440, 3, 2, 2, 2, 97, 444, 3, 2, 2, 2, 99, 448, 3, 2, 2, 2, 101, 452, 3, 2, 2, 2, 103, 456, 3, 2, 2, 2, 105, 459, 3, 2, 2, 2, 107, 464, 3, 2, 2, 2, 109, 473, 3, 2, 2, 2, 111, 482, 3, 2, 2, 2, 113, 485, 3, 2, 2, 2, 115, 488, 3, 2, 2, 2, 117, 491, 3, 2, 2, 2, 119, 494, 3, 2, 2, 2, 121, 497, 3, 2, 2, 2, 123, 500, 3, 2, 2, 2, 125, 503, 3, 2, 2, 2, 127, 506, 3, 2, 2, 2, 129, 509, 3, 2, 2, 2, 131, 512, 3, 2, 2, 2, 133, 516, 3, 2, 2, 2, 135, 520, 3, 2, 2, 2, 137, 523, 3, 2, 2, 2, 139, 526, 3, 2, 2, 2, 141, 531, 3, 2, 2, 2, 143, 535, 3, 2, 2, 2, 145, 541, 3, 2, 2, 2, 147, 547, 3, 2, 2, 2, 149, 556, 3, 2, 2, 2, 151, 560, 3, 2, 2, 2, 153, 567, 3, 2, 2, 2, 155, 571, 3, 2, 2, 2, 157, 579, 3, 2, 2, 2, 159, 582, 3, 2, 2, 2, 161, 585, 3, 2, 2, 2, 163, 588, 3, 2, 2, 2, 165, 591, 3, 2, 2, 2, 167, 593, 3, 2, 2, 2, 169, 600, 3, 2, 2, 2, 171, 608, 3, 2, 2, 2, 173, 614, 3, 2, 2, 2, 175, 620, 3, 2, 2, 2, 177, 631, 3, 2, 2, 2, 179, 637, 3, 2, 2, 2, 181, 644, 3, 2, 2, 2, 183, 658, 3, 2, 2, 2, 185, 665, 3, 2, 2, 2, 187, 675, 3, 2, 2, 2, 189, 677, 3, 2, 2, 2, 191, 679, 3, 2, 2, 2, 193, 681, 3, 2, 2, 2, 195, 683, 3, 2, 2, 2, 197, 685, 3, 2, 2, 2, 199, 687, 3, 2, 2, 2, 201, 689, 3, 2, 2, 2, 203, 691, 3, 2, 2, 2, 205, 693, 3, 2, 2, 2, 207, 695, 3, 2, 2, 2, 209, 697, 3, 2, 2, 2, 211, 713, 3, 2, 2, 2, 213, 716, 3, 2, 2, 2, 215, 723, 3, 2, 2, 2, 217, 729, 3, 2, 2, 2, 219, 732, 3, 2, 2, 2, 221, 736, 3, 2, 2, 2, 223, 738, 3, 2, 2, 2, 225, 740, 3, 2, 2, 2, 227, 742, 3, 2, 2, 2, 229, 747, 3, 2, 2, 2, 231, 756, 3, 2, 2, 2, 233, 769, 3, 2, 2, 2, 235, 771, 3, 2, 2, 2, 237, 778, 3, 2, 2, 2, 239, 780, 3, 2, 2, 2, 241, 785, 3, 2, 2, 2, 243, 792, 3, 2, 2, 2, 245, 796, 3, 2, 2, 2, 247, 802, 3, 2, 2, 2, 249, 807, 3, 2, 2, 2, 251, 252, 7, 81, 2, 2, 252, 253, 7, 82, 2, 2, 253, 254, 7, 71, 2, 2, 254, 255, 7, 80, 2, 2, 255, 256, 7, 83, 2, 2, 256, 257, 7, 67, 2, 2, 257, 258, 7, 85, 2, 2, 258, 259, 7, 79, 2, 2, 259, 4, 3, 2, 2, 2, 260, 261, 7, 107, 2, 2, 261, 262, 7, 112, 2, 2, 262, 263, 7, 101, 2, 2, 263, 264, 7, 110, 2, 2, 264, 265, 7, 119, 2, 2, 265, 266, 7, 102, 2, 2, 266, 267, 7, 103, 2, 2, 267, 6, 3, 2, 2, 2, 268, 269, 7, 115, 2, 2, 269, 270, 7, 119, 2, 2, 270, 271, 7, 100, 2, 2, 271, 272, 7, 107, 2, 2, 272, 273, 7, 118, 2, 2, 273, 8, 3, 2, 2, 2, 274, 275, 7, 115, 2, 2, 275, 276, 7, 116, 2, 2, 276, 277, 7, 103, 2, 2, 277, 278, 7, 105, 2, 2, 278, 10, 3, 2, 2, 2, 279, 280, 7, 100, 2, 2, 280, 281, 7, 107, 2, 2, 281, 282, 7, 118, 2, 2, 282, 12, 3, 2, 2, 2, 283, 284, 7, 101, 2, 2, 284, 285, 7, 116, 2, 2, 285, 286, 7, 103, 2, 2, 286, 287, 7, 105, 2, 2, 287, 14, 3, 2, 2, 2, 288, 289, 7, 107, 2, 2, 289, 290, 7, 112, 2, 2, 290, 291, 7, 118, 2, 2, 291, 16, 3, 2, 2, 2, 292, 293, 7, 119, 2, 2, 293, 294, 7, 107, 2, 2, 294, 295, 7, 112, 2, 2, 295, 296, 7, 118, 2, 2, 296, 18, 3, 2, 2, 2, 297, 298, 7, 104, 2, 2, 298, 299, 7, 110, 2, 2, 299, 300, 7, 113, 2, 2, 300, 301, 7, 99, 2, 2, 301, 302, 7, 118, 2, 2, 302, 20, 3, 2, 2, 2, 303, 304, 7, 99, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 105, 2, 2, 306, 307, 7, 110, 2, 2, 307, 308, 7, 103, 2, 2, 308, 22, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 107, 2, 2, 311, 312, 7, 122, 2, 2, 312, 313, 7, 103, 2, 2, 313, 314, 7, 102, 2, 2, 314, 24, 3, 2, 2, 2, 315, 316, 7, 100, 2, 2, 316, 317, 7, 113, 2, 2, 317, 318, 7, 113, 2, 2, 318, 319, 7, 110, 2, 2, 319, 26, 3, 2, 2, 2, 320, 321, 7, 101, 2, 2, 321, 322, 7, 113, 2, 2, 322, 323, 7, 112, 2, 2, 323, 324, 7, 117, 2, 2, 324, 325, 7, 118, 2, 2, 325, 28, 3, 2, 2, 2, 326, 327, 7, 110, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 118, 2, 2, 329, 30, 3, 2, 2, 2, 330, 331, 7, 126, 2, 2, 331, 332, 7, 126, 2, 2, 332, 32, 3, 2, 2, 2, 333, 334, 7, 105, 2, 2, 334, 335, 7, 99, 2, 2, 335, 336, 7, 118, 2, 2, 336, 337, 7, 103, 2, 2, 337, 34, 3, 2, 2, 2, 338, 339, 7, 111, 2, 2, 339, 340, 7, 103, 2, 2, 340, 341, 7, 99, 2, 2, 341, 342, 7, 117, 2, 2, 342, 343, 7, 119, 2, 2, 343, 344, 7, 116, 2, 2, 344, 345, 7, 103, 2, 2, 345, 36, 3, 2, 2, 2, 346, 347, 7, 100, 2, 2, 347, 348, 7, 99, 2, 2, 348, 349, 7, 116, 2, 2, 349, 350, 7, 116, 2, 2, 350, 351, 7, 107, 2, 2, 351, 352, 7, 103, 2, 2, 352, 353, 7, 116, 2, 2, 353, 38, 3, 2, 2, 2, 354, 355, 7, 107, 2, 2, 355, 356, 7, 112, 2, 2, 356, 357, 7, 120, 2, 2, 357, 40, 3, 2, 2, 2, 358, 359, 7, 114, 2, 2, 359, 360, 7, 113, 2, 2, 360, 361, 7, 121, 2, 2, 361, 42, 3, 2, 2, 2, 362, 363, 7, 101, 2, 2, 363, 364, 7, 118, 2, 2, 364, 365, 7, 116, 2, 2, 365, 366, 7, 110, 2, 2, 366, 44, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 46, 3, 2, 2, 2, 369, 370, 7, 69, 2, 2, 370, 371, 7, 90, 2, 2, 371, 48, 3, 2, 2, 2, 372, 373, 7, 87, 2, 2, 373, 50, 3, 2, 2, 2, 374, 375, 7, 116, 2, 2, 375, 376, 7, 103, 2, 2, 376, 377, 7, 117, 2, 2, 377, 378, 7, 103, 2, 2, 378, 379, 7, 118, 2, 2, 379, 52, 3, 2, 2, 2, 380, 381, 7, 128, 2, 2, 381, 54, 3, 2, 2, 2, 382, 383, 7, 35, 2, 2, 383, 56, 3, 2, 2, 2, 384, 385, 7, 45, 2, 2, 385, 58, 3, 2, 2, 2, 386, 387, 7, 47, 2, 2, 387, 60, 3, 2, 2, 2, 388, 389, 7, 44, 2, 2, 389, 62, 3, 2, 2, 2, 390, 391, 7, 49, 2, 2, 391, 64, 3, 2, 2, 2, 392, 393, 7, 62, 2, 2, 393, 394, 7, 62, 2, 2, 394, 66, 3, 2, 2, 2, 395, 396, 7, 64, 2, 2, 396, 397, 7, 64, 2, 2, 397, 68, 3, 2, 2, 2, 398, 399, 7, 116, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 118, 2, 2, 401, 402, 7, 110, 2, 2, 402, 70, 3, 2, 2, 2, 403, 404, 7, 116, 2, 2, 404, 405, 7, 113, 2, 2, 405, 406, 7, 118, 2, 2, 406, 407, 7, 116, 2, 2, 407, 72, 3, 2, 2, 2, 408, 409, 7, 40, 2, 2, 409, 410, 7, 40, 2, 2, 410, 74, 3, 2, 2, 2, 411, 412, 7, 40, 2, 2, 412, 76, 3, 2, 2, 2, 413, 414, 7, 126, 2, 2, 414, 78, 3, 2, 2, 2, 415, 416, 7, 96, 2, 2, 416, 80, 3, 2, 2, 2, 417, 418, 7, 64, 2, 2, 418, 82, 3, 2, 2, 2, 419, 420, 7, 62, 2, 2, 420, 84, 3, 2, 2, 2, 421, 422, 7, 64, 2, 2, 422, 423, 7, 63, 2, 2, 423, 86, 3, 2, 2, 2, 424, 425, 7, 62, 2, 2, 425, 426, 7, 63, 2, 2, 426, 88, 3, 2, 2, 2, 427, 428, 7, 63, 2, 2, 428, 429, 7, 63, 2, 2, 429, 90, 3, 2, 2, 2, 430, 431, 7, 35, 2, 2, 431, 432, 7, 63, 2, 2, 432, 92, 3, 2, 2, 2, 433, 434, 7, 116, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 118, 2, 2, 436, 437, 7, 119, 2, 2, 437, 438, 7, 116, 2, 2, 438, 439, 7, 112, 2, 2, 439, 94, 3, 2, 2, 2, 440, 441, 7, 117, 2, 2, 441, 442, 7, 107, 2, 2, 442, 443, 7, 112, 2, 2, 443, 96, 3, 2, 2, 2, 444, 445, 7, 101, 2, 2, 445, 446, 7, 113, 2, 2, 446, 447, 7, 117, 2, 2, 447, 98, 3, 2, 2, 2, 448, 449, 7, 118, 2, 2, 449, 450, 7, 99, 2, 2, 450, 451, 7, 112, 2, 2, 451, 100, 3, 2, 2, 2, 452, 453, 7, 103, 2, 2, 453, 454, 7, 122, 2, 2, 454, 455, 7, 114, 2, 2, 455, 102, 3, 2, 2, 2, 456, 457, 7, 110, 2, 2, 457, 458, 7, 112, 2, 2, 458, 104, 3, 2, 2, 2, 459, 460, 7, 117, 2, 2, 460, 461, 7, 115, 2, 2, 461, 462, 7, 116, 2, 2, 462, 463, 7, 118, 2, 2, 463, 106, 3, 2, 2, 2, 464, 465, 7, 114, 2, 2, 465, 466, 7, 113, 2, 2, 466, 467, 7, 114, 2, 2, 467, 468, 7, 101, 2, 2, 468, 469, 7, 113, 2, 2, 469, 470, 7, 119, 2, 2, 470, 471, 7, 112, 2, 2, 471, 472, 7, 118, 2, 2, 472, 108, 3, 2, 2, 2, 473, 474, 7, 110, 2, 2, 474, 475, 7, 103, 2, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 105, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 106, 2, 2, 479, 480, 7, 113, 2, 2, 480, 481, 7, 104, 2, 2, 481, 110, 3, 2, 2, 2, 482, 483, 7, 45, 2, 2, 483, 484, 7, 45, 2, 2, 484, 112, 3, 2, 2, 2, 485, 486, 7, 47, 2, 2, 486, 487, 7, 47, 2, 2, 487, 114, 3, 2, 2, 2, 488, 489, 7, 45, 2, 2, 489, 490, 7, 63, 2, 2, 490, 116, 3, 2, 2, 2, 491, 492, 7, 47, 2, 2, 492, 493, 7, 63, 2, 2, 493, 118, 3, 2, 2, 2, 494, 495, 7, 44, 2, 2, 495, 496, 7, 63, 2, 2, 496, 120, 3, 2, 2, 2, 497, 498, 7, 49, 2, 2, 498, 499, 7, 63, 2, 2, 499, 122, 3, 2, 2, 2, 500, 501, 7, 40, 2, 2, 501, 502, 7, 63, 2, 2, 502, 124, 3, 2, 2, 2, 503, 504, 7, 126, 2, 2, 504, 505, 7, 63, 2, 2, 505, 126, 3, 2, 2, 2, 506, 507, 7, 128, 2, 2, 507, 508, 7, 63, 2, 2, 508, 128, 3, 2, 2, 2, 509, 510, 7, 96, 2, 2, 510, 511, 7, 63, 2, 2, 511, 130, 3, 2, 2, 2, 512, 513, 7, 62, 2, 2, 513, 514, 7, 62, 2, 2, 514, 515, 7, 63, 2, 2, 515, 132, 3, 2, 2, 2, 516, 517, 7, 64, 2, 2, 517, 518, 7, 64, 2, 2, 518, 519, 7, 63, 2, 2, 519, 134, 3, 2, 2, 2, 520, 521, 7, 107, 2, 2, 521, 522, 7, 112, 2, 2, 522, 136, 3, 2, 2, 2, 523, 524, 7, 107, 2, 2, 524, 525, 7, 104, 2, 2, 525, 138, 3, 2, 2, 2, 526, 527, 7, 103, 2, 2, 527, 528, 7, 110, 2, 2, 528, 529, 7, 117, 2, 2, 529, 530, 7, 103, 2, 2, 530, 140, 3, 2, 2, 2, 531, 532, 7, 104, 2, 2, 532, 533, 7, 113, 2, 2, 533, 534, 7, 116, 2, 2, 534, 142, 3, 2, 2, 2, 535, 536, 7, 121, 2, 2, 536, 537, 7, 106, 2, 2, 537, 538, 7, 107, 2, 2, 538, 539, 7, 110, 2, 2, 539, 540, 7, 103, 2, 2, 540, 144, 3, 2, 2, 2, 541, 542, 7, 100, 2, 2, 542, 543, 7, 116, 2, 2, 543, 544, 7, 103, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 7, 109, 2, 2, 546, 146, 3, 2, 2, 2, 547, 548, 7, 101, 2, 2, 548, 549, 7, 113, 2, 2, 549, 550, 7, 112, 2, 2, 550, 551, 7, 118, 2, 2, 551, 552, 7, 107, 2, 2, 552, 553, 7, 112, 2, 2, 553, 554, 7, 119, 2, 2, 554, 555, 7, 103, 2, 2, 555, 148, 3, 2, 2, 2, 556, 557, 7, 103, 2, 2, 557, 558, 7, 112, 2, 2, 558, 559, 7, 102, 2, 2, 559, 150, 3, 2, 2, 2, 560, 561, 7, 109, 2, 2, 561, 562, 7, 103, 2, 2, 562, 563, 7, 116, 2, 2, 563, 564, 7, 112, 2, 2, 564, 565, 7, 103, 2, 2, 565, 566, 7, 110, 2, 2, 566, 152, 3, 2, 2, 2, 567, 568, 7, 102, 2, 2, 568, 569, 7, 103, 2, 2, 569, 570, 7, 104, 2, 2, 570, 154, 3, 2, 2, 2, 571, 572, 7, 37, 2, 2, 572, 573, 7, 114, 2, 2, 573, 574, 7, 116, 2, 2, 574, 575, 7, 99, 2, 2, 575, 576, 7, 105, 2, 2, 576, 577, 7, 111, 2, 2, 577, 578, 7, 99, 2, 2, 578, 156, 3, 2, 2, 2, 579, 580, 7, 102, 2, 2, 580, 581, 7, 118, 2, 2, 581, 158, 3, 2, 2, 2, 582, 583, 7, 112, 2, 2, 583, 584, 7, 117, 2, 2, 584, 160, 3, 2, 2, 2, 585, 586, 7, 119, 2, 2, 586, 587, 7, 117, 2, 2, 587, 162, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 117, 2, 2, 590, 164, 3, 2, 2, 2, 591, 592, 7, 117, 2, 2, 592, 166, 3, 2, 2, 2, 593, 594, 7, 110, 2, 2, 594, 595, 7, 103, 2, 2, 595, 596, 7, 112, 2, 2, 596, 597, 7, 105, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 106, 2, 2, 599, 168, 3, 2, 2, 2, 600, 601, 7, 117, 2, 2, 601, 602, 7, 118, 2, 2, 602, 603, 7, 116, 2, 2, 603, 604, 7, 103, 2, 2, 604, 605, 7, 118, 2, 2, 605, 606, 7, 101, 2, 2, 606, 607, 7, 106, 2, 2, 607, 170, 3, 2, 2, 2, 608, 609, 7, 100, 2, 2, 609, 610, 7, 113, 2, 2, 610, 611, 7, 122, 2, 2, 611, 612, 7, 99, 2, 2, 612, 613, 7, 117, 2, 2, 613, 172, 3, 2, 2, 2, 614, 615, 7, 100, 2, 2, 615, 616, 7, 113, 2, 2, 616, 617, 7, 122, 2, 2, 617, 618, 7, 118, 2, 2, 618, 619, 7, 113, 2, 2, 619, 174, 3, 2, 2, 2, 620, 621, 7, 117, 2, 2, 621, 622, 7, 118, 2, 2, 622, 623, 7, 116, 2, 2, 623, 624, 7, 103, 2, 2, 624, 625, 7, 118, 2, 2, 625, 626, 7, 101, 2, 2, 626, 627, 7, 106, 2, 2, 627, 628, 7, 107, 2, 2, 628, 629, 7, 112, 2, 2, 629, 630, 7, 104, 2, 2, 630, 176, 3, 2, 2, 2, 631, 632, 7, 102, 2, 2, 632, 633, 7, 103, 2, 2, 633, 634, 7, 110, 2, 2, 634, 635, 7, 99, 2, 2, 635, 636, 7, 123, 2, 2, 636, 178, 3, 2, 2, 2, 637, 638, 7, 116, 2, 2, 638, 639, 7, 113, 2, 2, 639, 640, 7, 118, 2, 2, 640, 641, 7, 99, 2, 2, 641, 642, 7, 116, 2, 2, 642, 643, 7, 123, 2, 2, 643, 180, 3, 2, 2, 2, 644, 645, 7, 102, 2, 2, 645, 646, 7, 103, 2, 2, 646, 647, 7, 104, 2, 2, 647, 648, 7, 101, 2, 2, 648, 649, 7, 99, 2, 2, 649, 650, 7, 110, 2, 2, 650, 651, 7, 105, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 99, 2, 2, 653, 654, 7, 111, 2, 2, 654, 655, 7, 111, 2, 2, 655, 656, 7, 99, 2, 2, 656, 657, 7, 116, 2, 2, 657, 182, 3, 2, 2, 2, 658, 659, 7, 102, 2, 2, 659, 660, 7, 103, 2, 2, 660, 661, 7, 104, 2, 2, 661, 662, 7, 101, 2, 2, 662, 663, 7, 99, 2, 2, 663, 664, 7, 110, 2, 2, 664, 184, 3, 2, 2, 2, 665, 666, 7, 113, 2, 2, 666, 667, 7, 114, 2, 2, 667, 668, 7, 103, 2, 2, 668, 669, 7, 112, 2, 2, 669, 670, 7, 114, 2, 2, 670, 671, 7, 119, 2, 2, 671, 672, 7, 110, 2, 2, 672, 673, 7, 117, 2, 2, 673, 674, 7, 103, 2, 2, 674, 186, 3, 2, 2, 2, 675, 676, 7, 93, 2, 2, 676, 188, 3, 2, 2, 2, 677, 678, 7, 95, 2, 2, 678, 190, 3, 2, 2, 2, 679, 680, 7, 125, 2, 2, 680, 192, 3, 2, 2, 2, 681, 682, 7, 127, 2, 2, 682, 194, 3, 2, 2, 2, 683, 684, 7, 42, 2, 2, 684, 196, 3, 2, 2, 2, 685, 686, 7, 43, 2, 2, 686, 198, 3, 2, 2, 2, 687, 688, 7, 60, 2, 2, 688, 200, 3, 2, 2, 2, 689, 690, 7, 61, 2, 2, 690, 202, 3, 2, 2, 2, 691, 692, 7, 48, 2, 2, 692, 204, 3, 2, 2, 2, 693, 694, 7, 46, 2, 2, 694, 206, 3, 2, 2, 2, 695, 696, 7, 63, 2, 2, 696, 208, 3, 2, 2, 2, 697, 698, 7, 47, 2, 2, 698, 699, 7, 64, 2, 2, 699, 210, 3, 2, 2, 2, 700, 701, 7, 114, 2, 2, 701, 714, 7, 107, 2, 2, 702, 714, 7, 962, 2, 2, 703, 704, 7, 118, 2, 2, 704, 705, 7, 99, 2, 2, 705, 714, 7, 119, 2, 2, 706, 714, 9, 11, 2, 2, 707, 708, 7, 103, 2, 2, 708, 709, 7, 119, 2, 2, 709, 710, 7, 110, 2, 2, 710, 711, 7, 103, 2, 2, 711, 714, 7, 116, 2, 2, 712, 714, 7, 103, 2, 2, 713, 700, 3, 2, 2, 2, 713, 702, 3, 2, 2, 2, 713, 703, 3, 2, 2, 2, 713, 706, 3, 2, 2, 2, 713, 707, 3, 2, 2, 2, 713, 712, 3, 2, 2, 2, 714, 212, 3, 2, 2, 2, 715, 717, 9, 2, 2, 2, 716, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 8, 107, 2, 2, 721, 214, 3, 2, 2, 2, 722, 724, 9, 3, 2, 2, 723, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 727, 3, 2, 2, 2, 727, 728, 8, 108, 2, 2, 728, 216, 3, 2, 2, 2, 729, 730, 9, 4, 2, 2, 730, 218, 3, 2, 2, 2, 731, 733, 5, 217, 109, 2, 732, 731, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 732, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 220, 3, 2, 2, 2, 736, 737, 9, 5, 2, 2, 737, 222, 3, 2, 2, 2, 738, 739, 9, 6, 2, 2, 739, 224, 3, 2, 2, 2, 740, 741, 9, 7, 2, 2, 741, 226, 3, 2, 2, 2, 742, 743, 9, 8, 2, 2, 743, 228, 3, 2, 2, 2, 744, 746, 5, 219, 110, 2, 745, 744, 3, 2, 2, 2, 746, 749, 3, 2, 2, 2, 747, 745, 3, 2, 2, 2, 747, 748, 3, 2, 2, 2, 748, 750, 3, 2, 2, 2, 749, 747, 3, 2, 2, 2, 750, 752, 5, 203, 102, 2, 751, 753, 5, 219, 110, 2, 752, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 230, 3, 2, 2, 2, 756, 763, 5, 229, 115, 2, 757, 759, 5, 225, 113, 2, 758, 760, 5, 227, 114, 2, 759, 758, 3, 2, 2, 2, 759, 760, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 762, 5, 229, 115, 2, 762, 764, 3, 2, 2, 2, 763, 757, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 232, 3, 2, 2, 2, 765, 770, 5, 221, 111, 2, 766, 770, 5, 223, 112, 2, 767, 770, 7, 97, 2, 2, 768, 770, 5, 219, 110, 2, 769, 765, 3, 2, 2, 2, 769, 766, 3, 2, 2, 2, 769, 767, 3, 2, 2, 2, 769, 768, 3, 2, 2, 2, 770, 234, 3, 2, 2, 2, 771, 775, 5, 221, 111, 2, 772, 774, 5, 233, 117, 2, 773, 772, 3, 2, 2, 2, 774, 777, 3, 2, 2, 2, 775, 773, 3, 2, 2, 2, 775, 776, 3, 2, 2, 2, 776, 236, 3, 2, 2, 2, 777, 775, 3, 2, 2, 2, 778, 779, 9, 9, 2, 2, 779, 238, 3, 2, 2, 2, 780, 781, 5, 237, 119, 2, 781, 782, 5, 243, 122, 2, 782, 783, 5, 237, 119, 2, 783, 240, 3, 2, 2, 2, 784, 786, 10, 10, 2, 2, 785, 784, 3, 2, 2, 2, 786, 787, 3, 2, 2, 2, 787, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 242, 3, 2, 2, 2, 789, 793, 5, 241, 121, 2, 790, 793, 5, 213, 107, 2, 791, 793, 5, 215, 108, 2, 792, 789, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 792, 791, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 792, 3, 2, 2, 2, 794, 795, 3, 2, 2, 2, 795, 244, 3, 2, 2, 2, 796, 798, 5, 191, 96, 2, 797, 799, 5, 243, 122, 2, 798, 797, 3, 2, 2, 2, 798, 799, 3, 2, 2, 2, 799, 800, 3, 2, 2, 2, 800, 801, 5, 193, 97, 2, 801, 246, 3, 2, 2, 2, 802, 803, 7, 49, 2, 2, 803, 804, 7, 49, 2, 2, 804, 805, 3, 2, 2, 2, 805, 806, 5, 243, 122, 2, 806, 248, 3, 2, 2, 2, 807, 808, 7, 49, 2, 2, 808, 809, 7, 44, 2, 2, 809, 810, 3, 2, 2, 2, 810, 811, 5, 243, 122, 2, 811, 812, 7, 44, 2, 2, 812, 813, 7, 49, 2, 2, 813, 250, 3, 2, 2, 2, 17, 2, 713, 718, 725, 734, 747, 754, 759, 763, 769, 775, 787, 792, 794, 798, 3, 8, 2, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 116, 818, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 5, 106, 714, 10, 106, 3, 107, 6, 107, 717, 10, 107, 13, 107, 14, 107, 718, 3, 107, 3, 107, 3, 108, 6, 108, 724, 10, 108, 13, 108, 14, 108, 725, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 6, 110, 733, 10, 110, 13, 110, 14, 110, 734, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 7, 115, 746, 10, 115, 12, 115, 14, 115, 749, 11, 115, 3, 115, 3, 115, 6, 115, 753, 10, 115, 13, 115, 14, 115, 754, 3, 116, 3, 116, 3, 116, 5, 116, 760, 10, 116, 3, 116, 3, 116, 5, 116, 764, 10, 116, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 770, 10, 117, 3, 118, 3, 118, 7, 118, 774, 10, 118, 12, 118, 14, 118, 777, 11, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 6, 121, 786, 10, 121, 13, 121, 14, 121, 787, 3, 122, 3, 122, 3, 122, 6, 122, 793, 10, 122, 13, 122, 14, 122, 794, 3, 123, 3, 123, 5, 123, 799, 10, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 7, 124, 807, 10, 124, 12, 124, 14, 124, 810, 11, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 787, 2, 126, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 2, 219, 110, 221, 2, 223, 2, 225, 2, 227, 2, 229, 111, 231, 112, 233, 2, 235, 113, 237, 2, 239, 114, 241, 2, 243, 2, 245, 2, 247, 115, 249, 116, 3, 2, 12, 4, 2, 11, 11, 34, 34, 3, 2, 12, 12, 3, 2, 50, 59, 3, 2, 99, 124, 3, 2, 67, 92, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 36, 36, 41, 41, 5, 2, 11, 12, 15, 15, 34, 34, 4, 2, 12, 12, 15, 15, 3, 3, 2, 55057, 3, 55057, 3, 829, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 3, 251, 3, 2, 2, 2, 5, 260, 3, 2, 2, 2, 7, 268, 3, 2, 2, 2, 9, 274, 3, 2, 2, 2, 11, 279, 3, 2, 2, 2, 13, 283, 3, 2, 2, 2, 15, 288, 3, 2, 2, 2, 17, 292, 3, 2, 2, 2, 19, 297, 3, 2, 2, 2, 21, 303, 3, 2, 2, 2, 23, 309, 3, 2, 2, 2, 25, 315, 3, 2, 2, 2, 27, 320, 3, 2, 2, 2, 29, 326, 3, 2, 2, 2, 31, 330, 3, 2, 2, 2, 33, 333, 3, 2, 2, 2, 35, 338, 3, 2, 2, 2, 37, 346, 3, 2, 2, 2, 39, 354, 3, 2, 2, 2, 41, 358, 3, 2, 2, 2, 43, 362, 3, 2, 2, 2, 45, 367, 3, 2, 2, 2, 47, 369, 3, 2, 2, 2, 49, 372, 3, 2, 2, 2, 51, 374, 3, 2, 2, 2, 53, 380, 3, 2, 2, 2, 55, 382, 3, 2, 2, 2, 57, 384, 3, 2, 2, 2, 59, 386, 3, 2, 2, 2, 61, 388, 3, 2, 2, 2, 63, 390, 3, 2, 2, 2, 65, 392, 3, 2, 2, 2, 67, 395, 3, 2, 2, 2, 69, 398, 3, 2, 2, 2, 71, 403, 3, 2, 2, 2, 73, 408, 3, 2, 2, 2, 75, 411, 3, 2, 2, 2, 77, 413, 3, 2, 2, 2, 79, 415, 3, 2, 2, 2, 81, 417, 3, 2, 2, 2, 83, 419, 3, 2, 2, 2, 85, 421, 3, 2, 2, 2, 87, 424, 3, 2, 2, 2, 89, 427, 3, 2, 2, 2, 91, 430, 3, 2, 2, 2, 93, 433, 3, 2, 2, 2, 95, 440, 3, 2, 2, 2, 97, 444, 3, 2, 2, 2, 99, 448, 3, 2, 2, 2, 101, 452, 3, 2, 2, 2, 103, 456, 3, 2, 2, 2, 105, 459, 3, 2, 2, 2, 107, 464, 3, 2, 2, 2, 109, 473, 3, 2, 2, 2, 111, 482, 3, 2, 2, 2, 113, 485, 3, 2, 2, 2, 115, 488, 3, 2, 2, 2, 117, 491, 3, 2, 2, 2, 119, 494, 3, 2, 2, 2, 121, 497, 3, 2, 2, 2, 123, 500, 3, 2, 2, 2, 125, 503, 3, 2, 2, 2, 127, 506, 3, 2, 2, 2, 129, 509, 3, 2, 2, 2, 131, 512, 3, 2, 2, 2, 133, 516, 3, 2, 2, 2, 135, 520, 3, 2, 2, 2, 137, 523, 3, 2, 2, 2, 139, 526, 3, 2, 2, 2, 141, 531, 3, 2, 2, 2, 143, 535, 3, 2, 2, 2, 145, 541, 3, 2, 2, 2, 147, 547, 3, 2, 2, 2, 149, 556, 3, 2, 2, 2, 151, 560, 3, 2, 2, 2, 153, 567, 3, 2, 2, 2, 155, 571, 3, 2, 2, 2, 157, 579, 3, 2, 2, 2, 159, 582, 3, 2, 2, 2, 161, 585, 3, 2, 2, 2, 163, 588, 3, 2, 2, 2, 165, 591, 3, 2, 2, 2, 167, 593, 3, 2, 2, 2, 169, 600, 3, 2, 2, 2, 171, 608, 3, 2, 2, 2, 173, 614, 3, 2, 2, 2, 175, 620, 3, 2, 2, 2, 177, 631, 3, 2, 2, 2, 179, 637, 3, 2, 2, 2, 181, 644, 3, 2, 2, 2, 183, 658, 3, 2, 2, 2, 185, 665, 3, 2, 2, 2, 187, 675, 3, 2, 2, 2, 189, 677, 3, 2, 2, 2, 191, 679, 3, 2, 2, 2, 193, 681, 3, 2, 2, 2, 195, 683, 3, 2, 2, 2, 197, 685, 3, 2, 2, 2, 199, 687, 3, 2, 2, 2, 201, 689, 3, 2, 2, 2, 203, 691, 3, 2, 2, 2, 205, 693, 3, 2, 2, 2, 207, 695, 3, 2, 2, 2, 209, 697, 3, 2, 2, 2, 211, 713, 3, 2, 2, 2, 213, 716, 3, 2, 2, 2, 215, 723, 3, 2, 2, 2, 217, 729, 3, 2, 2, 2, 219, 732, 3, 2, 2, 2, 221, 736, 3, 2, 2, 2, 223, 738, 3, 2, 2, 2, 225, 740, 3, 2, 2, 2, 227, 742, 3, 2, 2, 2, 229, 747, 3, 2, 2, 2, 231, 756, 3, 2, 2, 2, 233, 769, 3, 2, 2, 2, 235, 771, 3, 2, 2, 2, 237, 778, 3, 2, 2, 2, 239, 780, 3, 2, 2, 2, 241, 785, 3, 2, 2, 2, 243, 792, 3, 2, 2, 2, 245, 796, 3, 2, 2, 2, 247, 802, 3, 2, 2, 2, 249, 811, 3, 2, 2, 2, 251, 252, 7, 81, 2, 2, 252, 253, 7, 82, 2, 2, 253, 254, 7, 71, 2, 2, 254, 255, 7, 80, 2, 2, 255, 256, 7, 83, 2, 2, 256, 257, 7, 67, 2, 2, 257, 258, 7, 85, 2, 2, 258, 259, 7, 79, 2, 2, 259, 4, 3, 2, 2, 2, 260, 261, 7, 107, 2, 2, 261, 262, 7, 112, 2, 2, 262, 263, 7, 101, 2, 2, 263, 264, 7, 110, 2, 2, 264, 265, 7, 119, 2, 2, 265, 266, 7, 102, 2, 2, 266, 267, 7, 103, 2, 2, 267, 6, 3, 2, 2, 2, 268, 269, 7, 115, 2, 2, 269, 270, 7, 119, 2, 2, 270, 271, 7, 100, 2, 2, 271, 272, 7, 107, 2, 2, 272, 273, 7, 118, 2, 2, 273, 8, 3, 2, 2, 2, 274, 275, 7, 115, 2, 2, 275, 276, 7, 116, 2, 2, 276, 277, 7, 103, 2, 2, 277, 278, 7, 105, 2, 2, 278, 10, 3, 2, 2, 2, 279, 280, 7, 100, 2, 2, 280, 281, 7, 107, 2, 2, 281, 282, 7, 118, 2, 2, 282, 12, 3, 2, 2, 2, 283, 284, 7, 101, 2, 2, 284, 285, 7, 116, 2, 2, 285, 286, 7, 103, 2, 2, 286, 287, 7, 105, 2, 2, 287, 14, 3, 2, 2, 2, 288, 289, 7, 107, 2, 2, 289, 290, 7, 112, 2, 2, 290, 291, 7, 118, 2, 2, 291, 16, 3, 2, 2, 2, 292, 293, 7, 119, 2, 2, 293, 294, 7, 107, 2, 2, 294, 295, 7, 112, 2, 2, 295, 296, 7, 118, 2, 2, 296, 18, 3, 2, 2, 2, 297, 298, 7, 104, 2, 2, 298, 299, 7, 110, 2, 2, 299, 300, 7, 113, 2, 2, 300, 301, 7, 99, 2, 2, 301, 302, 7, 118, 2, 2, 302, 20, 3, 2, 2, 2, 303, 304, 7, 99, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 105, 2, 2, 306, 307, 7, 110, 2, 2, 307, 308, 7, 103, 2, 2, 308, 22, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 107, 2, 2, 311, 312, 7, 122, 2, 2, 312, 313, 7, 103, 2, 2, 313, 314, 7, 102, 2, 2, 314, 24, 3, 2, 2, 2, 315, 316, 7, 100, 2, 2, 316, 317, 7, 113, 2, 2, 317, 318, 7, 113, 2, 2, 318, 319, 7, 110, 2, 2, 319, 26, 3, 2, 2, 2, 320, 321, 7, 101, 2, 2, 321, 322, 7, 113, 2, 2, 322, 323, 7, 112, 2, 2, 323, 324, 7, 117, 2, 2, 324, 325, 7, 118, 2, 2, 325, 28, 3, 2, 2, 2, 326, 327, 7, 110, 2, 2, 327, 328, 7, 103, 2, 2, 328, 329, 7, 118, 2, 2, 329, 30, 3, 2, 2, 2, 330, 331, 7, 126, 2, 2, 331, 332, 7, 126, 2, 2, 332, 32, 3, 2, 2, 2, 333, 334, 7, 105, 2, 2, 334, 335, 7, 99, 2, 2, 335, 336, 7, 118, 2, 2, 336, 337, 7, 103, 2, 2, 337, 34, 3, 2, 2, 2, 338, 339, 7, 111, 2, 2, 339, 340, 7, 103, 2, 2, 340, 341, 7, 99, 2, 2, 341, 342, 7, 117, 2, 2, 342, 343, 7, 119, 2, 2, 343, 344, 7, 116, 2, 2, 344, 345, 7, 103, 2, 2, 345, 36, 3, 2, 2, 2, 346, 347, 7, 100, 2, 2, 347, 348, 7, 99, 2, 2, 348, 349, 7, 116, 2, 2, 349, 350, 7, 116, 2, 2, 350, 351, 7, 107, 2, 2, 351, 352, 7, 103, 2, 2, 352, 353, 7, 116, 2, 2, 353, 38, 3, 2, 2, 2, 354, 355, 7, 107, 2, 2, 355, 356, 7, 112, 2, 2, 356, 357, 7, 120, 2, 2, 357, 40, 3, 2, 2, 2, 358, 359, 7, 114, 2, 2, 359, 360, 7, 113, 2, 2, 360, 361, 7, 121, 2, 2, 361, 42, 3, 2, 2, 2, 362, 363, 7, 101, 2, 2, 363, 364, 7, 118, 2, 2, 364, 365, 7, 116, 2, 2, 365, 366, 7, 110, 2, 2, 366, 44, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 46, 3, 2, 2, 2, 369, 370, 7, 69, 2, 2, 370, 371, 7, 90, 2, 2, 371, 48, 3, 2, 2, 2, 372, 373, 7, 87, 2, 2, 373, 50, 3, 2, 2, 2, 374, 375, 7, 116, 2, 2, 375, 376, 7, 103, 2, 2, 376, 377, 7, 117, 2, 2, 377, 378, 7, 103, 2, 2, 378, 379, 7, 118, 2, 2, 379, 52, 3, 2, 2, 2, 380, 381, 7, 128, 2, 2, 381, 54, 3, 2, 2, 2, 382, 383, 7, 35, 2, 2, 383, 56, 3, 2, 2, 2, 384, 385, 7, 45, 2, 2, 385, 58, 3, 2, 2, 2, 386, 387, 7, 47, 2, 2, 387, 60, 3, 2, 2, 2, 388, 389, 7, 44, 2, 2, 389, 62, 3, 2, 2, 2, 390, 391, 7, 49, 2, 2, 391, 64, 3, 2, 2, 2, 392, 393, 7, 62, 2, 2, 393, 394, 7, 62, 2, 2, 394, 66, 3, 2, 2, 2, 395, 396, 7, 64, 2, 2, 396, 397, 7, 64, 2, 2, 397, 68, 3, 2, 2, 2, 398, 399, 7, 116, 2, 2, 399, 400, 7, 113, 2, 2, 400, 401, 7, 118, 2, 2, 401, 402, 7, 110, 2, 2, 402, 70, 3, 2, 2, 2, 403, 404, 7, 116, 2, 2, 404, 405, 7, 113, 2, 2, 405, 406, 7, 118, 2, 2, 406, 407, 7, 116, 2, 2, 407, 72, 3, 2, 2, 2, 408, 409, 7, 40, 2, 2, 409, 410, 7, 40, 2, 2, 410, 74, 3, 2, 2, 2, 411, 412, 7, 40, 2, 2, 412, 76, 3, 2, 2, 2, 413, 414, 7, 126, 2, 2, 414, 78, 3, 2, 2, 2, 415, 416, 7, 96, 2, 2, 416, 80, 3, 2, 2, 2, 417, 418, 7, 64, 2, 2, 418, 82, 3, 2, 2, 2, 419, 420, 7, 62, 2, 2, 420, 84, 3, 2, 2, 2, 421, 422, 7, 64, 2, 2, 422, 423, 7, 63, 2, 2, 423, 86, 3, 2, 2, 2, 424, 425, 7, 62, 2, 2, 425, 426, 7, 63, 2, 2, 426, 88, 3, 2, 2, 2, 427, 428, 7, 63, 2, 2, 428, 429, 7, 63, 2, 2, 429, 90, 3, 2, 2, 2, 430, 431, 7, 35, 2, 2, 431, 432, 7, 63, 2, 2, 432, 92, 3, 2, 2, 2, 433, 434, 7, 116, 2, 2, 434, 435, 7, 103, 2, 2, 435, 436, 7, 118, 2, 2, 436, 437, 7, 119, 2, 2, 437, 438, 7, 116, 2, 2, 438, 439, 7, 112, 2, 2, 439, 94, 3, 2, 2, 2, 440, 441, 7, 117, 2, 2, 441, 442, 7, 107, 2, 2, 442, 443, 7, 112, 2, 2, 443, 96, 3, 2, 2, 2, 444, 445, 7, 101, 2, 2, 445, 446, 7, 113, 2, 2, 446, 447, 7, 117, 2, 2, 447, 98, 3, 2, 2, 2, 448, 449, 7, 118, 2, 2, 449, 450, 7, 99, 2, 2, 450, 451, 7, 112, 2, 2, 451, 100, 3, 2, 2, 2, 452, 453, 7, 103, 2, 2, 453, 454, 7, 122, 2, 2, 454, 455, 7, 114, 2, 2, 455, 102, 3, 2, 2, 2, 456, 457, 7, 110, 2, 2, 457, 458, 7, 112, 2, 2, 458, 104, 3, 2, 2, 2, 459, 460, 7, 117, 2, 2, 460, 461, 7, 115, 2, 2, 461, 462, 7, 116, 2, 2, 462, 463, 7, 118, 2, 2, 463, 106, 3, 2, 2, 2, 464, 465, 7, 114, 2, 2, 465, 466, 7, 113, 2, 2, 466, 467, 7, 114, 2, 2, 467, 468, 7, 101, 2, 2, 468, 469, 7, 113, 2, 2, 469, 470, 7, 119, 2, 2, 470, 471, 7, 112, 2, 2, 471, 472, 7, 118, 2, 2, 472, 108, 3, 2, 2, 2, 473, 474, 7, 110, 2, 2, 474, 475, 7, 103, 2, 2, 475, 476, 7, 112, 2, 2, 476, 477, 7, 105, 2, 2, 477, 478, 7, 118, 2, 2, 478, 479, 7, 106, 2, 2, 479, 480, 7, 113, 2, 2, 480, 481, 7, 104, 2, 2, 481, 110, 3, 2, 2, 2, 482, 483, 7, 45, 2, 2, 483, 484, 7, 45, 2, 2, 484, 112, 3, 2, 2, 2, 485, 486, 7, 47, 2, 2, 486, 487, 7, 47, 2, 2, 487, 114, 3, 2, 2, 2, 488, 489, 7, 45, 2, 2, 489, 490, 7, 63, 2, 2, 490, 116, 3, 2, 2, 2, 491, 492, 7, 47, 2, 2, 492, 493, 7, 63, 2, 2, 493, 118, 3, 2, 2, 2, 494, 495, 7, 44, 2, 2, 495, 496, 7, 63, 2, 2, 496, 120, 3, 2, 2, 2, 497, 498, 7, 49, 2, 2, 498, 499, 7, 63, 2, 2, 499, 122, 3, 2, 2, 2, 500, 501, 7, 40, 2, 2, 501, 502, 7, 63, 2, 2, 502, 124, 3, 2, 2, 2, 503, 504, 7, 126, 2, 2, 504, 505, 7, 63, 2, 2, 505, 126, 3, 2, 2, 2, 506, 507, 7, 128, 2, 2, 507, 508, 7, 63, 2, 2, 508, 128, 3, 2, 2, 2, 509, 510, 7, 96, 2, 2, 510, 511, 7, 63, 2, 2, 511, 130, 3, 2, 2, 2, 512, 513, 7, 62, 2, 2, 513, 514, 7, 62, 2, 2, 514, 515, 7, 63, 2, 2, 515, 132, 3, 2, 2, 2, 516, 517, 7, 64, 2, 2, 517, 518, 7, 64, 2, 2, 518, 519, 7, 63, 2, 2, 519, 134, 3, 2, 2, 2, 520, 521, 7, 107, 2, 2, 521, 522, 7, 112, 2, 2, 522, 136, 3, 2, 2, 2, 523, 524, 7, 107, 2, 2, 524, 525, 7, 104, 2, 2, 525, 138, 3, 2, 2, 2, 526, 527, 7, 103, 2, 2, 527, 528, 7, 110, 2, 2, 528, 529, 7, 117, 2, 2, 529, 530, 7, 103, 2, 2, 530, 140, 3, 2, 2, 2, 531, 532, 7, 104, 2, 2, 532, 533, 7, 113, 2, 2, 533, 534, 7, 116, 2, 2, 534, 142, 3, 2, 2, 2, 535, 536, 7, 121, 2, 2, 536, 537, 7, 106, 2, 2, 537, 538, 7, 107, 2, 2, 538, 539, 7, 110, 2, 2, 539, 540, 7, 103, 2, 2, 540, 144, 3, 2, 2, 2, 541, 542, 7, 100, 2, 2, 542, 543, 7, 116, 2, 2, 543, 544, 7, 103, 2, 2, 544, 545, 7, 99, 2, 2, 545, 546, 7, 109, 2, 2, 546, 146, 3, 2, 2, 2, 547, 548, 7, 101, 2, 2, 548, 549, 7, 113, 2, 2, 549, 550, 7, 112, 2, 2, 550, 551, 7, 118, 2, 2, 551, 552, 7, 107, 2, 2, 552, 553, 7, 112, 2, 2, 553, 554, 7, 119, 2, 2, 554, 555, 7, 103, 2, 2, 555, 148, 3, 2, 2, 2, 556, 557, 7, 103, 2, 2, 557, 558, 7, 112, 2, 2, 558, 559, 7, 102, 2, 2, 559, 150, 3, 2, 2, 2, 560, 561, 7, 109, 2, 2, 561, 562, 7, 103, 2, 2, 562, 563, 7, 116, 2, 2, 563, 564, 7, 112, 2, 2, 564, 565, 7, 103, 2, 2, 565, 566, 7, 110, 2, 2, 566, 152, 3, 2, 2, 2, 567, 568, 7, 102, 2, 2, 568, 569, 7, 103, 2, 2, 569, 570, 7, 104, 2, 2, 570, 154, 3, 2, 2, 2, 571, 572, 7, 37, 2, 2, 572, 573, 7, 114, 2, 2, 573, 574, 7, 116, 2, 2, 574, 575, 7, 99, 2, 2, 575, 576, 7, 105, 2, 2, 576, 577, 7, 111, 2, 2, 577, 578, 7, 99, 2, 2, 578, 156, 3, 2, 2, 2, 579, 580, 7, 102, 2, 2, 580, 581, 7, 118, 2, 2, 581, 158, 3, 2, 2, 2, 582, 583, 7, 112, 2, 2, 583, 584, 7, 117, 2, 2, 584, 160, 3, 2, 2, 2, 585, 586, 7, 119, 2, 2, 586, 587, 7, 117, 2, 2, 587, 162, 3, 2, 2, 2, 588, 589, 7, 111, 2, 2, 589, 590, 7, 117, 2, 2, 590, 164, 3, 2, 2, 2, 591, 592, 7, 117, 2, 2, 592, 166, 3, 2, 2, 2, 593, 594, 7, 110, 2, 2, 594, 595, 7, 103, 2, 2, 595, 596, 7, 112, 2, 2, 596, 597, 7, 105, 2, 2, 597, 598, 7, 118, 2, 2, 598, 599, 7, 106, 2, 2, 599, 168, 3, 2, 2, 2, 600, 601, 7, 117, 2, 2, 601, 602, 7, 118, 2, 2, 602, 603, 7, 116, 2, 2, 603, 604, 7, 103, 2, 2, 604, 605, 7, 118, 2, 2, 605, 606, 7, 101, 2, 2, 606, 607, 7, 106, 2, 2, 607, 170, 3, 2, 2, 2, 608, 609, 7, 100, 2, 2, 609, 610, 7, 113, 2, 2, 610, 611, 7, 122, 2, 2, 611, 612, 7, 99, 2, 2, 612, 613, 7, 117, 2, 2, 613, 172, 3, 2, 2, 2, 614, 615, 7, 100, 2, 2, 615, 616, 7, 113, 2, 2, 616, 617, 7, 122, 2, 2, 617, 618, 7, 118, 2, 2, 618, 619, 7, 113, 2, 2, 619, 174, 3, 2, 2, 2, 620, 621, 7, 117, 2, 2, 621, 622, 7, 118, 2, 2, 622, 623, 7, 116, 2, 2, 623, 624, 7, 103, 2, 2, 624, 625, 7, 118, 2, 2, 625, 626, 7, 101, 2, 2, 626, 627, 7, 106, 2, 2, 627, 628, 7, 107, 2, 2, 628, 629, 7, 112, 2, 2, 629, 630, 7, 104, 2, 2, 630, 176, 3, 2, 2, 2, 631, 632, 7, 102, 2, 2, 632, 633, 7, 103, 2, 2, 633, 634, 7, 110, 2, 2, 634, 635, 7, 99, 2, 2, 635, 636, 7, 123, 2, 2, 636, 178, 3, 2, 2, 2, 637, 638, 7, 116, 2, 2, 638, 639, 7, 113, 2, 2, 639, 640, 7, 118, 2, 2, 640, 641, 7, 99, 2, 2, 641, 642, 7, 116, 2, 2, 642, 643, 7, 123, 2, 2, 643, 180, 3, 2, 2, 2, 644, 645, 7, 102, 2, 2, 645, 646, 7, 103, 2, 2, 646, 647, 7, 104, 2, 2, 647, 648, 7, 101, 2, 2, 648, 649, 7, 99, 2, 2, 649, 650, 7, 110, 2, 2, 650, 651, 7, 105, 2, 2, 651, 652, 7, 116, 2, 2, 652, 653, 7, 99, 2, 2, 653, 654, 7, 111, 2, 2, 654, 655, 7, 111, 2, 2, 655, 656, 7, 99, 2, 2, 656, 657, 7, 116, 2, 2, 657, 182, 3, 2, 2, 2, 658, 659, 7, 102, 2, 2, 659, 660, 7, 103, 2, 2, 660, 661, 7, 104, 2, 2, 661, 662, 7, 101, 2, 2, 662, 663, 7, 99, 2, 2, 663, 664, 7, 110, 2, 2, 664, 184, 3, 2, 2, 2, 665, 666, 7, 113, 2, 2, 666, 667, 7, 114, 2, 2, 667, 668, 7, 103, 2, 2, 668, 669, 7, 112, 2, 2, 669, 670, 7, 114, 2, 2, 670, 671, 7, 119, 2, 2, 671, 672, 7, 110, 2, 2, 672, 673, 7, 117, 2, 2, 673, 674, 7, 103, 2, 2, 674, 186, 3, 2, 2, 2, 675, 676, 7, 93, 2, 2, 676, 188, 3, 2, 2, 2, 677, 678, 7, 95, 2, 2, 678, 190, 3, 2, 2, 2, 679, 680, 7, 125, 2, 2, 680, 192, 3, 2, 2, 2, 681, 682, 7, 127, 2, 2, 682, 194, 3, 2, 2, 2, 683, 684, 7, 42, 2, 2, 684, 196, 3, 2, 2, 2, 685, 686, 7, 43, 2, 2, 686, 198, 3, 2, 2, 2, 687, 688, 7, 60, 2, 2, 688, 200, 3, 2, 2, 2, 689, 690, 7, 61, 2, 2, 690, 202, 3, 2, 2, 2, 691, 692, 7, 48, 2, 2, 692, 204, 3, 2, 2, 2, 693, 694, 7, 46, 2, 2, 694, 206, 3, 2, 2, 2, 695, 696, 7, 63, 2, 2, 696, 208, 3, 2, 2, 2, 697, 698, 7, 47, 2, 2, 698, 699, 7, 64, 2, 2, 699, 210, 3, 2, 2, 2, 700, 701, 7, 114, 2, 2, 701, 714, 7, 107, 2, 2, 702, 714, 7, 962, 2, 2, 703, 704, 7, 118, 2, 2, 704, 705, 7, 99, 2, 2, 705, 714, 7, 119, 2, 2, 706, 714, 9, 12, 2, 2, 707, 708, 7, 103, 2, 2, 708, 709, 7, 119, 2, 2, 709, 710, 7, 110, 2, 2, 710, 711, 7, 103, 2, 2, 711, 714, 7, 116, 2, 2, 712, 714, 7, 103, 2, 2, 713, 700, 3, 2, 2, 2, 713, 702, 3, 2, 2, 2, 713, 703, 3, 2, 2, 2, 713, 706, 3, 2, 2, 2, 713, 707, 3, 2, 2, 2, 713, 712, 3, 2, 2, 2, 714, 212, 3, 2, 2, 2, 715, 717, 9, 2, 2, 2, 716, 715, 3, 2, 2, 2, 717, 718, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 8, 107, 2, 2, 721, 214, 3, 2, 2, 2, 722, 724, 9, 3, 2, 2, 723, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 727, 3, 2, 2, 2, 727, 728, 8, 108, 2, 2, 728, 216, 3, 2, 2, 2, 729, 730, 9, 4, 2, 2, 730, 218, 3, 2, 2, 2, 731, 733, 5, 217, 109, 2, 732, 731, 3, 2, 2, 2, 733, 734, 3, 2, 2, 2, 734, 732, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 220, 3, 2, 2, 2, 736, 737, 9, 5, 2, 2, 737, 222, 3, 2, 2, 2, 738, 739, 9, 6, 2, 2, 739, 224, 3, 2, 2, 2, 740, 741, 9, 7, 2, 2, 741, 226, 3, 2, 2, 2, 742, 743, 9, 8, 2, 2, 743, 228, 3, 2, 2, 2, 744, 746, 5, 219, 110, 2, 745, 744, 3, 2, 2, 2, 746, 749, 3, 2, 2, 2, 747, 745, 3, 2, 2, 2, 747, 748, 3, 2, 2, 2, 748, 750, 3, 2, 2, 2, 749, 747, 3, 2, 2, 2, 750, 752, 5, 203, 102, 2, 751, 753, 5, 219, 110, 2, 752, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 752, 3, 2, 2, 2, 754, 755, 3, 2, 2, 2, 755, 230, 3, 2, 2, 2, 756, 763, 5, 229, 115, 2, 757, 759, 5, 225, 113, 2, 758, 760, 5, 227, 114, 2, 759, 758, 3, 2, 2, 2, 759, 760, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 762, 5, 229, 115, 2, 762, 764, 3, 2, 2, 2, 763, 757, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 232, 3, 2, 2, 2, 765, 770, 5, 221, 111, 2, 766, 770, 5, 223, 112, 2, 767, 770, 7, 97, 2, 2, 768, 770, 5, 219, 110, 2, 769, 765, 3, 2, 2, 2, 769, 766, 3, 2, 2, 2, 769, 767, 3, 2, 2, 2, 769, 768, 3, 2, 2, 2, 770, 234, 3, 2, 2, 2, 771, 775, 5, 221, 111, 2, 772, 774, 5, 233, 117, 2, 773, 772, 3, 2, 2, 2, 774, 777, 3, 2, 2, 2, 775, 773, 3, 2, 2, 2, 775, 776, 3, 2, 2, 2, 776, 236, 3, 2, 2, 2, 777, 775, 3, 2, 2, 2, 778, 779, 9, 9, 2, 2, 779, 238, 3, 2, 2, 2, 780, 781, 5, 237, 119, 2, 781, 782, 5, 243, 122, 2, 782, 783, 5, 237, 119, 2, 783, 240, 3, 2, 2, 2, 784, 786, 10, 10, 2, 2, 785, 784, 3, 2, 2, 2, 786, 787, 3, 2, 2, 2, 787, 788, 3, 2, 2, 2, 787, 785, 3, 2, 2, 2, 788, 242, 3, 2, 2, 2, 789, 793, 5, 241, 121, 2, 790, 793, 5, 213, 107, 2, 791, 793, 5, 215, 108, 2, 792, 789, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 792, 791, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 792, 3, 2, 2, 2, 794, 795, 3, 2, 2, 2, 795, 244, 3, 2, 2, 2, 796, 798, 5, 191, 96, 2, 797, 799, 5, 243, 122, 2, 798, 797, 3, 2, 2, 2, 798, 799, 3, 2, 2, 2, 799, 800, 3, 2, 2, 2, 800, 801, 5, 193, 97, 2, 801, 246, 3, 2, 2, 2, 802, 803, 7, 49, 2, 2, 803, 804, 7, 49, 2, 2, 804, 808, 3, 2, 2, 2, 805, 807, 10, 11, 2, 2, 806, 805, 3, 2, 2, 2, 807, 810, 3, 2, 2, 2, 808, 806, 3, 2, 2, 2, 808, 809, 3, 2, 2, 2, 809, 248, 3, 2, 2, 2, 810, 808, 3, 2, 2, 2, 811, 812, 7, 49, 2, 2, 812, 813, 7, 44, 2, 2, 813, 814, 3, 2, 2, 2, 814, 815, 5, 243, 122, 2, 815, 816, 7, 44, 2, 2, 816, 817, 7, 49, 2, 2, 817, 250, 3, 2, 2, 2, 18, 2, 713, 718, 725, 734, 747, 754, 759, 763, 769, 775, 787, 792, 794, 798, 808, 3, 8, 2, 2] \ No newline at end of file diff --git a/internal/qasm3/qasm3_lexer.go b/internal/qasm3/qasm3_lexer.go index 405d3cc..b79c9ff 100644 --- a/internal/qasm3/qasm3_lexer.go +++ b/internal/qasm3/qasm3_lexer.go @@ -14,7 +14,7 @@ var _ = fmt.Printf var _ = unicode.IsLetter var serializedLexerAtn = []uint16{ - 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 116, 814, + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 116, 818, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, @@ -95,61 +95,62 @@ var serializedLexerAtn = []uint16{ 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 6, 121, 786, 10, 121, 13, 121, 14, 121, 787, 3, 122, 3, 122, 3, 122, 6, 122, 793, 10, 122, 13, 122, 14, 122, 794, 3, 123, 3, 123, 5, 123, 799, 10, 123, 3, 123, 3, 123, 3, - 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, - 125, 3, 125, 3, 125, 3, 787, 2, 126, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, - 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, - 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, - 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, - 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, - 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, - 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, - 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, - 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, - 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, - 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, - 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, - 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, - 109, 217, 2, 219, 110, 221, 2, 223, 2, 225, 2, 227, 2, 229, 111, 231, 112, - 233, 2, 235, 113, 237, 2, 239, 114, 241, 2, 243, 2, 245, 2, 247, 115, 249, - 116, 3, 2, 11, 4, 2, 11, 11, 34, 34, 4, 2, 12, 12, 15, 15, 3, 2, 50, 59, - 3, 2, 99, 124, 3, 2, 67, 92, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, - 47, 4, 2, 36, 36, 41, 41, 5, 2, 11, 12, 15, 15, 34, 34, 3, 3, 2, 55057, - 3, 55057, 3, 824, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, - 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, - 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, - 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, - 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, - 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, - 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, - 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, - 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, - 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, - 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, - 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, - 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, - 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, - 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, - 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, - 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, - 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, - 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, - 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, - 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, - 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, - 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, - 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, - 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, - 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, - 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, - 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, - 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, - 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, - 235, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, - 2, 2, 3, 251, 3, 2, 2, 2, 5, 260, 3, 2, 2, 2, 7, 268, 3, 2, 2, 2, 9, 274, - 3, 2, 2, 2, 11, 279, 3, 2, 2, 2, 13, 283, 3, 2, 2, 2, 15, 288, 3, 2, 2, - 2, 17, 292, 3, 2, 2, 2, 19, 297, 3, 2, 2, 2, 21, 303, 3, 2, 2, 2, 23, 309, - 3, 2, 2, 2, 25, 315, 3, 2, 2, 2, 27, 320, 3, 2, 2, 2, 29, 326, 3, 2, 2, - 2, 31, 330, 3, 2, 2, 2, 33, 333, 3, 2, 2, 2, 35, 338, 3, 2, 2, 2, 37, 346, + 124, 3, 124, 3, 124, 3, 124, 7, 124, 807, 10, 124, 12, 124, 14, 124, 810, + 11, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 787, + 2, 126, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, + 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, + 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, + 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, + 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, + 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, + 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, + 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, + 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, + 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, + 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, + 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, + 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 2, 219, 110, + 221, 2, 223, 2, 225, 2, 227, 2, 229, 111, 231, 112, 233, 2, 235, 113, 237, + 2, 239, 114, 241, 2, 243, 2, 245, 2, 247, 115, 249, 116, 3, 2, 12, 4, 2, + 11, 11, 34, 34, 3, 2, 12, 12, 3, 2, 50, 59, 3, 2, 99, 124, 3, 2, 67, 92, + 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 36, 36, 41, 41, 5, + 2, 11, 12, 15, 15, 34, 34, 4, 2, 12, 12, 15, 15, 3, 3, 2, 55057, 3, 55057, + 3, 829, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, + 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, + 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, + 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, + 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, + 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, + 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, + 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, + 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, + 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, + 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, + 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, + 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, + 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, + 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, + 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, + 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, + 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, + 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, + 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, + 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, + 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, + 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, + 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, + 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, + 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, + 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, + 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, + 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, + 2, 219, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 235, 3, + 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 3, + 251, 3, 2, 2, 2, 5, 260, 3, 2, 2, 2, 7, 268, 3, 2, 2, 2, 9, 274, 3, 2, + 2, 2, 11, 279, 3, 2, 2, 2, 13, 283, 3, 2, 2, 2, 15, 288, 3, 2, 2, 2, 17, + 292, 3, 2, 2, 2, 19, 297, 3, 2, 2, 2, 21, 303, 3, 2, 2, 2, 23, 309, 3, + 2, 2, 2, 25, 315, 3, 2, 2, 2, 27, 320, 3, 2, 2, 2, 29, 326, 3, 2, 2, 2, + 31, 330, 3, 2, 2, 2, 33, 333, 3, 2, 2, 2, 35, 338, 3, 2, 2, 2, 37, 346, 3, 2, 2, 2, 39, 354, 3, 2, 2, 2, 41, 358, 3, 2, 2, 2, 43, 362, 3, 2, 2, 2, 45, 367, 3, 2, 2, 2, 47, 369, 3, 2, 2, 2, 49, 372, 3, 2, 2, 2, 51, 374, 3, 2, 2, 2, 53, 380, 3, 2, 2, 2, 55, 382, 3, 2, 2, 2, 57, 384, 3, 2, 2, @@ -181,7 +182,7 @@ var serializedLexerAtn = []uint16{ 2, 2, 225, 740, 3, 2, 2, 2, 227, 742, 3, 2, 2, 2, 229, 747, 3, 2, 2, 2, 231, 756, 3, 2, 2, 2, 233, 769, 3, 2, 2, 2, 235, 771, 3, 2, 2, 2, 237, 778, 3, 2, 2, 2, 239, 780, 3, 2, 2, 2, 241, 785, 3, 2, 2, 2, 243, 792, - 3, 2, 2, 2, 245, 796, 3, 2, 2, 2, 247, 802, 3, 2, 2, 2, 249, 807, 3, 2, + 3, 2, 2, 2, 245, 796, 3, 2, 2, 2, 247, 802, 3, 2, 2, 2, 249, 811, 3, 2, 2, 2, 251, 252, 7, 81, 2, 2, 252, 253, 7, 82, 2, 2, 253, 254, 7, 71, 2, 2, 254, 255, 7, 80, 2, 2, 255, 256, 7, 83, 2, 2, 256, 257, 7, 67, 2, 2, 257, 258, 7, 85, 2, 2, 258, 259, 7, 79, 2, 2, 259, 4, 3, 2, 2, 2, 260, @@ -328,7 +329,7 @@ var serializedLexerAtn = []uint16{ 7, 47, 2, 2, 698, 699, 7, 64, 2, 2, 699, 210, 3, 2, 2, 2, 700, 701, 7, 114, 2, 2, 701, 714, 7, 107, 2, 2, 702, 714, 7, 962, 2, 2, 703, 704, 7, 118, 2, 2, 704, 705, 7, 99, 2, 2, 705, 714, 7, 119, 2, 2, 706, 714, 9, - 11, 2, 2, 707, 708, 7, 103, 2, 2, 708, 709, 7, 119, 2, 2, 709, 710, 7, + 12, 2, 2, 707, 708, 7, 103, 2, 2, 708, 709, 7, 119, 2, 2, 709, 710, 7, 110, 2, 2, 710, 711, 7, 103, 2, 2, 711, 714, 7, 116, 2, 2, 712, 714, 7, 103, 2, 2, 713, 700, 3, 2, 2, 2, 713, 702, 3, 2, 2, 2, 713, 703, 3, 2, 2, 2, 713, 706, 3, 2, 2, 2, 713, 707, 3, 2, 2, 2, 713, 712, 3, 2, 2, 2, @@ -365,11 +366,13 @@ var serializedLexerAtn = []uint16{ 2, 2, 794, 795, 3, 2, 2, 2, 795, 244, 3, 2, 2, 2, 796, 798, 5, 191, 96, 2, 797, 799, 5, 243, 122, 2, 798, 797, 3, 2, 2, 2, 798, 799, 3, 2, 2, 2, 799, 800, 3, 2, 2, 2, 800, 801, 5, 193, 97, 2, 801, 246, 3, 2, 2, 2, 802, - 803, 7, 49, 2, 2, 803, 804, 7, 49, 2, 2, 804, 805, 3, 2, 2, 2, 805, 806, - 5, 243, 122, 2, 806, 248, 3, 2, 2, 2, 807, 808, 7, 49, 2, 2, 808, 809, - 7, 44, 2, 2, 809, 810, 3, 2, 2, 2, 810, 811, 5, 243, 122, 2, 811, 812, - 7, 44, 2, 2, 812, 813, 7, 49, 2, 2, 813, 250, 3, 2, 2, 2, 17, 2, 713, 718, - 725, 734, 747, 754, 759, 763, 769, 775, 787, 792, 794, 798, 3, 8, 2, 2, + 803, 7, 49, 2, 2, 803, 804, 7, 49, 2, 2, 804, 808, 3, 2, 2, 2, 805, 807, + 10, 11, 2, 2, 806, 805, 3, 2, 2, 2, 807, 810, 3, 2, 2, 2, 808, 806, 3, + 2, 2, 2, 808, 809, 3, 2, 2, 2, 809, 248, 3, 2, 2, 2, 810, 808, 3, 2, 2, + 2, 811, 812, 7, 49, 2, 2, 812, 813, 7, 44, 2, 2, 813, 814, 3, 2, 2, 2, + 814, 815, 5, 243, 122, 2, 815, 816, 7, 44, 2, 2, 816, 817, 7, 49, 2, 2, + 817, 250, 3, 2, 2, 2, 18, 2, 713, 718, 725, 734, 747, 754, 759, 763, 769, + 775, 787, 792, 794, 798, 808, 3, 8, 2, 2, } var lexerChannelNames = []string{ diff --git a/pkg/circuit/gates/multi/cnot.go b/pkg/circuit/gates/multi/cnot.go new file mode 100644 index 0000000..8943888 --- /dev/null +++ b/pkg/circuit/gates/multi/cnot.go @@ -0,0 +1,71 @@ +package multi + +import ( + "fmt" + "strconv" + + "github.com/Quant-Team/qvm/pkg/circuit/gates" + "github.com/Quant-Team/qvm/pkg/circuit/gates/one" + "github.com/Quant-Team/qvm/pkg/math/matrix" + "gorgonia.org/tensor" +) + +type GateFunc = func() gates.Gate + +func CNOT(bit int, control []int64, target int64) GateFunc { + return func() gates.Gate { + m := one.I() + f := fmt.Sprintf("%s%s%s", "%0", strconv.Itoa(bit), "s") + for i := 1; i < bit; i++ { + + g2 := one.I().Matrix + m.Matrix = m.ProductMatrix(g2) + } + + if !m.Shape().IsMatrix() { + panic("expected matrix shape") + } + + dimension := m.Shape()[0] + b := make([]complex128, dimension*dimension) + index := make([]int, 0) + g := matrix.Matrix{tensor.New(tensor.WithShape(dimension, dimension), tensor.WithBacking(b))} + for i := 0; i < dimension; i++ { + bits := []rune(fmt.Sprintf(f, strconv.FormatInt(int64(i), 2))) + + // Apply X + apply := true + for j := range control { + if bits[control[j]] == '0' { + apply = false + break + } + } + + if apply { + if bits[target] == '0' { + bits[target] = '1' + } else { + bits[target] = '0' + } + } + + v, err := strconv.ParseInt(string(bits), 2, 0) + if err != nil { + panic(fmt.Sprintf("parse int: %v", err)) + } + + index = append(index, int(v)) + } + fmt.Println(m) + for i, ii := range index { + for j := 0; j < dimension; j++ { + v, _ := m.At(ii, j) + g.SetAt(v, i, j) + } + } + fmt.Println(g) + + return gates.Gate{g} + } +} diff --git a/pkg/circuit/gates/multi/cnot_test.go b/pkg/circuit/gates/multi/cnot_test.go new file mode 100644 index 0000000..3391799 --- /dev/null +++ b/pkg/circuit/gates/multi/cnot_test.go @@ -0,0 +1,12 @@ +package multi + +import ( + "fmt" + "testing" +) + +func TestCNOT(t *testing.T) { + g := CNOT(3, []int64{1}, 2)() + fmt.Println(g.Shape()) + fmt.Println(g) +} diff --git a/pkg/machine/register_qasm3.go b/pkg/machine/register_qasm3.go index e78641a..a7d7980 100644 --- a/pkg/machine/register_qasm3.go +++ b/pkg/machine/register_qasm3.go @@ -10,6 +10,7 @@ import ( "github.com/Quant-Team/qvm/internal/qasm3" "github.com/Quant-Team/qvm/pkg/circuit" + "github.com/Quant-Team/qvm/pkg/circuit/gates/one" "github.com/antlr/antlr4/runtime/Go/antlr" ) @@ -56,15 +57,26 @@ func (r *register) EnterQuantumGateCall(c *qasm3.QuantumGateCallContext) { for j := rp.GetStart(); j < rp.GetEnd(); j++ { r.q[j] = circuit.Zero() } + case "U": + case "CX": default: - if _, ok := r.gates[v]; ok { - fmt.Println(">>>", v) + if _, ok := r.gates[v]; !ok { + panic("not found defenition of gate: " + v) + } + switch v { + case "h": + ci := c.IndexIdentifierList().(*qasm3.IndexIdentifierListContext) + ci2 := ci.IndexIdentifier(0).(*qasm3.IndexIdentifierContext) + di := ci2.Designator().(*qasm3.DesignatorContext) + i, _ := strconv.Atoi(di.Expression().GetText()) + r.q[i].Apply(one.H()) + case "cx": } } } func (r *register) EnterGlobalStatement(c *qasm3.GlobalStatementContext) { - fmt.Println(">>>", c.GetText()) + // fmt.Println(">>", c.GetText()) } func (r *register) EnterQuantumGateDefinition(c *qasm3.QuantumGateDefinitionContext) {