From 511f2f7b67ce6c2eb5154533e53937d9e62c4193 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 3 Aug 2023 15:46:26 -0400 Subject: [PATCH] Add parsing of sum type declarations (#1088) * Add syntax for sum type declarations * Add parser generator updates * Adapt flattening and graphics for sum types * Add unit test for sum type declaration parsing * Update the super spec Not sure why this updating. Tests succeed whether this file is updated or not. But, well, it's up to date now :) * Add test for IRPrinting --- quint/src/IRprinting.ts | 24 +- quint/src/flattening.ts | 20 +- quint/src/generated/Quint.g4 | 10 +- quint/src/generated/Quint.interp | 5 +- quint/src/generated/Quint.tokens | 40 +- quint/src/generated/QuintLexer.interp | 4 +- quint/src/generated/QuintLexer.tokens | 40 +- quint/src/generated/QuintLexer.ts | 106 +- quint/src/generated/QuintListener.ts | 26 + quint/src/generated/QuintParser.ts | 2167 +++++++++-------- quint/src/generated/QuintVisitor.ts | 17 + quint/src/graphics.ts | 18 +- quint/src/parsing/ToIrListener.ts | 50 +- quint/src/quintTypes.ts | 33 +- quint/test/IRprinting.test.ts | 17 + .../test/parsing/quintParserFrontend.test.ts | 22 + quint/testFixture/SuperSpec.json | 2 +- 17 files changed, 1497 insertions(+), 1104 deletions(-) diff --git a/quint/src/IRprinting.ts b/quint/src/IRprinting.ts index eba924cf7..d63d6e6a0 100644 --- a/quint/src/IRprinting.ts +++ b/quint/src/IRprinting.ts @@ -13,7 +13,7 @@ */ import { OpQualifier, QuintDef, QuintEx, QuintModule, isAnnotatedDef } from './quintIr' -import { EmptyRow, QuintType, Row, VarRow } from './quintTypes' +import { EmptyRow, QuintSumType, QuintType, Row, RowField, VarRow, isTheUnit } from './quintTypes' import { TypeScheme } from './types/base' import { typeSchemeToString } from './types/printing' @@ -160,6 +160,9 @@ export function typeToString(type: QuintType): string { case 'rec': { return rowToString(type.fields) } + case 'sum': { + return sumToString(type) + } case 'union': { const records = type.records.map(rec => { return `| { ${type.tag}: "${rec.tagValue}", ${rowFieldsToString(rec.fields)} }` @@ -181,6 +184,25 @@ export function rowToString(r: Row): string { return fields === '' ? '{}' : `{ ${fields} }` } +/** + * Pretty prints a sum type. Standard sum printing used in error reporting + * + * @param r the sum type to be formatted + * + * @returns a string with the pretty printed sum + */ +export function sumToString(s: QuintSumType): string { + return s.fields.fields + .map((f: RowField) => { + if (isTheUnit(f.fieldType)) { + return `| ${f.fieldName}` + } else { + return `| ${f.fieldName}(${typeToString(f.fieldType)})` + } + }) + .join('\n') +} + /** * Pretty prints an operator qualifier. * diff --git a/quint/src/flattening.ts b/quint/src/flattening.ts index 853e0df52..ce4e22202 100644 --- a/quint/src/flattening.ts +++ b/quint/src/flattening.ts @@ -28,7 +28,7 @@ import { isFlat, } from './quintIr' import { definitionToString } from './IRprinting' -import { QuintType, Row } from './quintTypes' +import { ConcreteFixedRow, QuintType, Row } from './quintTypes' import { Loc, parsePhase3importAndNameResolution } from './parsing/quintParserFrontend' import { compact, uniqBy } from 'lodash' import { AnalysisOutput } from './quintAnalyzer' @@ -398,6 +398,12 @@ class Flatenner { fields: this.addNamespaceToRow(name, type.fields), id, } + case 'sum': + return { + ...type, + fields: this.addNamespaceToSumRow(name, type.fields), + id, + } case 'union': return { ...type, @@ -428,6 +434,18 @@ class Flatenner { } } + private addNamespaceToSumRow(name: string | undefined, row: ConcreteFixedRow): ConcreteFixedRow { + return { + ...row, + fields: row.fields.map(field => { + return { + ...field, + fieldType: this.addNamespaceToType(name, field.fieldType), + } + }), + } + } + private namespacedName(namespace: string | undefined, name: string): string { return namespace ? `${namespace}::${name}` : name } diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index c9d0aca01..ed4eceb9c 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -52,10 +52,16 @@ operDef : qualifier normalCallName ; typeDef - : 'type' qualId # typeAbstractDef - | 'type' qualId '=' type # typeAliasDef + : 'type' qualId # typeAbstractDef + | 'type' qualId '=' type # typeAliasDef + | 'type' typeName=qualId '=' '|'? typeSumVariant ('|' typeSumVariant)* # typeSumDef ; +// A single variant case in a sum type definition. +// +// E.g., `A(t)` or `A`. +typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; + nondetOperDef : 'nondet' qualId (':' type)? '=' expr ';'?; qualifier : 'val' diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index a2dece422..9ded23535 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -10,6 +10,7 @@ null ',' ';' 'type' +'|' 'nondet' 'val' 'def' @@ -29,7 +30,6 @@ null 'int' 'str' 'bool' -'|' '^' '\'' 'all' @@ -149,6 +149,7 @@ documentedUnit unit operDef typeDef +typeSumVariant nondetOperDef qualifier importMod @@ -179,4 +180,4 @@ simpleId atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 71, 703, 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, 3, 2, 6, 2, 70, 10, 2, 13, 2, 14, 2, 71, 3, 2, 3, 2, 3, 3, 7, 3, 77, 10, 3, 12, 3, 14, 3, 80, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 86, 10, 3, 12, 3, 14, 3, 89, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 94, 10, 4, 12, 4, 14, 4, 97, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 121, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 129, 10, 6, 12, 6, 14, 6, 132, 11, 6, 5, 6, 134, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 139, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 152, 10, 6, 12, 6, 14, 6, 155, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 161, 10, 6, 3, 6, 3, 6, 5, 6, 165, 10, 6, 3, 6, 5, 6, 168, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 177, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 183, 10, 8, 3, 8, 3, 8, 3, 8, 5, 8, 188, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 199, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 207, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 213, 10, 10, 3, 10, 3, 10, 5, 10, 217, 10, 10, 5, 10, 219, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 230, 10, 11, 5, 11, 232, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 245, 10, 12, 12, 12, 14, 12, 248, 11, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 255, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 268, 10, 12, 12, 12, 14, 12, 271, 11, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 278, 10, 12, 5, 12, 280, 10, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 295, 10, 17, 12, 17, 14, 17, 298, 11, 17, 5, 17, 300, 10, 17, 3, 17, 5, 17, 303, 10, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 324, 10, 17, 12, 17, 14, 17, 327, 11, 17, 3, 17, 5, 17, 330, 10, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 6, 17, 339, 10, 17, 13, 17, 14, 17, 340, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 5, 17, 351, 10, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 359, 10, 17, 12, 17, 14, 17, 362, 11, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 371, 10, 18, 3, 18, 5, 18, 374, 10, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 383, 10, 19, 12, 19, 14, 19, 386, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 395, 10, 19, 5, 19, 397, 10, 19, 3, 19, 3, 19, 5, 19, 401, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 410, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 426, 10, 21, 12, 21, 14, 21, 429, 11, 21, 3, 21, 5, 21, 432, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 441, 10, 21, 12, 21, 14, 21, 444, 11, 21, 3, 21, 5, 21, 447, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 456, 10, 21, 12, 21, 14, 21, 459, 11, 21, 3, 21, 5, 21, 462, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 471, 10, 21, 12, 21, 14, 21, 474, 11, 21, 3, 21, 5, 21, 477, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 485, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 493, 10, 21, 12, 21, 14, 21, 496, 11, 21, 3, 21, 5, 21, 499, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 507, 10, 21, 12, 21, 14, 21, 510, 11, 21, 3, 21, 5, 21, 513, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 521, 10, 21, 12, 21, 14, 21, 524, 11, 21, 5, 21, 526, 10, 21, 3, 21, 5, 21, 529, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 554, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 593, 10, 21, 3, 21, 5, 21, 596, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 6, 21, 612, 10, 21, 13, 21, 14, 21, 613, 7, 21, 616, 10, 21, 12, 21, 14, 21, 619, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 630, 10, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 640, 10, 23, 12, 23, 14, 23, 643, 11, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 649, 10, 23, 3, 24, 3, 24, 5, 24, 653, 10, 24, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 659, 10, 26, 3, 27, 3, 27, 3, 27, 7, 27, 664, 10, 27, 12, 27, 14, 27, 667, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 675, 10, 28, 3, 29, 3, 29, 5, 29, 679, 10, 29, 3, 30, 3, 30, 5, 30, 683, 10, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 7, 33, 692, 10, 33, 12, 33, 14, 33, 695, 11, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 701, 10, 34, 3, 34, 2, 2, 4, 32, 40, 35, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 2, 9, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 2, 798, 2, 69, 3, 2, 2, 2, 4, 78, 3, 2, 2, 2, 6, 95, 3, 2, 2, 2, 8, 120, 3, 2, 2, 2, 10, 122, 3, 2, 2, 2, 12, 176, 3, 2, 2, 2, 14, 178, 3, 2, 2, 2, 16, 198, 3, 2, 2, 2, 18, 218, 3, 2, 2, 2, 20, 231, 3, 2, 2, 2, 22, 279, 3, 2, 2, 2, 24, 281, 3, 2, 2, 2, 26, 283, 3, 2, 2, 2, 28, 285, 3, 2, 2, 2, 30, 287, 3, 2, 2, 2, 32, 350, 3, 2, 2, 2, 34, 363, 3, 2, 2, 2, 36, 400, 3, 2, 2, 2, 38, 402, 3, 2, 2, 2, 40, 553, 3, 2, 2, 2, 42, 629, 3, 2, 2, 2, 44, 648, 3, 2, 2, 2, 46, 652, 3, 2, 2, 2, 48, 654, 3, 2, 2, 2, 50, 658, 3, 2, 2, 2, 52, 660, 3, 2, 2, 2, 54, 674, 3, 2, 2, 2, 56, 678, 3, 2, 2, 2, 58, 682, 3, 2, 2, 2, 60, 684, 3, 2, 2, 2, 62, 686, 3, 2, 2, 2, 64, 688, 3, 2, 2, 2, 66, 700, 3, 2, 2, 2, 68, 70, 5, 4, 3, 2, 69, 68, 3, 2, 2, 2, 70, 71, 3, 2, 2, 2, 71, 69, 3, 2, 2, 2, 71, 72, 3, 2, 2, 2, 72, 73, 3, 2, 2, 2, 73, 74, 7, 2, 2, 3, 74, 3, 3, 2, 2, 2, 75, 77, 7, 68, 2, 2, 76, 75, 3, 2, 2, 2, 77, 80, 3, 2, 2, 2, 78, 76, 3, 2, 2, 2, 78, 79, 3, 2, 2, 2, 79, 81, 3, 2, 2, 2, 80, 78, 3, 2, 2, 2, 81, 82, 7, 3, 2, 2, 82, 83, 5, 64, 33, 2, 83, 87, 7, 4, 2, 2, 84, 86, 5, 6, 4, 2, 85, 84, 3, 2, 2, 2, 86, 89, 3, 2, 2, 2, 87, 85, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, 88, 90, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 90, 91, 7, 5, 2, 2, 91, 5, 3, 2, 2, 2, 92, 94, 7, 68, 2, 2, 93, 92, 3, 2, 2, 2, 94, 97, 3, 2, 2, 2, 95, 93, 3, 2, 2, 2, 95, 96, 3, 2, 2, 2, 96, 98, 3, 2, 2, 2, 97, 95, 3, 2, 2, 2, 98, 99, 5, 8, 5, 2, 99, 7, 3, 2, 2, 2, 100, 101, 7, 6, 2, 2, 101, 102, 5, 64, 33, 2, 102, 103, 7, 7, 2, 2, 103, 104, 5, 32, 17, 2, 104, 121, 3, 2, 2, 2, 105, 106, 7, 8, 2, 2, 106, 107, 5, 64, 33, 2, 107, 108, 7, 7, 2, 2, 108, 109, 5, 32, 17, 2, 109, 121, 3, 2, 2, 2, 110, 111, 7, 9, 2, 2, 111, 112, 5, 46, 24, 2, 112, 113, 7, 64, 2, 2, 113, 114, 5, 40, 21, 2, 114, 121, 3, 2, 2, 2, 115, 121, 5, 22, 12, 2, 116, 121, 5, 10, 6, 2, 117, 121, 5, 12, 7, 2, 118, 121, 5, 18, 10, 2, 119, 121, 5, 20, 11, 2, 120, 100, 3, 2, 2, 2, 120, 105, 3, 2, 2, 2, 120, 110, 3, 2, 2, 2, 120, 115, 3, 2, 2, 2, 120, 116, 3, 2, 2, 2, 120, 117, 3, 2, 2, 2, 120, 118, 3, 2, 2, 2, 120, 119, 3, 2, 2, 2, 121, 9, 3, 2, 2, 2, 122, 123, 5, 16, 9, 2, 123, 160, 5, 56, 29, 2, 124, 133, 7, 65, 2, 2, 125, 130, 5, 48, 25, 2, 126, 127, 7, 10, 2, 2, 127, 129, 5, 48, 25, 2, 128, 126, 3, 2, 2, 2, 129, 132, 3, 2, 2, 2, 130, 128, 3, 2, 2, 2, 130, 131, 3, 2, 2, 2, 131, 134, 3, 2, 2, 2, 132, 130, 3, 2, 2, 2, 133, 125, 3, 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 135, 138, 7, 66, 2, 2, 136, 137, 7, 7, 2, 2, 137, 139, 5, 32, 17, 2, 138, 136, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 161, 3, 2, 2, 2, 140, 141, 7, 7, 2, 2, 141, 161, 5, 32, 17, 2, 142, 143, 7, 65, 2, 2, 143, 144, 5, 48, 25, 2, 144, 145, 7, 7, 2, 2, 145, 153, 5, 32, 17, 2, 146, 147, 7, 10, 2, 2, 147, 148, 5, 48, 25, 2, 148, 149, 7, 7, 2, 2, 149, 150, 5, 32, 17, 2, 150, 152, 3, 2, 2, 2, 151, 146, 3, 2, 2, 2, 152, 155, 3, 2, 2, 2, 153, 151, 3, 2, 2, 2, 153, 154, 3, 2, 2, 2, 154, 156, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 156, 157, 7, 66, 2, 2, 157, 158, 7, 7, 2, 2, 158, 159, 5, 32, 17, 2, 159, 161, 3, 2, 2, 2, 160, 124, 3, 2, 2, 2, 160, 140, 3, 2, 2, 2, 160, 142, 3, 2, 2, 2, 160, 161, 3, 2, 2, 2, 161, 164, 3, 2, 2, 2, 162, 163, 7, 64, 2, 2, 163, 165, 5, 40, 21, 2, 164, 162, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 167, 3, 2, 2, 2, 166, 168, 7, 11, 2, 2, 167, 166, 3, 2, 2, 2, 167, 168, 3, 2, 2, 2, 168, 11, 3, 2, 2, 2, 169, 170, 7, 12, 2, 2, 170, 177, 5, 64, 33, 2, 171, 172, 7, 12, 2, 2, 172, 173, 5, 64, 33, 2, 173, 174, 7, 64, 2, 2, 174, 175, 5, 32, 17, 2, 175, 177, 3, 2, 2, 2, 176, 169, 3, 2, 2, 2, 176, 171, 3, 2, 2, 2, 177, 13, 3, 2, 2, 2, 178, 179, 7, 13, 2, 2, 179, 182, 5, 64, 33, 2, 180, 181, 7, 7, 2, 2, 181, 183, 5, 32, 17, 2, 182, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 185, 7, 64, 2, 2, 185, 187, 5, 40, 21, 2, 186, 188, 7, 11, 2, 2, 187, 186, 3, 2, 2, 2, 187, 188, 3, 2, 2, 2, 188, 15, 3, 2, 2, 2, 189, 199, 7, 14, 2, 2, 190, 199, 7, 15, 2, 2, 191, 192, 7, 16, 2, 2, 192, 199, 7, 14, 2, 2, 193, 194, 7, 16, 2, 2, 194, 199, 7, 15, 2, 2, 195, 199, 7, 17, 2, 2, 196, 199, 7, 18, 2, 2, 197, 199, 7, 19, 2, 2, 198, 189, 3, 2, 2, 2, 198, 190, 3, 2, 2, 2, 198, 191, 3, 2, 2, 2, 198, 193, 3, 2, 2, 2, 198, 195, 3, 2, 2, 2, 198, 196, 3, 2, 2, 2, 198, 197, 3, 2, 2, 2, 199, 17, 3, 2, 2, 2, 200, 201, 7, 20, 2, 2, 201, 202, 5, 26, 14, 2, 202, 203, 7, 21, 2, 2, 203, 206, 5, 50, 26, 2, 204, 205, 7, 22, 2, 2, 205, 207, 5, 30, 16, 2, 206, 204, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 219, 3, 2, 2, 2, 208, 209, 7, 20, 2, 2, 209, 212, 5, 26, 14, 2, 210, 211, 7, 23, 2, 2, 211, 213, 5, 26, 14, 2, 212, 210, 3, 2, 2, 2, 212, 213, 3, 2, 2, 2, 213, 216, 3, 2, 2, 2, 214, 215, 7, 22, 2, 2, 215, 217, 5, 30, 16, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 219, 3, 2, 2, 2, 218, 200, 3, 2, 2, 2, 218, 208, 3, 2, 2, 2, 219, 19, 3, 2, 2, 2, 220, 221, 7, 24, 2, 2, 221, 222, 5, 26, 14, 2, 222, 223, 7, 21, 2, 2, 223, 224, 5, 50, 26, 2, 224, 232, 3, 2, 2, 2, 225, 226, 7, 24, 2, 2, 226, 229, 5, 26, 14, 2, 227, 228, 7, 23, 2, 2, 228, 230, 5, 26, 14, 2, 229, 227, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 232, 3, 2, 2, 2, 231, 220, 3, 2, 2, 2, 231, 225, 3, 2, 2, 2, 232, 21, 3, 2, 2, 2, 233, 234, 7, 20, 2, 2, 234, 235, 5, 24, 13, 2, 235, 236, 7, 65, 2, 2, 236, 237, 5, 26, 14, 2, 237, 238, 7, 64, 2, 2, 238, 246, 5, 40, 21, 2, 239, 240, 7, 10, 2, 2, 240, 241, 5, 26, 14, 2, 241, 242, 7, 64, 2, 2, 242, 243, 5, 40, 21, 2, 243, 245, 3, 2, 2, 2, 244, 239, 3, 2, 2, 2, 245, 248, 3, 2, 2, 2, 246, 244, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 249, 3, 2, 2, 2, 248, 246, 3, 2, 2, 2, 249, 250, 7, 66, 2, 2, 250, 251, 7, 21, 2, 2, 251, 254, 7, 55, 2, 2, 252, 253, 7, 22, 2, 2, 253, 255, 5, 30, 16, 2, 254, 252, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 280, 3, 2, 2, 2, 256, 257, 7, 20, 2, 2, 257, 258, 5, 24, 13, 2, 258, 259, 7, 65, 2, 2, 259, 260, 5, 26, 14, 2, 260, 261, 7, 64, 2, 2, 261, 269, 5, 40, 21, 2, 262, 263, 7, 10, 2, 2, 263, 264, 5, 26, 14, 2, 264, 265, 7, 64, 2, 2, 265, 266, 5, 40, 21, 2, 266, 268, 3, 2, 2, 2, 267, 262, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 272, 3, 2, 2, 2, 271, 269, 3, 2, 2, 2, 272, 273, 7, 66, 2, 2, 273, 274, 7, 23, 2, 2, 274, 277, 5, 28, 15, 2, 275, 276, 7, 22, 2, 2, 276, 278, 5, 30, 16, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 233, 3, 2, 2, 2, 279, 256, 3, 2, 2, 2, 280, 23, 3, 2, 2, 2, 281, 282, 5, 64, 33, 2, 282, 25, 3, 2, 2, 2, 283, 284, 5, 64, 33, 2, 284, 27, 3, 2, 2, 2, 285, 286, 5, 64, 33, 2, 286, 29, 3, 2, 2, 2, 287, 288, 7, 42, 2, 2, 288, 31, 3, 2, 2, 2, 289, 290, 8, 17, 1, 2, 290, 299, 7, 65, 2, 2, 291, 296, 5, 32, 17, 2, 292, 293, 7, 10, 2, 2, 293, 295, 5, 32, 17, 2, 294, 292, 3, 2, 2, 2, 295, 298, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 296, 3, 2, 2, 2, 299, 291, 3, 2, 2, 2, 299, 300, 3, 2, 2, 2, 300, 302, 3, 2, 2, 2, 301, 303, 7, 10, 2, 2, 302, 301, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 304, 3, 2, 2, 2, 304, 305, 7, 66, 2, 2, 305, 306, 7, 26, 2, 2, 306, 351, 5, 32, 17, 13, 307, 308, 7, 49, 2, 2, 308, 309, 7, 27, 2, 2, 309, 310, 5, 32, 17, 2, 310, 311, 7, 28, 2, 2, 311, 351, 3, 2, 2, 2, 312, 313, 7, 50, 2, 2, 313, 314, 7, 27, 2, 2, 314, 315, 5, 32, 17, 2, 315, 316, 7, 28, 2, 2, 316, 351, 3, 2, 2, 2, 317, 318, 7, 65, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 10, 2, 2, 320, 325, 5, 32, 17, 2, 321, 322, 7, 10, 2, 2, 322, 324, 5, 32, 17, 2, 323, 321, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 328, 330, 7, 10, 2, 2, 329, 328, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 332, 7, 66, 2, 2, 332, 351, 3, 2, 2, 2, 333, 334, 7, 4, 2, 2, 334, 335, 5, 36, 19, 2, 335, 336, 7, 5, 2, 2, 336, 351, 3, 2, 2, 2, 337, 339, 5, 34, 18, 2, 338, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 338, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 351, 3, 2, 2, 2, 342, 351, 7, 29, 2, 2, 343, 351, 7, 30, 2, 2, 344, 351, 7, 31, 2, 2, 345, 351, 5, 64, 33, 2, 346, 347, 7, 65, 2, 2, 347, 348, 5, 32, 17, 2, 348, 349, 7, 66, 2, 2, 349, 351, 3, 2, 2, 2, 350, 289, 3, 2, 2, 2, 350, 307, 3, 2, 2, 2, 350, 312, 3, 2, 2, 2, 350, 317, 3, 2, 2, 2, 350, 333, 3, 2, 2, 2, 350, 338, 3, 2, 2, 2, 350, 342, 3, 2, 2, 2, 350, 343, 3, 2, 2, 2, 350, 344, 3, 2, 2, 2, 350, 345, 3, 2, 2, 2, 350, 346, 3, 2, 2, 2, 351, 360, 3, 2, 2, 2, 352, 353, 12, 15, 2, 2, 353, 354, 7, 25, 2, 2, 354, 359, 5, 32, 17, 15, 355, 356, 12, 14, 2, 2, 356, 357, 7, 26, 2, 2, 357, 359, 5, 32, 17, 14, 358, 352, 3, 2, 2, 2, 358, 355, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 33, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 363, 364, 7, 32, 2, 2, 364, 365, 7, 4, 2, 2, 365, 366, 5, 64, 33, 2, 366, 367, 7, 7, 2, 2, 367, 370, 7, 42, 2, 2, 368, 369, 7, 10, 2, 2, 369, 371, 5, 36, 19, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 373, 3, 2, 2, 2, 372, 374, 7, 10, 2, 2, 373, 372, 3, 2, 2, 2, 373, 374, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 376, 7, 5, 2, 2, 376, 35, 3, 2, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 7, 2, 2, 379, 380, 5, 32, 17, 2, 380, 381, 7, 10, 2, 2, 381, 383, 3, 2, 2, 2, 382, 377, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 396, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 388, 5, 38, 20, 2, 388, 389, 7, 7, 2, 2, 389, 390, 5, 32, 17, 2, 390, 394, 3, 2, 2, 2, 391, 395, 7, 10, 2, 2, 392, 393, 7, 32, 2, 2, 393, 395, 7, 67, 2, 2, 394, 391, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 397, 3, 2, 2, 2, 396, 387, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 401, 3, 2, 2, 2, 398, 399, 7, 32, 2, 2, 399, 401, 7, 67, 2, 2, 400, 384, 3, 2, 2, 2, 400, 398, 3, 2, 2, 2, 401, 37, 3, 2, 2, 2, 402, 403, 5, 66, 34, 2, 403, 39, 3, 2, 2, 2, 404, 405, 8, 21, 1, 2, 405, 554, 5, 44, 23, 2, 406, 407, 5, 56, 29, 2, 407, 409, 7, 65, 2, 2, 408, 410, 5, 52, 27, 2, 409, 408, 3, 2, 2, 2, 409, 410, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 412, 7, 66, 2, 2, 412, 554, 3, 2, 2, 2, 413, 414, 7, 54, 2, 2, 414, 554, 5, 40, 21, 27, 415, 416, 5, 64, 33, 2, 416, 417, 7, 34, 2, 2, 417, 418, 7, 64, 2, 2, 418, 419, 5, 40, 21, 23, 419, 554, 3, 2, 2, 2, 420, 421, 7, 45, 2, 2, 421, 422, 7, 4, 2, 2, 422, 427, 5, 40, 21, 2, 423, 424, 7, 10, 2, 2, 424, 426, 5, 40, 21, 2, 425, 423, 3, 2, 2, 2, 426, 429, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 430, 432, 7, 10, 2, 2, 431, 430, 3, 2, 2, 2, 431, 432, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 434, 7, 5, 2, 2, 434, 554, 3, 2, 2, 2, 435, 436, 7, 46, 2, 2, 436, 437, 7, 4, 2, 2, 437, 442, 5, 40, 21, 2, 438, 439, 7, 10, 2, 2, 439, 441, 5, 40, 21, 2, 440, 438, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 447, 7, 10, 2, 2, 446, 445, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 3, 2, 2, 2, 448, 449, 7, 5, 2, 2, 449, 554, 3, 2, 2, 2, 450, 451, 7, 35, 2, 2, 451, 452, 7, 4, 2, 2, 452, 457, 5, 40, 21, 2, 453, 454, 7, 10, 2, 2, 454, 456, 5, 40, 21, 2, 455, 453, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 461, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 462, 7, 10, 2, 2, 461, 460, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 7, 5, 2, 2, 464, 554, 3, 2, 2, 2, 465, 466, 7, 36, 2, 2, 466, 467, 7, 4, 2, 2, 467, 472, 5, 40, 21, 2, 468, 469, 7, 10, 2, 2, 469, 471, 5, 40, 21, 2, 470, 468, 3, 2, 2, 2, 471, 474, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 476, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 475, 477, 7, 10, 2, 2, 476, 475, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 7, 5, 2, 2, 479, 554, 3, 2, 2, 2, 480, 485, 5, 64, 33, 2, 481, 485, 7, 44, 2, 2, 482, 485, 7, 43, 2, 2, 483, 485, 7, 42, 2, 2, 484, 480, 3, 2, 2, 2, 484, 481, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 484, 483, 3, 2, 2, 2, 485, 554, 3, 2, 2, 2, 486, 487, 7, 65, 2, 2, 487, 488, 5, 40, 21, 2, 488, 489, 7, 10, 2, 2, 489, 494, 5, 40, 21, 2, 490, 491, 7, 10, 2, 2, 491, 493, 5, 40, 21, 2, 492, 490, 3, 2, 2, 2, 493, 496, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 497, 499, 7, 10, 2, 2, 498, 497, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 500, 3, 2, 2, 2, 500, 501, 7, 66, 2, 2, 501, 554, 3, 2, 2, 2, 502, 503, 7, 4, 2, 2, 503, 508, 5, 54, 28, 2, 504, 505, 7, 10, 2, 2, 505, 507, 5, 54, 28, 2, 506, 504, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 511, 513, 7, 10, 2, 2, 512, 511, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 7, 5, 2, 2, 515, 554, 3, 2, 2, 2, 516, 525, 7, 27, 2, 2, 517, 522, 5, 40, 21, 2, 518, 519, 7, 10, 2, 2, 519, 521, 5, 40, 21, 2, 520, 518, 3, 2, 2, 2, 521, 524, 3, 2, 2, 2, 522, 520, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 526, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 525, 517, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 528, 3, 2, 2, 2, 527, 529, 7, 10, 2, 2, 528, 527, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 554, 7, 28, 2, 2, 531, 532, 7, 37, 2, 2, 532, 533, 7, 65, 2, 2, 533, 534, 5, 40, 21, 2, 534, 535, 7, 66, 2, 2, 535, 536, 5, 40, 21, 2, 536, 537, 7, 38, 2, 2, 537, 538, 5, 40, 21, 7, 538, 554, 3, 2, 2, 2, 539, 540, 5, 10, 6, 2, 540, 541, 5, 40, 21, 6, 541, 554, 3, 2, 2, 2, 542, 543, 5, 14, 8, 2, 543, 544, 5, 40, 21, 5, 544, 554, 3, 2, 2, 2, 545, 546, 7, 65, 2, 2, 546, 547, 5, 40, 21, 2, 547, 548, 7, 66, 2, 2, 548, 554, 3, 2, 2, 2, 549, 550, 7, 4, 2, 2, 550, 551, 5, 40, 21, 2, 551, 552, 7, 5, 2, 2, 552, 554, 3, 2, 2, 2, 553, 404, 3, 2, 2, 2, 553, 406, 3, 2, 2, 2, 553, 413, 3, 2, 2, 2, 553, 415, 3, 2, 2, 2, 553, 420, 3, 2, 2, 2, 553, 435, 3, 2, 2, 2, 553, 450, 3, 2, 2, 2, 553, 465, 3, 2, 2, 2, 553, 484, 3, 2, 2, 2, 553, 486, 3, 2, 2, 2, 553, 502, 3, 2, 2, 2, 553, 516, 3, 2, 2, 2, 553, 531, 3, 2, 2, 2, 553, 539, 3, 2, 2, 2, 553, 542, 3, 2, 2, 2, 553, 545, 3, 2, 2, 2, 553, 549, 3, 2, 2, 2, 554, 617, 3, 2, 2, 2, 555, 556, 12, 28, 2, 2, 556, 557, 7, 33, 2, 2, 557, 616, 5, 40, 21, 28, 558, 559, 12, 26, 2, 2, 559, 560, 9, 2, 2, 2, 560, 616, 5, 40, 21, 27, 561, 562, 12, 25, 2, 2, 562, 563, 9, 3, 2, 2, 563, 616, 5, 40, 21, 26, 564, 565, 12, 24, 2, 2, 565, 566, 9, 4, 2, 2, 566, 616, 5, 40, 21, 25, 567, 568, 12, 22, 2, 2, 568, 569, 7, 64, 2, 2, 569, 570, 5, 40, 21, 23, 570, 571, 8, 21, 1, 2, 571, 616, 3, 2, 2, 2, 572, 573, 12, 20, 2, 2, 573, 574, 7, 45, 2, 2, 574, 616, 5, 40, 21, 21, 575, 576, 12, 18, 2, 2, 576, 577, 7, 46, 2, 2, 577, 616, 5, 40, 21, 19, 578, 579, 12, 17, 2, 2, 579, 580, 7, 47, 2, 2, 580, 616, 5, 40, 21, 18, 581, 582, 12, 16, 2, 2, 582, 583, 7, 48, 2, 2, 583, 616, 5, 40, 21, 17, 584, 585, 12, 10, 2, 2, 585, 586, 7, 25, 2, 2, 586, 616, 5, 40, 21, 11, 587, 588, 12, 32, 2, 2, 588, 589, 7, 21, 2, 2, 589, 595, 5, 58, 30, 2, 590, 592, 7, 65, 2, 2, 591, 593, 5, 52, 27, 2, 592, 591, 3, 2, 2, 2, 592, 593, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 596, 7, 66, 2, 2, 595, 590, 3, 2, 2, 2, 595, 596, 3, 2, 2, 2, 596, 616, 3, 2, 2, 2, 597, 598, 12, 29, 2, 2, 598, 599, 7, 27, 2, 2, 599, 600, 5, 40, 21, 2, 600, 601, 7, 28, 2, 2, 601, 616, 3, 2, 2, 2, 602, 603, 12, 15, 2, 2, 603, 611, 7, 52, 2, 2, 604, 605, 7, 32, 2, 2, 605, 606, 7, 42, 2, 2, 606, 607, 7, 7, 2, 2, 607, 608, 5, 48, 25, 2, 608, 609, 7, 26, 2, 2, 609, 610, 5, 40, 21, 2, 610, 612, 3, 2, 2, 2, 611, 604, 3, 2, 2, 2, 612, 613, 3, 2, 2, 2, 613, 611, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 616, 3, 2, 2, 2, 615, 555, 3, 2, 2, 2, 615, 558, 3, 2, 2, 2, 615, 561, 3, 2, 2, 2, 615, 564, 3, 2, 2, 2, 615, 567, 3, 2, 2, 2, 615, 572, 3, 2, 2, 2, 615, 575, 3, 2, 2, 2, 615, 578, 3, 2, 2, 2, 615, 581, 3, 2, 2, 2, 615, 584, 3, 2, 2, 2, 615, 587, 3, 2, 2, 2, 615, 597, 3, 2, 2, 2, 615, 602, 3, 2, 2, 2, 616, 619, 3, 2, 2, 2, 617, 615, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 41, 3, 2, 2, 2, 619, 617, 3, 2, 2, 2, 620, 621, 5, 8, 5, 2, 621, 622, 7, 2, 2, 3, 622, 630, 3, 2, 2, 2, 623, 624, 5, 40, 21, 2, 624, 625, 7, 2, 2, 3, 625, 630, 3, 2, 2, 2, 626, 627, 7, 68, 2, 2, 627, 630, 7, 2, 2, 3, 628, 630, 7, 2, 2, 3, 629, 620, 3, 2, 2, 2, 629, 623, 3, 2, 2, 2, 629, 626, 3, 2, 2, 2, 629, 628, 3, 2, 2, 2, 630, 43, 3, 2, 2, 2, 631, 632, 5, 48, 25, 2, 632, 633, 7, 26, 2, 2, 633, 634, 5, 40, 21, 2, 634, 649, 3, 2, 2, 2, 635, 636, 7, 65, 2, 2, 636, 641, 5, 48, 25, 2, 637, 638, 7, 10, 2, 2, 638, 640, 5, 48, 25, 2, 639, 637, 3, 2, 2, 2, 640, 643, 3, 2, 2, 2, 641, 639, 3, 2, 2, 2, 641, 642, 3, 2, 2, 2, 642, 644, 3, 2, 2, 2, 643, 641, 3, 2, 2, 2, 644, 645, 7, 66, 2, 2, 645, 646, 7, 26, 2, 2, 646, 647, 5, 40, 21, 2, 647, 649, 3, 2, 2, 2, 648, 631, 3, 2, 2, 2, 648, 635, 3, 2, 2, 2, 649, 45, 3, 2, 2, 2, 650, 653, 7, 39, 2, 2, 651, 653, 5, 64, 33, 2, 652, 650, 3, 2, 2, 2, 652, 651, 3, 2, 2, 2, 653, 47, 3, 2, 2, 2, 654, 655, 5, 46, 24, 2, 655, 49, 3, 2, 2, 2, 656, 659, 7, 55, 2, 2, 657, 659, 5, 64, 33, 2, 658, 656, 3, 2, 2, 2, 658, 657, 3, 2, 2, 2, 659, 51, 3, 2, 2, 2, 660, 665, 5, 40, 21, 2, 661, 662, 7, 10, 2, 2, 662, 664, 5, 40, 21, 2, 663, 661, 3, 2, 2, 2, 664, 667, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 665, 666, 3, 2, 2, 2, 666, 53, 3, 2, 2, 2, 667, 665, 3, 2, 2, 2, 668, 669, 5, 66, 34, 2, 669, 670, 7, 7, 2, 2, 670, 671, 5, 40, 21, 2, 671, 675, 3, 2, 2, 2, 672, 673, 7, 40, 2, 2, 673, 675, 5, 40, 21, 2, 674, 668, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 675, 55, 3, 2, 2, 2, 676, 679, 5, 64, 33, 2, 677, 679, 9, 5, 2, 2, 678, 676, 3, 2, 2, 2, 678, 677, 3, 2, 2, 2, 679, 57, 3, 2, 2, 2, 680, 683, 5, 64, 33, 2, 681, 683, 9, 6, 2, 2, 682, 680, 3, 2, 2, 2, 682, 681, 3, 2, 2, 2, 683, 59, 3, 2, 2, 2, 684, 685, 9, 7, 2, 2, 685, 61, 3, 2, 2, 2, 686, 687, 9, 8, 2, 2, 687, 63, 3, 2, 2, 2, 688, 693, 7, 67, 2, 2, 689, 690, 7, 41, 2, 2, 690, 692, 7, 67, 2, 2, 691, 689, 3, 2, 2, 2, 692, 695, 3, 2, 2, 2, 693, 691, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 65, 3, 2, 2, 2, 695, 693, 3, 2, 2, 2, 696, 701, 7, 67, 2, 2, 697, 698, 5, 64, 33, 2, 698, 699, 8, 34, 1, 2, 699, 701, 3, 2, 2, 2, 700, 696, 3, 2, 2, 2, 700, 697, 3, 2, 2, 2, 701, 67, 3, 2, 2, 2, 78, 71, 78, 87, 95, 120, 130, 133, 138, 153, 160, 164, 167, 176, 182, 187, 198, 206, 212, 216, 218, 229, 231, 246, 254, 269, 277, 279, 296, 299, 302, 325, 329, 340, 350, 358, 360, 370, 373, 384, 394, 396, 400, 409, 427, 431, 442, 446, 457, 461, 472, 476, 484, 494, 498, 508, 512, 522, 525, 528, 553, 592, 595, 613, 615, 617, 629, 641, 648, 652, 658, 665, 674, 678, 682, 693, 700] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 71, 726, 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, 3, 2, 6, 2, 72, 10, 2, 13, 2, 14, 2, 73, 3, 2, 3, 2, 3, 3, 7, 3, 79, 10, 3, 12, 3, 14, 3, 82, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 88, 10, 3, 12, 3, 14, 3, 91, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 96, 10, 4, 12, 4, 14, 4, 99, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 123, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 131, 10, 6, 12, 6, 14, 6, 134, 11, 6, 5, 6, 136, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 141, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 154, 10, 6, 12, 6, 14, 6, 157, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 163, 10, 6, 3, 6, 3, 6, 5, 6, 167, 10, 6, 3, 6, 5, 6, 170, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 183, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 188, 10, 7, 12, 7, 14, 7, 191, 11, 7, 5, 7, 193, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 200, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 206, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 211, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 222, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 230, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 236, 10, 11, 3, 11, 3, 11, 5, 11, 240, 10, 11, 5, 11, 242, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 253, 10, 12, 5, 12, 255, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 268, 10, 13, 12, 13, 14, 13, 271, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 278, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 291, 10, 13, 12, 13, 14, 13, 294, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 301, 10, 13, 5, 13, 303, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 318, 10, 18, 12, 18, 14, 18, 321, 11, 18, 5, 18, 323, 10, 18, 3, 18, 5, 18, 326, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 347, 10, 18, 12, 18, 14, 18, 350, 11, 18, 3, 18, 5, 18, 353, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 6, 18, 362, 10, 18, 13, 18, 14, 18, 363, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 374, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 382, 10, 18, 12, 18, 14, 18, 385, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 394, 10, 19, 3, 19, 5, 19, 397, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 406, 10, 20, 12, 20, 14, 20, 409, 11, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 418, 10, 20, 5, 20, 420, 10, 20, 3, 20, 3, 20, 5, 20, 424, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 433, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 449, 10, 22, 12, 22, 14, 22, 452, 11, 22, 3, 22, 5, 22, 455, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 464, 10, 22, 12, 22, 14, 22, 467, 11, 22, 3, 22, 5, 22, 470, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 479, 10, 22, 12, 22, 14, 22, 482, 11, 22, 3, 22, 5, 22, 485, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 494, 10, 22, 12, 22, 14, 22, 497, 11, 22, 3, 22, 5, 22, 500, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 508, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 516, 10, 22, 12, 22, 14, 22, 519, 11, 22, 3, 22, 5, 22, 522, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 530, 10, 22, 12, 22, 14, 22, 533, 11, 22, 3, 22, 5, 22, 536, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 544, 10, 22, 12, 22, 14, 22, 547, 11, 22, 5, 22, 549, 10, 22, 3, 22, 5, 22, 552, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 577, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 616, 10, 22, 3, 22, 5, 22, 619, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 6, 22, 635, 10, 22, 13, 22, 14, 22, 636, 7, 22, 639, 10, 22, 12, 22, 14, 22, 642, 11, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 653, 10, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 663, 10, 24, 12, 24, 14, 24, 666, 11, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 672, 10, 24, 3, 25, 3, 25, 5, 25, 676, 10, 25, 3, 26, 3, 26, 3, 27, 3, 27, 5, 27, 682, 10, 27, 3, 28, 3, 28, 3, 28, 7, 28, 687, 10, 28, 12, 28, 14, 28, 690, 11, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 698, 10, 29, 3, 30, 3, 30, 5, 30, 702, 10, 30, 3, 31, 3, 31, 5, 31, 706, 10, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 7, 34, 715, 10, 34, 12, 34, 14, 34, 718, 11, 34, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 724, 10, 35, 3, 35, 2, 2, 4, 34, 42, 36, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 2, 9, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 2, 824, 2, 71, 3, 2, 2, 2, 4, 80, 3, 2, 2, 2, 6, 97, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 124, 3, 2, 2, 2, 12, 192, 3, 2, 2, 2, 14, 194, 3, 2, 2, 2, 16, 201, 3, 2, 2, 2, 18, 221, 3, 2, 2, 2, 20, 241, 3, 2, 2, 2, 22, 254, 3, 2, 2, 2, 24, 302, 3, 2, 2, 2, 26, 304, 3, 2, 2, 2, 28, 306, 3, 2, 2, 2, 30, 308, 3, 2, 2, 2, 32, 310, 3, 2, 2, 2, 34, 373, 3, 2, 2, 2, 36, 386, 3, 2, 2, 2, 38, 423, 3, 2, 2, 2, 40, 425, 3, 2, 2, 2, 42, 576, 3, 2, 2, 2, 44, 652, 3, 2, 2, 2, 46, 671, 3, 2, 2, 2, 48, 675, 3, 2, 2, 2, 50, 677, 3, 2, 2, 2, 52, 681, 3, 2, 2, 2, 54, 683, 3, 2, 2, 2, 56, 697, 3, 2, 2, 2, 58, 701, 3, 2, 2, 2, 60, 705, 3, 2, 2, 2, 62, 707, 3, 2, 2, 2, 64, 709, 3, 2, 2, 2, 66, 711, 3, 2, 2, 2, 68, 723, 3, 2, 2, 2, 70, 72, 5, 4, 3, 2, 71, 70, 3, 2, 2, 2, 72, 73, 3, 2, 2, 2, 73, 71, 3, 2, 2, 2, 73, 74, 3, 2, 2, 2, 74, 75, 3, 2, 2, 2, 75, 76, 7, 2, 2, 3, 76, 3, 3, 2, 2, 2, 77, 79, 7, 68, 2, 2, 78, 77, 3, 2, 2, 2, 79, 82, 3, 2, 2, 2, 80, 78, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 83, 3, 2, 2, 2, 82, 80, 3, 2, 2, 2, 83, 84, 7, 3, 2, 2, 84, 85, 5, 66, 34, 2, 85, 89, 7, 4, 2, 2, 86, 88, 5, 6, 4, 2, 87, 86, 3, 2, 2, 2, 88, 91, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 92, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 92, 93, 7, 5, 2, 2, 93, 5, 3, 2, 2, 2, 94, 96, 7, 68, 2, 2, 95, 94, 3, 2, 2, 2, 96, 99, 3, 2, 2, 2, 97, 95, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 100, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 100, 101, 5, 8, 5, 2, 101, 7, 3, 2, 2, 2, 102, 103, 7, 6, 2, 2, 103, 104, 5, 66, 34, 2, 104, 105, 7, 7, 2, 2, 105, 106, 5, 34, 18, 2, 106, 123, 3, 2, 2, 2, 107, 108, 7, 8, 2, 2, 108, 109, 5, 66, 34, 2, 109, 110, 7, 7, 2, 2, 110, 111, 5, 34, 18, 2, 111, 123, 3, 2, 2, 2, 112, 113, 7, 9, 2, 2, 113, 114, 5, 48, 25, 2, 114, 115, 7, 64, 2, 2, 115, 116, 5, 42, 22, 2, 116, 123, 3, 2, 2, 2, 117, 123, 5, 24, 13, 2, 118, 123, 5, 10, 6, 2, 119, 123, 5, 12, 7, 2, 120, 123, 5, 20, 11, 2, 121, 123, 5, 22, 12, 2, 122, 102, 3, 2, 2, 2, 122, 107, 3, 2, 2, 2, 122, 112, 3, 2, 2, 2, 122, 117, 3, 2, 2, 2, 122, 118, 3, 2, 2, 2, 122, 119, 3, 2, 2, 2, 122, 120, 3, 2, 2, 2, 122, 121, 3, 2, 2, 2, 123, 9, 3, 2, 2, 2, 124, 125, 5, 18, 10, 2, 125, 162, 5, 58, 30, 2, 126, 135, 7, 65, 2, 2, 127, 132, 5, 50, 26, 2, 128, 129, 7, 10, 2, 2, 129, 131, 5, 50, 26, 2, 130, 128, 3, 2, 2, 2, 131, 134, 3, 2, 2, 2, 132, 130, 3, 2, 2, 2, 132, 133, 3, 2, 2, 2, 133, 136, 3, 2, 2, 2, 134, 132, 3, 2, 2, 2, 135, 127, 3, 2, 2, 2, 135, 136, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 140, 7, 66, 2, 2, 138, 139, 7, 7, 2, 2, 139, 141, 5, 34, 18, 2, 140, 138, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 163, 3, 2, 2, 2, 142, 143, 7, 7, 2, 2, 143, 163, 5, 34, 18, 2, 144, 145, 7, 65, 2, 2, 145, 146, 5, 50, 26, 2, 146, 147, 7, 7, 2, 2, 147, 155, 5, 34, 18, 2, 148, 149, 7, 10, 2, 2, 149, 150, 5, 50, 26, 2, 150, 151, 7, 7, 2, 2, 151, 152, 5, 34, 18, 2, 152, 154, 3, 2, 2, 2, 153, 148, 3, 2, 2, 2, 154, 157, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 155, 156, 3, 2, 2, 2, 156, 158, 3, 2, 2, 2, 157, 155, 3, 2, 2, 2, 158, 159, 7, 66, 2, 2, 159, 160, 7, 7, 2, 2, 160, 161, 5, 34, 18, 2, 161, 163, 3, 2, 2, 2, 162, 126, 3, 2, 2, 2, 162, 142, 3, 2, 2, 2, 162, 144, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 165, 7, 64, 2, 2, 165, 167, 5, 42, 22, 2, 166, 164, 3, 2, 2, 2, 166, 167, 3, 2, 2, 2, 167, 169, 3, 2, 2, 2, 168, 170, 7, 11, 2, 2, 169, 168, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 11, 3, 2, 2, 2, 171, 172, 7, 12, 2, 2, 172, 193, 5, 66, 34, 2, 173, 174, 7, 12, 2, 2, 174, 175, 5, 66, 34, 2, 175, 176, 7, 64, 2, 2, 176, 177, 5, 34, 18, 2, 177, 193, 3, 2, 2, 2, 178, 179, 7, 12, 2, 2, 179, 180, 5, 66, 34, 2, 180, 182, 7, 64, 2, 2, 181, 183, 7, 13, 2, 2, 182, 181, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 189, 5, 14, 8, 2, 185, 186, 7, 13, 2, 2, 186, 188, 5, 14, 8, 2, 187, 185, 3, 2, 2, 2, 188, 191, 3, 2, 2, 2, 189, 187, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 193, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 192, 171, 3, 2, 2, 2, 192, 173, 3, 2, 2, 2, 192, 178, 3, 2, 2, 2, 193, 13, 3, 2, 2, 2, 194, 199, 5, 68, 35, 2, 195, 196, 7, 65, 2, 2, 196, 197, 5, 34, 18, 2, 197, 198, 7, 66, 2, 2, 198, 200, 3, 2, 2, 2, 199, 195, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 15, 3, 2, 2, 2, 201, 202, 7, 14, 2, 2, 202, 205, 5, 66, 34, 2, 203, 204, 7, 7, 2, 2, 204, 206, 5, 34, 18, 2, 205, 203, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 208, 7, 64, 2, 2, 208, 210, 5, 42, 22, 2, 209, 211, 7, 11, 2, 2, 210, 209, 3, 2, 2, 2, 210, 211, 3, 2, 2, 2, 211, 17, 3, 2, 2, 2, 212, 222, 7, 15, 2, 2, 213, 222, 7, 16, 2, 2, 214, 215, 7, 17, 2, 2, 215, 222, 7, 15, 2, 2, 216, 217, 7, 17, 2, 2, 217, 222, 7, 16, 2, 2, 218, 222, 7, 18, 2, 2, 219, 222, 7, 19, 2, 2, 220, 222, 7, 20, 2, 2, 221, 212, 3, 2, 2, 2, 221, 213, 3, 2, 2, 2, 221, 214, 3, 2, 2, 2, 221, 216, 3, 2, 2, 2, 221, 218, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 221, 220, 3, 2, 2, 2, 222, 19, 3, 2, 2, 2, 223, 224, 7, 21, 2, 2, 224, 225, 5, 28, 15, 2, 225, 226, 7, 22, 2, 2, 226, 229, 5, 52, 27, 2, 227, 228, 7, 23, 2, 2, 228, 230, 5, 32, 17, 2, 229, 227, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 242, 3, 2, 2, 2, 231, 232, 7, 21, 2, 2, 232, 235, 5, 28, 15, 2, 233, 234, 7, 24, 2, 2, 234, 236, 5, 28, 15, 2, 235, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 239, 3, 2, 2, 2, 237, 238, 7, 23, 2, 2, 238, 240, 5, 32, 17, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 242, 3, 2, 2, 2, 241, 223, 3, 2, 2, 2, 241, 231, 3, 2, 2, 2, 242, 21, 3, 2, 2, 2, 243, 244, 7, 25, 2, 2, 244, 245, 5, 28, 15, 2, 245, 246, 7, 22, 2, 2, 246, 247, 5, 52, 27, 2, 247, 255, 3, 2, 2, 2, 248, 249, 7, 25, 2, 2, 249, 252, 5, 28, 15, 2, 250, 251, 7, 24, 2, 2, 251, 253, 5, 28, 15, 2, 252, 250, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 255, 3, 2, 2, 2, 254, 243, 3, 2, 2, 2, 254, 248, 3, 2, 2, 2, 255, 23, 3, 2, 2, 2, 256, 257, 7, 21, 2, 2, 257, 258, 5, 26, 14, 2, 258, 259, 7, 65, 2, 2, 259, 260, 5, 28, 15, 2, 260, 261, 7, 64, 2, 2, 261, 269, 5, 42, 22, 2, 262, 263, 7, 10, 2, 2, 263, 264, 5, 28, 15, 2, 264, 265, 7, 64, 2, 2, 265, 266, 5, 42, 22, 2, 266, 268, 3, 2, 2, 2, 267, 262, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 272, 3, 2, 2, 2, 271, 269, 3, 2, 2, 2, 272, 273, 7, 66, 2, 2, 273, 274, 7, 22, 2, 2, 274, 277, 7, 55, 2, 2, 275, 276, 7, 23, 2, 2, 276, 278, 5, 32, 17, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 303, 3, 2, 2, 2, 279, 280, 7, 21, 2, 2, 280, 281, 5, 26, 14, 2, 281, 282, 7, 65, 2, 2, 282, 283, 5, 28, 15, 2, 283, 284, 7, 64, 2, 2, 284, 292, 5, 42, 22, 2, 285, 286, 7, 10, 2, 2, 286, 287, 5, 28, 15, 2, 287, 288, 7, 64, 2, 2, 288, 289, 5, 42, 22, 2, 289, 291, 3, 2, 2, 2, 290, 285, 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, 7, 66, 2, 2, 296, 297, 7, 24, 2, 2, 297, 300, 5, 30, 16, 2, 298, 299, 7, 23, 2, 2, 299, 301, 5, 32, 17, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 303, 3, 2, 2, 2, 302, 256, 3, 2, 2, 2, 302, 279, 3, 2, 2, 2, 303, 25, 3, 2, 2, 2, 304, 305, 5, 66, 34, 2, 305, 27, 3, 2, 2, 2, 306, 307, 5, 66, 34, 2, 307, 29, 3, 2, 2, 2, 308, 309, 5, 66, 34, 2, 309, 31, 3, 2, 2, 2, 310, 311, 7, 42, 2, 2, 311, 33, 3, 2, 2, 2, 312, 313, 8, 18, 1, 2, 313, 322, 7, 65, 2, 2, 314, 319, 5, 34, 18, 2, 315, 316, 7, 10, 2, 2, 316, 318, 5, 34, 18, 2, 317, 315, 3, 2, 2, 2, 318, 321, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 323, 3, 2, 2, 2, 321, 319, 3, 2, 2, 2, 322, 314, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 325, 3, 2, 2, 2, 324, 326, 7, 10, 2, 2, 325, 324, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 328, 7, 66, 2, 2, 328, 329, 7, 27, 2, 2, 329, 374, 5, 34, 18, 13, 330, 331, 7, 49, 2, 2, 331, 332, 7, 28, 2, 2, 332, 333, 5, 34, 18, 2, 333, 334, 7, 29, 2, 2, 334, 374, 3, 2, 2, 2, 335, 336, 7, 50, 2, 2, 336, 337, 7, 28, 2, 2, 337, 338, 5, 34, 18, 2, 338, 339, 7, 29, 2, 2, 339, 374, 3, 2, 2, 2, 340, 341, 7, 65, 2, 2, 341, 342, 5, 34, 18, 2, 342, 343, 7, 10, 2, 2, 343, 348, 5, 34, 18, 2, 344, 345, 7, 10, 2, 2, 345, 347, 5, 34, 18, 2, 346, 344, 3, 2, 2, 2, 347, 350, 3, 2, 2, 2, 348, 346, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 352, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 351, 353, 7, 10, 2, 2, 352, 351, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 355, 7, 66, 2, 2, 355, 374, 3, 2, 2, 2, 356, 357, 7, 4, 2, 2, 357, 358, 5, 38, 20, 2, 358, 359, 7, 5, 2, 2, 359, 374, 3, 2, 2, 2, 360, 362, 5, 36, 19, 2, 361, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 374, 3, 2, 2, 2, 365, 374, 7, 30, 2, 2, 366, 374, 7, 31, 2, 2, 367, 374, 7, 32, 2, 2, 368, 374, 5, 66, 34, 2, 369, 370, 7, 65, 2, 2, 370, 371, 5, 34, 18, 2, 371, 372, 7, 66, 2, 2, 372, 374, 3, 2, 2, 2, 373, 312, 3, 2, 2, 2, 373, 330, 3, 2, 2, 2, 373, 335, 3, 2, 2, 2, 373, 340, 3, 2, 2, 2, 373, 356, 3, 2, 2, 2, 373, 361, 3, 2, 2, 2, 373, 365, 3, 2, 2, 2, 373, 366, 3, 2, 2, 2, 373, 367, 3, 2, 2, 2, 373, 368, 3, 2, 2, 2, 373, 369, 3, 2, 2, 2, 374, 383, 3, 2, 2, 2, 375, 376, 12, 15, 2, 2, 376, 377, 7, 26, 2, 2, 377, 382, 5, 34, 18, 15, 378, 379, 12, 14, 2, 2, 379, 380, 7, 27, 2, 2, 380, 382, 5, 34, 18, 14, 381, 375, 3, 2, 2, 2, 381, 378, 3, 2, 2, 2, 382, 385, 3, 2, 2, 2, 383, 381, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 35, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 386, 387, 7, 13, 2, 2, 387, 388, 7, 4, 2, 2, 388, 389, 5, 66, 34, 2, 389, 390, 7, 7, 2, 2, 390, 393, 7, 42, 2, 2, 391, 392, 7, 10, 2, 2, 392, 394, 5, 38, 20, 2, 393, 391, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 396, 3, 2, 2, 2, 395, 397, 7, 10, 2, 2, 396, 395, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 399, 7, 5, 2, 2, 399, 37, 3, 2, 2, 2, 400, 401, 5, 40, 21, 2, 401, 402, 7, 7, 2, 2, 402, 403, 5, 34, 18, 2, 403, 404, 7, 10, 2, 2, 404, 406, 3, 2, 2, 2, 405, 400, 3, 2, 2, 2, 406, 409, 3, 2, 2, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 419, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 410, 411, 5, 40, 21, 2, 411, 412, 7, 7, 2, 2, 412, 413, 5, 34, 18, 2, 413, 417, 3, 2, 2, 2, 414, 418, 7, 10, 2, 2, 415, 416, 7, 13, 2, 2, 416, 418, 7, 67, 2, 2, 417, 414, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 420, 3, 2, 2, 2, 419, 410, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 424, 3, 2, 2, 2, 421, 422, 7, 13, 2, 2, 422, 424, 7, 67, 2, 2, 423, 407, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 424, 39, 3, 2, 2, 2, 425, 426, 5, 68, 35, 2, 426, 41, 3, 2, 2, 2, 427, 428, 8, 22, 1, 2, 428, 577, 5, 46, 24, 2, 429, 430, 5, 58, 30, 2, 430, 432, 7, 65, 2, 2, 431, 433, 5, 54, 28, 2, 432, 431, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 435, 7, 66, 2, 2, 435, 577, 3, 2, 2, 2, 436, 437, 7, 54, 2, 2, 437, 577, 5, 42, 22, 27, 438, 439, 5, 66, 34, 2, 439, 440, 7, 34, 2, 2, 440, 441, 7, 64, 2, 2, 441, 442, 5, 42, 22, 23, 442, 577, 3, 2, 2, 2, 443, 444, 7, 45, 2, 2, 444, 445, 7, 4, 2, 2, 445, 450, 5, 42, 22, 2, 446, 447, 7, 10, 2, 2, 447, 449, 5, 42, 22, 2, 448, 446, 3, 2, 2, 2, 449, 452, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 454, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 453, 455, 7, 10, 2, 2, 454, 453, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 457, 7, 5, 2, 2, 457, 577, 3, 2, 2, 2, 458, 459, 7, 46, 2, 2, 459, 460, 7, 4, 2, 2, 460, 465, 5, 42, 22, 2, 461, 462, 7, 10, 2, 2, 462, 464, 5, 42, 22, 2, 463, 461, 3, 2, 2, 2, 464, 467, 3, 2, 2, 2, 465, 463, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 469, 3, 2, 2, 2, 467, 465, 3, 2, 2, 2, 468, 470, 7, 10, 2, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 5, 2, 2, 472, 577, 3, 2, 2, 2, 473, 474, 7, 35, 2, 2, 474, 475, 7, 4, 2, 2, 475, 480, 5, 42, 22, 2, 476, 477, 7, 10, 2, 2, 477, 479, 5, 42, 22, 2, 478, 476, 3, 2, 2, 2, 479, 482, 3, 2, 2, 2, 480, 478, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 483, 485, 7, 10, 2, 2, 484, 483, 3, 2, 2, 2, 484, 485, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 7, 5, 2, 2, 487, 577, 3, 2, 2, 2, 488, 489, 7, 36, 2, 2, 489, 490, 7, 4, 2, 2, 490, 495, 5, 42, 22, 2, 491, 492, 7, 10, 2, 2, 492, 494, 5, 42, 22, 2, 493, 491, 3, 2, 2, 2, 494, 497, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 498, 500, 7, 10, 2, 2, 499, 498, 3, 2, 2, 2, 499, 500, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 7, 5, 2, 2, 502, 577, 3, 2, 2, 2, 503, 508, 5, 66, 34, 2, 504, 508, 7, 44, 2, 2, 505, 508, 7, 43, 2, 2, 506, 508, 7, 42, 2, 2, 507, 503, 3, 2, 2, 2, 507, 504, 3, 2, 2, 2, 507, 505, 3, 2, 2, 2, 507, 506, 3, 2, 2, 2, 508, 577, 3, 2, 2, 2, 509, 510, 7, 65, 2, 2, 510, 511, 5, 42, 22, 2, 511, 512, 7, 10, 2, 2, 512, 517, 5, 42, 22, 2, 513, 514, 7, 10, 2, 2, 514, 516, 5, 42, 22, 2, 515, 513, 3, 2, 2, 2, 516, 519, 3, 2, 2, 2, 517, 515, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 521, 3, 2, 2, 2, 519, 517, 3, 2, 2, 2, 520, 522, 7, 10, 2, 2, 521, 520, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 7, 66, 2, 2, 524, 577, 3, 2, 2, 2, 525, 526, 7, 4, 2, 2, 526, 531, 5, 56, 29, 2, 527, 528, 7, 10, 2, 2, 528, 530, 5, 56, 29, 2, 529, 527, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 535, 3, 2, 2, 2, 533, 531, 3, 2, 2, 2, 534, 536, 7, 10, 2, 2, 535, 534, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 7, 5, 2, 2, 538, 577, 3, 2, 2, 2, 539, 548, 7, 28, 2, 2, 540, 545, 5, 42, 22, 2, 541, 542, 7, 10, 2, 2, 542, 544, 5, 42, 22, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 549, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 540, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 551, 3, 2, 2, 2, 550, 552, 7, 10, 2, 2, 551, 550, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 577, 7, 29, 2, 2, 554, 555, 7, 37, 2, 2, 555, 556, 7, 65, 2, 2, 556, 557, 5, 42, 22, 2, 557, 558, 7, 66, 2, 2, 558, 559, 5, 42, 22, 2, 559, 560, 7, 38, 2, 2, 560, 561, 5, 42, 22, 7, 561, 577, 3, 2, 2, 2, 562, 563, 5, 10, 6, 2, 563, 564, 5, 42, 22, 6, 564, 577, 3, 2, 2, 2, 565, 566, 5, 16, 9, 2, 566, 567, 5, 42, 22, 5, 567, 577, 3, 2, 2, 2, 568, 569, 7, 65, 2, 2, 569, 570, 5, 42, 22, 2, 570, 571, 7, 66, 2, 2, 571, 577, 3, 2, 2, 2, 572, 573, 7, 4, 2, 2, 573, 574, 5, 42, 22, 2, 574, 575, 7, 5, 2, 2, 575, 577, 3, 2, 2, 2, 576, 427, 3, 2, 2, 2, 576, 429, 3, 2, 2, 2, 576, 436, 3, 2, 2, 2, 576, 438, 3, 2, 2, 2, 576, 443, 3, 2, 2, 2, 576, 458, 3, 2, 2, 2, 576, 473, 3, 2, 2, 2, 576, 488, 3, 2, 2, 2, 576, 507, 3, 2, 2, 2, 576, 509, 3, 2, 2, 2, 576, 525, 3, 2, 2, 2, 576, 539, 3, 2, 2, 2, 576, 554, 3, 2, 2, 2, 576, 562, 3, 2, 2, 2, 576, 565, 3, 2, 2, 2, 576, 568, 3, 2, 2, 2, 576, 572, 3, 2, 2, 2, 577, 640, 3, 2, 2, 2, 578, 579, 12, 28, 2, 2, 579, 580, 7, 33, 2, 2, 580, 639, 5, 42, 22, 28, 581, 582, 12, 26, 2, 2, 582, 583, 9, 2, 2, 2, 583, 639, 5, 42, 22, 27, 584, 585, 12, 25, 2, 2, 585, 586, 9, 3, 2, 2, 586, 639, 5, 42, 22, 26, 587, 588, 12, 24, 2, 2, 588, 589, 9, 4, 2, 2, 589, 639, 5, 42, 22, 25, 590, 591, 12, 22, 2, 2, 591, 592, 7, 64, 2, 2, 592, 593, 5, 42, 22, 23, 593, 594, 8, 22, 1, 2, 594, 639, 3, 2, 2, 2, 595, 596, 12, 20, 2, 2, 596, 597, 7, 45, 2, 2, 597, 639, 5, 42, 22, 21, 598, 599, 12, 18, 2, 2, 599, 600, 7, 46, 2, 2, 600, 639, 5, 42, 22, 19, 601, 602, 12, 17, 2, 2, 602, 603, 7, 47, 2, 2, 603, 639, 5, 42, 22, 18, 604, 605, 12, 16, 2, 2, 605, 606, 7, 48, 2, 2, 606, 639, 5, 42, 22, 17, 607, 608, 12, 10, 2, 2, 608, 609, 7, 26, 2, 2, 609, 639, 5, 42, 22, 11, 610, 611, 12, 32, 2, 2, 611, 612, 7, 22, 2, 2, 612, 618, 5, 60, 31, 2, 613, 615, 7, 65, 2, 2, 614, 616, 5, 54, 28, 2, 615, 614, 3, 2, 2, 2, 615, 616, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 619, 7, 66, 2, 2, 618, 613, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 639, 3, 2, 2, 2, 620, 621, 12, 29, 2, 2, 621, 622, 7, 28, 2, 2, 622, 623, 5, 42, 22, 2, 623, 624, 7, 29, 2, 2, 624, 639, 3, 2, 2, 2, 625, 626, 12, 15, 2, 2, 626, 634, 7, 52, 2, 2, 627, 628, 7, 13, 2, 2, 628, 629, 7, 42, 2, 2, 629, 630, 7, 7, 2, 2, 630, 631, 5, 50, 26, 2, 631, 632, 7, 27, 2, 2, 632, 633, 5, 42, 22, 2, 633, 635, 3, 2, 2, 2, 634, 627, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 634, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 639, 3, 2, 2, 2, 638, 578, 3, 2, 2, 2, 638, 581, 3, 2, 2, 2, 638, 584, 3, 2, 2, 2, 638, 587, 3, 2, 2, 2, 638, 590, 3, 2, 2, 2, 638, 595, 3, 2, 2, 2, 638, 598, 3, 2, 2, 2, 638, 601, 3, 2, 2, 2, 638, 604, 3, 2, 2, 2, 638, 607, 3, 2, 2, 2, 638, 610, 3, 2, 2, 2, 638, 620, 3, 2, 2, 2, 638, 625, 3, 2, 2, 2, 639, 642, 3, 2, 2, 2, 640, 638, 3, 2, 2, 2, 640, 641, 3, 2, 2, 2, 641, 43, 3, 2, 2, 2, 642, 640, 3, 2, 2, 2, 643, 644, 5, 8, 5, 2, 644, 645, 7, 2, 2, 3, 645, 653, 3, 2, 2, 2, 646, 647, 5, 42, 22, 2, 647, 648, 7, 2, 2, 3, 648, 653, 3, 2, 2, 2, 649, 650, 7, 68, 2, 2, 650, 653, 7, 2, 2, 3, 651, 653, 7, 2, 2, 3, 652, 643, 3, 2, 2, 2, 652, 646, 3, 2, 2, 2, 652, 649, 3, 2, 2, 2, 652, 651, 3, 2, 2, 2, 653, 45, 3, 2, 2, 2, 654, 655, 5, 50, 26, 2, 655, 656, 7, 27, 2, 2, 656, 657, 5, 42, 22, 2, 657, 672, 3, 2, 2, 2, 658, 659, 7, 65, 2, 2, 659, 664, 5, 50, 26, 2, 660, 661, 7, 10, 2, 2, 661, 663, 5, 50, 26, 2, 662, 660, 3, 2, 2, 2, 663, 666, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 664, 665, 3, 2, 2, 2, 665, 667, 3, 2, 2, 2, 666, 664, 3, 2, 2, 2, 667, 668, 7, 66, 2, 2, 668, 669, 7, 27, 2, 2, 669, 670, 5, 42, 22, 2, 670, 672, 3, 2, 2, 2, 671, 654, 3, 2, 2, 2, 671, 658, 3, 2, 2, 2, 672, 47, 3, 2, 2, 2, 673, 676, 7, 39, 2, 2, 674, 676, 5, 66, 34, 2, 675, 673, 3, 2, 2, 2, 675, 674, 3, 2, 2, 2, 676, 49, 3, 2, 2, 2, 677, 678, 5, 48, 25, 2, 678, 51, 3, 2, 2, 2, 679, 682, 7, 55, 2, 2, 680, 682, 5, 66, 34, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 53, 3, 2, 2, 2, 683, 688, 5, 42, 22, 2, 684, 685, 7, 10, 2, 2, 685, 687, 5, 42, 22, 2, 686, 684, 3, 2, 2, 2, 687, 690, 3, 2, 2, 2, 688, 686, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 55, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 691, 692, 5, 68, 35, 2, 692, 693, 7, 7, 2, 2, 693, 694, 5, 42, 22, 2, 694, 698, 3, 2, 2, 2, 695, 696, 7, 40, 2, 2, 696, 698, 5, 42, 22, 2, 697, 691, 3, 2, 2, 2, 697, 695, 3, 2, 2, 2, 698, 57, 3, 2, 2, 2, 699, 702, 5, 66, 34, 2, 700, 702, 9, 5, 2, 2, 701, 699, 3, 2, 2, 2, 701, 700, 3, 2, 2, 2, 702, 59, 3, 2, 2, 2, 703, 706, 5, 66, 34, 2, 704, 706, 9, 6, 2, 2, 705, 703, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 61, 3, 2, 2, 2, 707, 708, 9, 7, 2, 2, 708, 63, 3, 2, 2, 2, 709, 710, 9, 8, 2, 2, 710, 65, 3, 2, 2, 2, 711, 716, 7, 67, 2, 2, 712, 713, 7, 41, 2, 2, 713, 715, 7, 67, 2, 2, 714, 712, 3, 2, 2, 2, 715, 718, 3, 2, 2, 2, 716, 714, 3, 2, 2, 2, 716, 717, 3, 2, 2, 2, 717, 67, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 719, 724, 7, 67, 2, 2, 720, 721, 5, 66, 34, 2, 721, 722, 8, 35, 1, 2, 722, 724, 3, 2, 2, 2, 723, 719, 3, 2, 2, 2, 723, 720, 3, 2, 2, 2, 724, 69, 3, 2, 2, 2, 81, 73, 80, 89, 97, 122, 132, 135, 140, 155, 162, 166, 169, 182, 189, 192, 199, 205, 210, 221, 229, 235, 239, 241, 252, 254, 269, 277, 292, 300, 302, 319, 322, 325, 348, 352, 363, 373, 381, 383, 393, 396, 407, 417, 419, 423, 432, 450, 454, 465, 469, 480, 484, 495, 499, 507, 517, 521, 531, 535, 545, 548, 551, 576, 615, 618, 636, 638, 640, 652, 664, 671, 675, 681, 688, 697, 701, 705, 716, 723] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index 0ad936827..427758cd2 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -77,26 +77,26 @@ WS=69 ','=8 ';'=9 'type'=10 -'nondet'=11 -'val'=12 -'def'=13 -'pure'=14 -'action'=15 -'run'=16 -'temporal'=17 -'import'=18 -'.'=19 -'from'=20 -'as'=21 -'export'=22 -'->'=23 -'=>'=24 -'['=25 -']'=26 -'int'=27 -'str'=28 -'bool'=29 -'|'=30 +'|'=11 +'nondet'=12 +'val'=13 +'def'=14 +'pure'=15 +'action'=16 +'run'=17 +'temporal'=18 +'import'=19 +'.'=20 +'from'=21 +'as'=22 +'export'=23 +'->'=24 +'=>'=25 +'['=26 +']'=27 +'int'=28 +'str'=29 +'bool'=30 '^'=31 '\''=32 'all'=33 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index f2c2aeed7..700db184e 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -10,6 +10,7 @@ null ',' ';' 'type' +'|' 'nondet' 'val' 'def' @@ -29,7 +30,6 @@ null 'int' 'str' 'bool' -'|' '^' '\'' 'all' @@ -221,4 +221,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 71, 473, 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, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 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, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 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, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 301, 10, 41, 12, 41, 14, 41, 304, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 317, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 324, 10, 43, 12, 43, 14, 43, 327, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 336, 10, 43, 12, 43, 14, 43, 339, 11, 43, 5, 43, 341, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 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, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 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, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 415, 10, 66, 12, 66, 14, 66, 418, 11, 66, 3, 66, 3, 66, 6, 66, 422, 10, 66, 13, 66, 14, 66, 423, 5, 66, 426, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 7, 67, 433, 10, 67, 12, 67, 14, 67, 436, 11, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 444, 10, 68, 12, 68, 14, 68, 447, 11, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 457, 10, 69, 12, 69, 14, 69, 460, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 6, 70, 468, 10, 70, 13, 70, 14, 70, 469, 3, 70, 3, 70, 6, 302, 434, 445, 458, 2, 2, 71, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 3, 2, 9, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 67, 92, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 5, 2, 11, 12, 15, 15, 34, 34, 2, 487, 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, 3, 141, 3, 2, 2, 2, 5, 148, 3, 2, 2, 2, 7, 150, 3, 2, 2, 2, 9, 152, 3, 2, 2, 2, 11, 158, 3, 2, 2, 2, 13, 160, 3, 2, 2, 2, 15, 164, 3, 2, 2, 2, 17, 171, 3, 2, 2, 2, 19, 173, 3, 2, 2, 2, 21, 175, 3, 2, 2, 2, 23, 180, 3, 2, 2, 2, 25, 187, 3, 2, 2, 2, 27, 191, 3, 2, 2, 2, 29, 195, 3, 2, 2, 2, 31, 200, 3, 2, 2, 2, 33, 207, 3, 2, 2, 2, 35, 211, 3, 2, 2, 2, 37, 220, 3, 2, 2, 2, 39, 227, 3, 2, 2, 2, 41, 229, 3, 2, 2, 2, 43, 234, 3, 2, 2, 2, 45, 237, 3, 2, 2, 2, 47, 244, 3, 2, 2, 2, 49, 247, 3, 2, 2, 2, 51, 250, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 254, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 267, 3, 2, 2, 2, 63, 269, 3, 2, 2, 2, 65, 271, 3, 2, 2, 2, 67, 273, 3, 2, 2, 2, 69, 277, 3, 2, 2, 2, 71, 281, 3, 2, 2, 2, 73, 284, 3, 2, 2, 2, 75, 289, 3, 2, 2, 2, 77, 291, 3, 2, 2, 2, 79, 295, 3, 2, 2, 2, 81, 298, 3, 2, 2, 2, 83, 316, 3, 2, 2, 2, 85, 340, 3, 2, 2, 2, 87, 342, 3, 2, 2, 2, 89, 346, 3, 2, 2, 2, 91, 349, 3, 2, 2, 2, 93, 353, 3, 2, 2, 2, 95, 361, 3, 2, 2, 2, 97, 365, 3, 2, 2, 2, 99, 370, 3, 2, 2, 2, 101, 374, 3, 2, 2, 2, 103, 380, 3, 2, 2, 2, 105, 382, 3, 2, 2, 2, 107, 384, 3, 2, 2, 2, 109, 386, 3, 2, 2, 2, 111, 388, 3, 2, 2, 2, 113, 390, 3, 2, 2, 2, 115, 392, 3, 2, 2, 2, 117, 394, 3, 2, 2, 2, 119, 397, 3, 2, 2, 2, 121, 400, 3, 2, 2, 2, 123, 403, 3, 2, 2, 2, 125, 406, 3, 2, 2, 2, 127, 408, 3, 2, 2, 2, 129, 410, 3, 2, 2, 2, 131, 425, 3, 2, 2, 2, 133, 427, 3, 2, 2, 2, 135, 439, 3, 2, 2, 2, 137, 452, 3, 2, 2, 2, 139, 467, 3, 2, 2, 2, 141, 142, 7, 111, 2, 2, 142, 143, 7, 113, 2, 2, 143, 144, 7, 102, 2, 2, 144, 145, 7, 119, 2, 2, 145, 146, 7, 110, 2, 2, 146, 147, 7, 103, 2, 2, 147, 4, 3, 2, 2, 2, 148, 149, 7, 125, 2, 2, 149, 6, 3, 2, 2, 2, 150, 151, 7, 127, 2, 2, 151, 8, 3, 2, 2, 2, 152, 153, 7, 101, 2, 2, 153, 154, 7, 113, 2, 2, 154, 155, 7, 112, 2, 2, 155, 156, 7, 117, 2, 2, 156, 157, 7, 118, 2, 2, 157, 10, 3, 2, 2, 2, 158, 159, 7, 60, 2, 2, 159, 12, 3, 2, 2, 2, 160, 161, 7, 120, 2, 2, 161, 162, 7, 99, 2, 2, 162, 163, 7, 116, 2, 2, 163, 14, 3, 2, 2, 2, 164, 165, 7, 99, 2, 2, 165, 166, 7, 117, 2, 2, 166, 167, 7, 117, 2, 2, 167, 168, 7, 119, 2, 2, 168, 169, 7, 111, 2, 2, 169, 170, 7, 103, 2, 2, 170, 16, 3, 2, 2, 2, 171, 172, 7, 46, 2, 2, 172, 18, 3, 2, 2, 2, 173, 174, 7, 61, 2, 2, 174, 20, 3, 2, 2, 2, 175, 176, 7, 118, 2, 2, 176, 177, 7, 123, 2, 2, 177, 178, 7, 114, 2, 2, 178, 179, 7, 103, 2, 2, 179, 22, 3, 2, 2, 2, 180, 181, 7, 112, 2, 2, 181, 182, 7, 113, 2, 2, 182, 183, 7, 112, 2, 2, 183, 184, 7, 102, 2, 2, 184, 185, 7, 103, 2, 2, 185, 186, 7, 118, 2, 2, 186, 24, 3, 2, 2, 2, 187, 188, 7, 120, 2, 2, 188, 189, 7, 99, 2, 2, 189, 190, 7, 110, 2, 2, 190, 26, 3, 2, 2, 2, 191, 192, 7, 102, 2, 2, 192, 193, 7, 103, 2, 2, 193, 194, 7, 104, 2, 2, 194, 28, 3, 2, 2, 2, 195, 196, 7, 114, 2, 2, 196, 197, 7, 119, 2, 2, 197, 198, 7, 116, 2, 2, 198, 199, 7, 103, 2, 2, 199, 30, 3, 2, 2, 2, 200, 201, 7, 99, 2, 2, 201, 202, 7, 101, 2, 2, 202, 203, 7, 118, 2, 2, 203, 204, 7, 107, 2, 2, 204, 205, 7, 113, 2, 2, 205, 206, 7, 112, 2, 2, 206, 32, 3, 2, 2, 2, 207, 208, 7, 116, 2, 2, 208, 209, 7, 119, 2, 2, 209, 210, 7, 112, 2, 2, 210, 34, 3, 2, 2, 2, 211, 212, 7, 118, 2, 2, 212, 213, 7, 103, 2, 2, 213, 214, 7, 111, 2, 2, 214, 215, 7, 114, 2, 2, 215, 216, 7, 113, 2, 2, 216, 217, 7, 116, 2, 2, 217, 218, 7, 99, 2, 2, 218, 219, 7, 110, 2, 2, 219, 36, 3, 2, 2, 2, 220, 221, 7, 107, 2, 2, 221, 222, 7, 111, 2, 2, 222, 223, 7, 114, 2, 2, 223, 224, 7, 113, 2, 2, 224, 225, 7, 116, 2, 2, 225, 226, 7, 118, 2, 2, 226, 38, 3, 2, 2, 2, 227, 228, 7, 48, 2, 2, 228, 40, 3, 2, 2, 2, 229, 230, 7, 104, 2, 2, 230, 231, 7, 116, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 111, 2, 2, 233, 42, 3, 2, 2, 2, 234, 235, 7, 99, 2, 2, 235, 236, 7, 117, 2, 2, 236, 44, 3, 2, 2, 2, 237, 238, 7, 103, 2, 2, 238, 239, 7, 122, 2, 2, 239, 240, 7, 114, 2, 2, 240, 241, 7, 113, 2, 2, 241, 242, 7, 116, 2, 2, 242, 243, 7, 118, 2, 2, 243, 46, 3, 2, 2, 2, 244, 245, 7, 47, 2, 2, 245, 246, 7, 64, 2, 2, 246, 48, 3, 2, 2, 2, 247, 248, 7, 63, 2, 2, 248, 249, 7, 64, 2, 2, 249, 50, 3, 2, 2, 2, 250, 251, 7, 93, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 95, 2, 2, 253, 54, 3, 2, 2, 2, 254, 255, 7, 107, 2, 2, 255, 256, 7, 112, 2, 2, 256, 257, 7, 118, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 117, 2, 2, 259, 260, 7, 118, 2, 2, 260, 261, 7, 116, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 100, 2, 2, 263, 264, 7, 113, 2, 2, 264, 265, 7, 113, 2, 2, 265, 266, 7, 110, 2, 2, 266, 60, 3, 2, 2, 2, 267, 268, 7, 126, 2, 2, 268, 62, 3, 2, 2, 2, 269, 270, 7, 96, 2, 2, 270, 64, 3, 2, 2, 2, 271, 272, 7, 41, 2, 2, 272, 66, 3, 2, 2, 2, 273, 274, 7, 99, 2, 2, 274, 275, 7, 110, 2, 2, 275, 276, 7, 110, 2, 2, 276, 68, 3, 2, 2, 2, 277, 278, 7, 99, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 123, 2, 2, 280, 70, 3, 2, 2, 2, 281, 282, 7, 107, 2, 2, 282, 283, 7, 104, 2, 2, 283, 72, 3, 2, 2, 2, 284, 285, 7, 103, 2, 2, 285, 286, 7, 110, 2, 2, 286, 287, 7, 117, 2, 2, 287, 288, 7, 103, 2, 2, 288, 74, 3, 2, 2, 2, 289, 290, 7, 97, 2, 2, 290, 76, 3, 2, 2, 2, 291, 292, 7, 48, 2, 2, 292, 293, 7, 48, 2, 2, 293, 294, 7, 48, 2, 2, 294, 78, 3, 2, 2, 2, 295, 296, 7, 60, 2, 2, 296, 297, 7, 60, 2, 2, 297, 80, 3, 2, 2, 2, 298, 302, 7, 36, 2, 2, 299, 301, 11, 2, 2, 2, 300, 299, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 36, 2, 2, 306, 82, 3, 2, 2, 2, 307, 308, 7, 104, 2, 2, 308, 309, 7, 99, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 117, 2, 2, 311, 317, 7, 103, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 116, 2, 2, 314, 315, 7, 119, 2, 2, 315, 317, 7, 103, 2, 2, 316, 307, 3, 2, 2, 2, 316, 312, 3, 2, 2, 2, 317, 84, 3, 2, 2, 2, 318, 341, 7, 50, 2, 2, 319, 325, 9, 2, 2, 2, 320, 324, 9, 3, 2, 2, 321, 322, 7, 97, 2, 2, 322, 324, 9, 3, 2, 2, 323, 320, 3, 2, 2, 2, 323, 321, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 341, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 328, 329, 7, 50, 2, 2, 329, 330, 7, 122, 2, 2, 330, 331, 3, 2, 2, 2, 331, 337, 9, 4, 2, 2, 332, 336, 9, 4, 2, 2, 333, 334, 7, 97, 2, 2, 334, 336, 9, 4, 2, 2, 335, 332, 3, 2, 2, 2, 335, 333, 3, 2, 2, 2, 336, 339, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 340, 318, 3, 2, 2, 2, 340, 319, 3, 2, 2, 2, 340, 328, 3, 2, 2, 2, 341, 86, 3, 2, 2, 2, 342, 343, 7, 99, 2, 2, 343, 344, 7, 112, 2, 2, 344, 345, 7, 102, 2, 2, 345, 88, 3, 2, 2, 2, 346, 347, 7, 113, 2, 2, 347, 348, 7, 116, 2, 2, 348, 90, 3, 2, 2, 2, 349, 350, 7, 107, 2, 2, 350, 351, 7, 104, 2, 2, 351, 352, 7, 104, 2, 2, 352, 92, 3, 2, 2, 2, 353, 354, 7, 107, 2, 2, 354, 355, 7, 111, 2, 2, 355, 356, 7, 114, 2, 2, 356, 357, 7, 110, 2, 2, 357, 358, 7, 107, 2, 2, 358, 359, 7, 103, 2, 2, 359, 360, 7, 117, 2, 2, 360, 94, 3, 2, 2, 2, 361, 362, 7, 85, 2, 2, 362, 363, 7, 103, 2, 2, 363, 364, 7, 118, 2, 2, 364, 96, 3, 2, 2, 2, 365, 366, 7, 78, 2, 2, 366, 367, 7, 107, 2, 2, 367, 368, 7, 117, 2, 2, 368, 369, 7, 118, 2, 2, 369, 98, 3, 2, 2, 2, 370, 371, 7, 79, 2, 2, 371, 372, 7, 99, 2, 2, 372, 373, 7, 114, 2, 2, 373, 100, 3, 2, 2, 2, 374, 375, 7, 111, 2, 2, 375, 376, 7, 99, 2, 2, 376, 377, 7, 118, 2, 2, 377, 378, 7, 101, 2, 2, 378, 379, 7, 106, 2, 2, 379, 102, 3, 2, 2, 2, 380, 381, 7, 45, 2, 2, 381, 104, 3, 2, 2, 2, 382, 383, 7, 47, 2, 2, 383, 106, 3, 2, 2, 2, 384, 385, 7, 44, 2, 2, 385, 108, 3, 2, 2, 2, 386, 387, 7, 49, 2, 2, 387, 110, 3, 2, 2, 2, 388, 389, 7, 39, 2, 2, 389, 112, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 114, 3, 2, 2, 2, 392, 393, 7, 62, 2, 2, 393, 116, 3, 2, 2, 2, 394, 395, 7, 64, 2, 2, 395, 396, 7, 63, 2, 2, 396, 118, 3, 2, 2, 2, 397, 398, 7, 62, 2, 2, 398, 399, 7, 63, 2, 2, 399, 120, 3, 2, 2, 2, 400, 401, 7, 35, 2, 2, 401, 402, 7, 63, 2, 2, 402, 122, 3, 2, 2, 2, 403, 404, 7, 63, 2, 2, 404, 405, 7, 63, 2, 2, 405, 124, 3, 2, 2, 2, 406, 407, 7, 63, 2, 2, 407, 126, 3, 2, 2, 2, 408, 409, 7, 42, 2, 2, 409, 128, 3, 2, 2, 2, 410, 411, 7, 43, 2, 2, 411, 130, 3, 2, 2, 2, 412, 416, 9, 5, 2, 2, 413, 415, 9, 6, 2, 2, 414, 413, 3, 2, 2, 2, 415, 418, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 426, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 419, 421, 9, 7, 2, 2, 420, 422, 9, 6, 2, 2, 421, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 426, 3, 2, 2, 2, 425, 412, 3, 2, 2, 2, 425, 419, 3, 2, 2, 2, 426, 132, 3, 2, 2, 2, 427, 428, 7, 49, 2, 2, 428, 429, 7, 49, 2, 2, 429, 430, 7, 49, 2, 2, 430, 434, 3, 2, 2, 2, 431, 433, 11, 2, 2, 2, 432, 431, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 437, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 438, 7, 12, 2, 2, 438, 134, 3, 2, 2, 2, 439, 440, 7, 49, 2, 2, 440, 441, 7, 49, 2, 2, 441, 445, 3, 2, 2, 2, 442, 444, 11, 2, 2, 2, 443, 442, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 446, 448, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 449, 7, 12, 2, 2, 449, 450, 3, 2, 2, 2, 450, 451, 8, 68, 2, 2, 451, 136, 3, 2, 2, 2, 452, 453, 7, 49, 2, 2, 453, 454, 7, 44, 2, 2, 454, 458, 3, 2, 2, 2, 455, 457, 11, 2, 2, 2, 456, 455, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 461, 3, 2, 2, 2, 460, 458, 3, 2, 2, 2, 461, 462, 7, 44, 2, 2, 462, 463, 7, 49, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 8, 69, 2, 2, 465, 138, 3, 2, 2, 2, 466, 468, 9, 8, 2, 2, 467, 466, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 467, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 8, 70, 2, 2, 472, 140, 3, 2, 2, 2, 17, 2, 302, 316, 323, 325, 335, 337, 340, 416, 423, 425, 434, 445, 458, 469, 3, 8, 2, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 71, 473, 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, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 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, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 301, 10, 41, 12, 41, 14, 41, 304, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 317, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 324, 10, 43, 12, 43, 14, 43, 327, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 336, 10, 43, 12, 43, 14, 43, 339, 11, 43, 5, 43, 341, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 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, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 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, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 415, 10, 66, 12, 66, 14, 66, 418, 11, 66, 3, 66, 3, 66, 6, 66, 422, 10, 66, 13, 66, 14, 66, 423, 5, 66, 426, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 7, 67, 433, 10, 67, 12, 67, 14, 67, 436, 11, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 444, 10, 68, 12, 68, 14, 68, 447, 11, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 457, 10, 69, 12, 69, 14, 69, 460, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 6, 70, 468, 10, 70, 13, 70, 14, 70, 469, 3, 70, 3, 70, 6, 302, 434, 445, 458, 2, 2, 71, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 3, 2, 9, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 67, 92, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 5, 2, 11, 12, 15, 15, 34, 34, 2, 487, 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, 3, 141, 3, 2, 2, 2, 5, 148, 3, 2, 2, 2, 7, 150, 3, 2, 2, 2, 9, 152, 3, 2, 2, 2, 11, 158, 3, 2, 2, 2, 13, 160, 3, 2, 2, 2, 15, 164, 3, 2, 2, 2, 17, 171, 3, 2, 2, 2, 19, 173, 3, 2, 2, 2, 21, 175, 3, 2, 2, 2, 23, 180, 3, 2, 2, 2, 25, 182, 3, 2, 2, 2, 27, 189, 3, 2, 2, 2, 29, 193, 3, 2, 2, 2, 31, 197, 3, 2, 2, 2, 33, 202, 3, 2, 2, 2, 35, 209, 3, 2, 2, 2, 37, 213, 3, 2, 2, 2, 39, 222, 3, 2, 2, 2, 41, 229, 3, 2, 2, 2, 43, 231, 3, 2, 2, 2, 45, 236, 3, 2, 2, 2, 47, 239, 3, 2, 2, 2, 49, 246, 3, 2, 2, 2, 51, 249, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 254, 3, 2, 2, 2, 57, 256, 3, 2, 2, 2, 59, 260, 3, 2, 2, 2, 61, 264, 3, 2, 2, 2, 63, 269, 3, 2, 2, 2, 65, 271, 3, 2, 2, 2, 67, 273, 3, 2, 2, 2, 69, 277, 3, 2, 2, 2, 71, 281, 3, 2, 2, 2, 73, 284, 3, 2, 2, 2, 75, 289, 3, 2, 2, 2, 77, 291, 3, 2, 2, 2, 79, 295, 3, 2, 2, 2, 81, 298, 3, 2, 2, 2, 83, 316, 3, 2, 2, 2, 85, 340, 3, 2, 2, 2, 87, 342, 3, 2, 2, 2, 89, 346, 3, 2, 2, 2, 91, 349, 3, 2, 2, 2, 93, 353, 3, 2, 2, 2, 95, 361, 3, 2, 2, 2, 97, 365, 3, 2, 2, 2, 99, 370, 3, 2, 2, 2, 101, 374, 3, 2, 2, 2, 103, 380, 3, 2, 2, 2, 105, 382, 3, 2, 2, 2, 107, 384, 3, 2, 2, 2, 109, 386, 3, 2, 2, 2, 111, 388, 3, 2, 2, 2, 113, 390, 3, 2, 2, 2, 115, 392, 3, 2, 2, 2, 117, 394, 3, 2, 2, 2, 119, 397, 3, 2, 2, 2, 121, 400, 3, 2, 2, 2, 123, 403, 3, 2, 2, 2, 125, 406, 3, 2, 2, 2, 127, 408, 3, 2, 2, 2, 129, 410, 3, 2, 2, 2, 131, 425, 3, 2, 2, 2, 133, 427, 3, 2, 2, 2, 135, 439, 3, 2, 2, 2, 137, 452, 3, 2, 2, 2, 139, 467, 3, 2, 2, 2, 141, 142, 7, 111, 2, 2, 142, 143, 7, 113, 2, 2, 143, 144, 7, 102, 2, 2, 144, 145, 7, 119, 2, 2, 145, 146, 7, 110, 2, 2, 146, 147, 7, 103, 2, 2, 147, 4, 3, 2, 2, 2, 148, 149, 7, 125, 2, 2, 149, 6, 3, 2, 2, 2, 150, 151, 7, 127, 2, 2, 151, 8, 3, 2, 2, 2, 152, 153, 7, 101, 2, 2, 153, 154, 7, 113, 2, 2, 154, 155, 7, 112, 2, 2, 155, 156, 7, 117, 2, 2, 156, 157, 7, 118, 2, 2, 157, 10, 3, 2, 2, 2, 158, 159, 7, 60, 2, 2, 159, 12, 3, 2, 2, 2, 160, 161, 7, 120, 2, 2, 161, 162, 7, 99, 2, 2, 162, 163, 7, 116, 2, 2, 163, 14, 3, 2, 2, 2, 164, 165, 7, 99, 2, 2, 165, 166, 7, 117, 2, 2, 166, 167, 7, 117, 2, 2, 167, 168, 7, 119, 2, 2, 168, 169, 7, 111, 2, 2, 169, 170, 7, 103, 2, 2, 170, 16, 3, 2, 2, 2, 171, 172, 7, 46, 2, 2, 172, 18, 3, 2, 2, 2, 173, 174, 7, 61, 2, 2, 174, 20, 3, 2, 2, 2, 175, 176, 7, 118, 2, 2, 176, 177, 7, 123, 2, 2, 177, 178, 7, 114, 2, 2, 178, 179, 7, 103, 2, 2, 179, 22, 3, 2, 2, 2, 180, 181, 7, 126, 2, 2, 181, 24, 3, 2, 2, 2, 182, 183, 7, 112, 2, 2, 183, 184, 7, 113, 2, 2, 184, 185, 7, 112, 2, 2, 185, 186, 7, 102, 2, 2, 186, 187, 7, 103, 2, 2, 187, 188, 7, 118, 2, 2, 188, 26, 3, 2, 2, 2, 189, 190, 7, 120, 2, 2, 190, 191, 7, 99, 2, 2, 191, 192, 7, 110, 2, 2, 192, 28, 3, 2, 2, 2, 193, 194, 7, 102, 2, 2, 194, 195, 7, 103, 2, 2, 195, 196, 7, 104, 2, 2, 196, 30, 3, 2, 2, 2, 197, 198, 7, 114, 2, 2, 198, 199, 7, 119, 2, 2, 199, 200, 7, 116, 2, 2, 200, 201, 7, 103, 2, 2, 201, 32, 3, 2, 2, 2, 202, 203, 7, 99, 2, 2, 203, 204, 7, 101, 2, 2, 204, 205, 7, 118, 2, 2, 205, 206, 7, 107, 2, 2, 206, 207, 7, 113, 2, 2, 207, 208, 7, 112, 2, 2, 208, 34, 3, 2, 2, 2, 209, 210, 7, 116, 2, 2, 210, 211, 7, 119, 2, 2, 211, 212, 7, 112, 2, 2, 212, 36, 3, 2, 2, 2, 213, 214, 7, 118, 2, 2, 214, 215, 7, 103, 2, 2, 215, 216, 7, 111, 2, 2, 216, 217, 7, 114, 2, 2, 217, 218, 7, 113, 2, 2, 218, 219, 7, 116, 2, 2, 219, 220, 7, 99, 2, 2, 220, 221, 7, 110, 2, 2, 221, 38, 3, 2, 2, 2, 222, 223, 7, 107, 2, 2, 223, 224, 7, 111, 2, 2, 224, 225, 7, 114, 2, 2, 225, 226, 7, 113, 2, 2, 226, 227, 7, 116, 2, 2, 227, 228, 7, 118, 2, 2, 228, 40, 3, 2, 2, 2, 229, 230, 7, 48, 2, 2, 230, 42, 3, 2, 2, 2, 231, 232, 7, 104, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 113, 2, 2, 234, 235, 7, 111, 2, 2, 235, 44, 3, 2, 2, 2, 236, 237, 7, 99, 2, 2, 237, 238, 7, 117, 2, 2, 238, 46, 3, 2, 2, 2, 239, 240, 7, 103, 2, 2, 240, 241, 7, 122, 2, 2, 241, 242, 7, 114, 2, 2, 242, 243, 7, 113, 2, 2, 243, 244, 7, 116, 2, 2, 244, 245, 7, 118, 2, 2, 245, 48, 3, 2, 2, 2, 246, 247, 7, 47, 2, 2, 247, 248, 7, 64, 2, 2, 248, 50, 3, 2, 2, 2, 249, 250, 7, 63, 2, 2, 250, 251, 7, 64, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 93, 2, 2, 253, 54, 3, 2, 2, 2, 254, 255, 7, 95, 2, 2, 255, 56, 3, 2, 2, 2, 256, 257, 7, 107, 2, 2, 257, 258, 7, 112, 2, 2, 258, 259, 7, 118, 2, 2, 259, 58, 3, 2, 2, 2, 260, 261, 7, 117, 2, 2, 261, 262, 7, 118, 2, 2, 262, 263, 7, 116, 2, 2, 263, 60, 3, 2, 2, 2, 264, 265, 7, 100, 2, 2, 265, 266, 7, 113, 2, 2, 266, 267, 7, 113, 2, 2, 267, 268, 7, 110, 2, 2, 268, 62, 3, 2, 2, 2, 269, 270, 7, 96, 2, 2, 270, 64, 3, 2, 2, 2, 271, 272, 7, 41, 2, 2, 272, 66, 3, 2, 2, 2, 273, 274, 7, 99, 2, 2, 274, 275, 7, 110, 2, 2, 275, 276, 7, 110, 2, 2, 276, 68, 3, 2, 2, 2, 277, 278, 7, 99, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 123, 2, 2, 280, 70, 3, 2, 2, 2, 281, 282, 7, 107, 2, 2, 282, 283, 7, 104, 2, 2, 283, 72, 3, 2, 2, 2, 284, 285, 7, 103, 2, 2, 285, 286, 7, 110, 2, 2, 286, 287, 7, 117, 2, 2, 287, 288, 7, 103, 2, 2, 288, 74, 3, 2, 2, 2, 289, 290, 7, 97, 2, 2, 290, 76, 3, 2, 2, 2, 291, 292, 7, 48, 2, 2, 292, 293, 7, 48, 2, 2, 293, 294, 7, 48, 2, 2, 294, 78, 3, 2, 2, 2, 295, 296, 7, 60, 2, 2, 296, 297, 7, 60, 2, 2, 297, 80, 3, 2, 2, 2, 298, 302, 7, 36, 2, 2, 299, 301, 11, 2, 2, 2, 300, 299, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 36, 2, 2, 306, 82, 3, 2, 2, 2, 307, 308, 7, 104, 2, 2, 308, 309, 7, 99, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 117, 2, 2, 311, 317, 7, 103, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 116, 2, 2, 314, 315, 7, 119, 2, 2, 315, 317, 7, 103, 2, 2, 316, 307, 3, 2, 2, 2, 316, 312, 3, 2, 2, 2, 317, 84, 3, 2, 2, 2, 318, 341, 7, 50, 2, 2, 319, 325, 9, 2, 2, 2, 320, 324, 9, 3, 2, 2, 321, 322, 7, 97, 2, 2, 322, 324, 9, 3, 2, 2, 323, 320, 3, 2, 2, 2, 323, 321, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 341, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 328, 329, 7, 50, 2, 2, 329, 330, 7, 122, 2, 2, 330, 331, 3, 2, 2, 2, 331, 337, 9, 4, 2, 2, 332, 336, 9, 4, 2, 2, 333, 334, 7, 97, 2, 2, 334, 336, 9, 4, 2, 2, 335, 332, 3, 2, 2, 2, 335, 333, 3, 2, 2, 2, 336, 339, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 340, 318, 3, 2, 2, 2, 340, 319, 3, 2, 2, 2, 340, 328, 3, 2, 2, 2, 341, 86, 3, 2, 2, 2, 342, 343, 7, 99, 2, 2, 343, 344, 7, 112, 2, 2, 344, 345, 7, 102, 2, 2, 345, 88, 3, 2, 2, 2, 346, 347, 7, 113, 2, 2, 347, 348, 7, 116, 2, 2, 348, 90, 3, 2, 2, 2, 349, 350, 7, 107, 2, 2, 350, 351, 7, 104, 2, 2, 351, 352, 7, 104, 2, 2, 352, 92, 3, 2, 2, 2, 353, 354, 7, 107, 2, 2, 354, 355, 7, 111, 2, 2, 355, 356, 7, 114, 2, 2, 356, 357, 7, 110, 2, 2, 357, 358, 7, 107, 2, 2, 358, 359, 7, 103, 2, 2, 359, 360, 7, 117, 2, 2, 360, 94, 3, 2, 2, 2, 361, 362, 7, 85, 2, 2, 362, 363, 7, 103, 2, 2, 363, 364, 7, 118, 2, 2, 364, 96, 3, 2, 2, 2, 365, 366, 7, 78, 2, 2, 366, 367, 7, 107, 2, 2, 367, 368, 7, 117, 2, 2, 368, 369, 7, 118, 2, 2, 369, 98, 3, 2, 2, 2, 370, 371, 7, 79, 2, 2, 371, 372, 7, 99, 2, 2, 372, 373, 7, 114, 2, 2, 373, 100, 3, 2, 2, 2, 374, 375, 7, 111, 2, 2, 375, 376, 7, 99, 2, 2, 376, 377, 7, 118, 2, 2, 377, 378, 7, 101, 2, 2, 378, 379, 7, 106, 2, 2, 379, 102, 3, 2, 2, 2, 380, 381, 7, 45, 2, 2, 381, 104, 3, 2, 2, 2, 382, 383, 7, 47, 2, 2, 383, 106, 3, 2, 2, 2, 384, 385, 7, 44, 2, 2, 385, 108, 3, 2, 2, 2, 386, 387, 7, 49, 2, 2, 387, 110, 3, 2, 2, 2, 388, 389, 7, 39, 2, 2, 389, 112, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 114, 3, 2, 2, 2, 392, 393, 7, 62, 2, 2, 393, 116, 3, 2, 2, 2, 394, 395, 7, 64, 2, 2, 395, 396, 7, 63, 2, 2, 396, 118, 3, 2, 2, 2, 397, 398, 7, 62, 2, 2, 398, 399, 7, 63, 2, 2, 399, 120, 3, 2, 2, 2, 400, 401, 7, 35, 2, 2, 401, 402, 7, 63, 2, 2, 402, 122, 3, 2, 2, 2, 403, 404, 7, 63, 2, 2, 404, 405, 7, 63, 2, 2, 405, 124, 3, 2, 2, 2, 406, 407, 7, 63, 2, 2, 407, 126, 3, 2, 2, 2, 408, 409, 7, 42, 2, 2, 409, 128, 3, 2, 2, 2, 410, 411, 7, 43, 2, 2, 411, 130, 3, 2, 2, 2, 412, 416, 9, 5, 2, 2, 413, 415, 9, 6, 2, 2, 414, 413, 3, 2, 2, 2, 415, 418, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 426, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 419, 421, 9, 7, 2, 2, 420, 422, 9, 6, 2, 2, 421, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 426, 3, 2, 2, 2, 425, 412, 3, 2, 2, 2, 425, 419, 3, 2, 2, 2, 426, 132, 3, 2, 2, 2, 427, 428, 7, 49, 2, 2, 428, 429, 7, 49, 2, 2, 429, 430, 7, 49, 2, 2, 430, 434, 3, 2, 2, 2, 431, 433, 11, 2, 2, 2, 432, 431, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 437, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 438, 7, 12, 2, 2, 438, 134, 3, 2, 2, 2, 439, 440, 7, 49, 2, 2, 440, 441, 7, 49, 2, 2, 441, 445, 3, 2, 2, 2, 442, 444, 11, 2, 2, 2, 443, 442, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 446, 448, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 449, 7, 12, 2, 2, 449, 450, 3, 2, 2, 2, 450, 451, 8, 68, 2, 2, 451, 136, 3, 2, 2, 2, 452, 453, 7, 49, 2, 2, 453, 454, 7, 44, 2, 2, 454, 458, 3, 2, 2, 2, 455, 457, 11, 2, 2, 2, 456, 455, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 461, 3, 2, 2, 2, 460, 458, 3, 2, 2, 2, 461, 462, 7, 44, 2, 2, 462, 463, 7, 49, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 8, 69, 2, 2, 465, 138, 3, 2, 2, 2, 466, 468, 9, 8, 2, 2, 467, 466, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 467, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 8, 70, 2, 2, 472, 140, 3, 2, 2, 2, 17, 2, 302, 316, 323, 325, 335, 337, 340, 416, 423, 425, 434, 445, 458, 469, 3, 8, 2, 2] \ No newline at end of file diff --git a/quint/src/generated/QuintLexer.tokens b/quint/src/generated/QuintLexer.tokens index 0ad936827..427758cd2 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -77,26 +77,26 @@ WS=69 ','=8 ';'=9 'type'=10 -'nondet'=11 -'val'=12 -'def'=13 -'pure'=14 -'action'=15 -'run'=16 -'temporal'=17 -'import'=18 -'.'=19 -'from'=20 -'as'=21 -'export'=22 -'->'=23 -'=>'=24 -'['=25 -']'=26 -'int'=27 -'str'=28 -'bool'=29 -'|'=30 +'|'=11 +'nondet'=12 +'val'=13 +'def'=14 +'pure'=15 +'action'=16 +'run'=17 +'temporal'=18 +'import'=19 +'.'=20 +'from'=21 +'as'=22 +'export'=23 +'->'=24 +'=>'=25 +'['=26 +']'=27 +'int'=28 +'str'=29 +'bool'=30 '^'=31 '\''=32 'all'=33 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index eb6cc4e46..96e3056d4 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -116,13 +116,13 @@ export class QuintLexer extends Lexer { private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'nondet'", "'val'", "'def'", "'pure'", "'action'", - "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", "'export'", - "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", "'|'", "'^'", - "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, - undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Set'", - "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", - "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", + "','", "';'", "'type'", "'|'", "'nondet'", "'val'", "'def'", "'pure'", + "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", + "'export'", "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", + "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", + undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", + "'Set'", "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", + "'>'", "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -182,19 +182,19 @@ export class QuintLexer extends Lexer { "\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + "\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b\x03\b\x03" + "\b\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\x0E" + - "\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10" + - "\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11" + - "\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14" + - "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16" + - "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18" + - "\x03\x18\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1C" + - "\x03\x1C\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E" + - "\x03\x1E\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03 \x03 \x03!\x03!\x03\"\x03" + - "\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03%\x03%\x03%\x03%" + - "\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(\x03(\x03(\x03)\x03)\x07)" + - "\u012D\n)\f)\x0E)\u0130\v)\x03)\x03)\x03*\x03*\x03*\x03*\x03*\x03*\x03" + + "\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03" + + "\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03" + + "\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1E\x03" + + "\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x03!\x03!\x03\"" + + "\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03%\x03%\x03%\x03" + + "%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(\x03(\x03(\x03)\x03)\x07" + + ")\u012D\n)\f)\x0E)\u0130\v)\x03)\x03)\x03*\x03*\x03*\x03*\x03*\x03*\x03" + "*\x03*\x03*\x05*\u013D\n*\x03+\x03+\x03+\x03+\x03+\x07+\u0144\n+\f+\x0E" + "+\u0147\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x07+\u0150\n+\f+\x0E+\u0153" + "\v+\x05+\u0155\n+\x03,\x03,\x03,\x03,\x03-\x03-\x03-\x03.\x03.\x03.\x03" + @@ -242,12 +242,12 @@ export class QuintLexer extends Lexer { "\x07\x96\x03\x02\x02\x02\t\x98\x03\x02\x02\x02\v\x9E\x03\x02\x02\x02\r" + "\xA0\x03\x02\x02\x02\x0F\xA4\x03\x02\x02\x02\x11\xAB\x03\x02\x02\x02\x13" + "\xAD\x03\x02\x02\x02\x15\xAF\x03\x02\x02\x02\x17\xB4\x03\x02\x02\x02\x19" + - "\xBB\x03\x02\x02\x02\x1B\xBF\x03\x02\x02\x02\x1D\xC3\x03\x02\x02\x02\x1F" + - "\xC8\x03\x02\x02\x02!\xCF\x03\x02\x02\x02#\xD3\x03\x02\x02\x02%\xDC\x03" + - "\x02\x02\x02\'\xE3\x03\x02\x02\x02)\xE5\x03\x02\x02\x02+\xEA\x03\x02\x02" + - "\x02-\xED\x03\x02\x02\x02/\xF4\x03\x02\x02\x021\xF7\x03\x02\x02\x023\xFA" + - "\x03\x02\x02\x025\xFC\x03\x02\x02\x027\xFE\x03\x02\x02\x029\u0102\x03" + - "\x02\x02\x02;\u0106\x03\x02\x02\x02=\u010B\x03\x02\x02\x02?\u010D\x03" + + "\xB6\x03\x02\x02\x02\x1B\xBD\x03\x02\x02\x02\x1D\xC1\x03\x02\x02\x02\x1F" + + "\xC5\x03\x02\x02\x02!\xCA\x03\x02\x02\x02#\xD1\x03\x02\x02\x02%\xD5\x03" + + "\x02\x02\x02\'\xDE\x03\x02\x02\x02)\xE5\x03\x02\x02\x02+\xE7\x03\x02\x02" + + "\x02-\xEC\x03\x02\x02\x02/\xEF\x03\x02\x02\x021\xF6\x03\x02\x02\x023\xF9" + + "\x03\x02\x02\x025\xFC\x03\x02\x02\x027\xFE\x03\x02\x02\x029\u0100\x03" + + "\x02\x02\x02;\u0104\x03\x02\x02\x02=\u0108\x03\x02\x02\x02?\u010D\x03" + "\x02\x02\x02A\u010F\x03\x02\x02\x02C\u0111\x03\x02\x02\x02E\u0115\x03" + "\x02\x02\x02G\u0119\x03\x02\x02\x02I\u011C\x03\x02\x02\x02K\u0121\x03" + "\x02\x02\x02M\u0123\x03\x02\x02\x02O\u0127\x03\x02\x02\x02Q\u012A\x03" + @@ -273,33 +273,33 @@ export class QuintLexer extends Lexer { "\x03\x02\x02\x02\xAB\xAC\x07.\x02\x02\xAC\x12\x03\x02\x02\x02\xAD\xAE" + "\x07=\x02\x02\xAE\x14\x03\x02\x02\x02\xAF\xB0\x07v\x02\x02\xB0\xB1\x07" + "{\x02\x02\xB1\xB2\x07r\x02\x02\xB2\xB3\x07g\x02\x02\xB3\x16\x03\x02\x02" + - "\x02\xB4\xB5\x07p\x02\x02\xB5\xB6\x07q\x02\x02\xB6\xB7\x07p\x02\x02\xB7" + - "\xB8\x07f\x02\x02\xB8\xB9\x07g\x02\x02\xB9\xBA\x07v\x02\x02\xBA\x18\x03" + - "\x02\x02\x02\xBB\xBC\x07x\x02\x02\xBC\xBD\x07c\x02\x02\xBD\xBE\x07n\x02" + - "\x02\xBE\x1A\x03\x02\x02\x02\xBF\xC0\x07f\x02\x02\xC0\xC1\x07g\x02\x02" + - "\xC1\xC2\x07h\x02\x02\xC2\x1C\x03\x02\x02\x02\xC3\xC4\x07r\x02\x02\xC4" + - "\xC5\x07w\x02\x02\xC5\xC6\x07t\x02\x02\xC6\xC7\x07g\x02\x02\xC7\x1E\x03" + - "\x02\x02\x02\xC8\xC9\x07c\x02\x02\xC9\xCA\x07e\x02\x02\xCA\xCB\x07v\x02" + - "\x02\xCB\xCC\x07k\x02\x02\xCC\xCD\x07q\x02\x02\xCD\xCE\x07p\x02\x02\xCE" + - " \x03\x02\x02\x02\xCF\xD0\x07t\x02\x02\xD0\xD1\x07w\x02\x02\xD1\xD2\x07" + - "p\x02\x02\xD2\"\x03\x02\x02\x02\xD3\xD4\x07v\x02\x02\xD4\xD5\x07g\x02" + - "\x02\xD5\xD6\x07o\x02\x02\xD6\xD7\x07r\x02\x02\xD7\xD8\x07q\x02\x02\xD8" + - "\xD9\x07t\x02\x02\xD9\xDA\x07c\x02\x02\xDA\xDB\x07n\x02\x02\xDB$\x03\x02" + - "\x02\x02\xDC\xDD\x07k\x02\x02\xDD\xDE\x07o\x02\x02\xDE\xDF\x07r\x02\x02" + - "\xDF\xE0\x07q\x02\x02\xE0\xE1\x07t\x02\x02\xE1\xE2\x07v\x02\x02\xE2&\x03" + - "\x02\x02\x02\xE3\xE4\x070\x02\x02\xE4(\x03\x02\x02\x02\xE5\xE6\x07h\x02" + - "\x02\xE6\xE7\x07t\x02\x02\xE7\xE8\x07q\x02\x02\xE8\xE9\x07o\x02\x02\xE9" + - "*\x03\x02\x02\x02\xEA\xEB\x07c\x02\x02\xEB\xEC\x07u\x02\x02\xEC,\x03\x02" + - "\x02\x02\xED\xEE\x07g\x02\x02\xEE\xEF\x07z\x02\x02\xEF\xF0\x07r\x02\x02" + - "\xF0\xF1\x07q\x02\x02\xF1\xF2\x07t\x02\x02\xF2\xF3\x07v\x02\x02\xF3.\x03" + - "\x02\x02\x02\xF4\xF5\x07/\x02\x02\xF5\xF6\x07@\x02\x02\xF60\x03\x02\x02" + - "\x02\xF7\xF8\x07?\x02\x02\xF8\xF9\x07@\x02\x02\xF92\x03\x02\x02\x02\xFA" + - "\xFB\x07]\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07_\x02\x02\xFD6\x03\x02" + - "\x02\x02\xFE\xFF\x07k\x02\x02\xFF\u0100\x07p\x02\x02\u0100\u0101\x07v" + - "\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07u\x02\x02\u0103\u0104\x07" + - "v\x02\x02\u0104\u0105\x07t\x02\x02\u0105:\x03\x02\x02\x02\u0106\u0107" + - "\x07d\x02\x02\u0107\u0108\x07q\x02\x02\u0108\u0109\x07q\x02\x02\u0109" + - "\u010A\x07n\x02\x02\u010A<\x03\x02\x02\x02\u010B\u010C\x07~\x02\x02\u010C" + + "\x02\xB4\xB5\x07~\x02\x02\xB5\x18\x03\x02\x02\x02\xB6\xB7\x07p\x02\x02" + + "\xB7\xB8\x07q\x02\x02\xB8\xB9\x07p\x02\x02\xB9\xBA\x07f\x02\x02\xBA\xBB" + + "\x07g\x02\x02\xBB\xBC\x07v\x02\x02\xBC\x1A\x03\x02\x02\x02\xBD\xBE\x07" + + "x\x02\x02\xBE\xBF\x07c\x02\x02\xBF\xC0\x07n\x02\x02\xC0\x1C\x03\x02\x02" + + "\x02\xC1\xC2\x07f\x02\x02\xC2\xC3\x07g\x02\x02\xC3\xC4\x07h\x02\x02\xC4" + + "\x1E\x03\x02\x02\x02\xC5\xC6\x07r\x02\x02\xC6\xC7\x07w\x02\x02\xC7\xC8" + + "\x07t\x02\x02\xC8\xC9\x07g\x02\x02\xC9 \x03\x02\x02\x02\xCA\xCB\x07c\x02" + + "\x02\xCB\xCC\x07e\x02\x02\xCC\xCD\x07v\x02\x02\xCD\xCE\x07k\x02\x02\xCE" + + "\xCF\x07q\x02\x02\xCF\xD0\x07p\x02\x02\xD0\"\x03\x02\x02\x02\xD1\xD2\x07" + + "t\x02\x02\xD2\xD3\x07w\x02\x02\xD3\xD4\x07p\x02\x02\xD4$\x03\x02\x02\x02" + + "\xD5\xD6\x07v\x02\x02\xD6\xD7\x07g\x02\x02\xD7\xD8\x07o\x02\x02\xD8\xD9" + + "\x07r\x02\x02\xD9\xDA\x07q\x02\x02\xDA\xDB\x07t\x02\x02\xDB\xDC\x07c\x02" + + "\x02\xDC\xDD\x07n\x02\x02\xDD&\x03\x02\x02\x02\xDE\xDF\x07k\x02\x02\xDF" + + "\xE0\x07o\x02\x02\xE0\xE1\x07r\x02\x02\xE1\xE2\x07q\x02\x02\xE2\xE3\x07" + + "t\x02\x02\xE3\xE4\x07v\x02\x02\xE4(\x03\x02\x02\x02\xE5\xE6\x070\x02\x02" + + "\xE6*\x03\x02\x02\x02\xE7\xE8\x07h\x02\x02\xE8\xE9\x07t\x02\x02\xE9\xEA" + + "\x07q\x02\x02\xEA\xEB\x07o\x02\x02\xEB,\x03\x02\x02\x02\xEC\xED\x07c\x02" + + "\x02\xED\xEE\x07u\x02\x02\xEE.\x03\x02\x02\x02\xEF\xF0\x07g\x02\x02\xF0" + + "\xF1\x07z\x02\x02\xF1\xF2\x07r\x02\x02\xF2\xF3\x07q\x02\x02\xF3\xF4\x07" + + "t\x02\x02\xF4\xF5\x07v\x02\x02\xF50\x03\x02\x02\x02\xF6\xF7\x07/\x02\x02" + + "\xF7\xF8\x07@\x02\x02\xF82\x03\x02\x02\x02\xF9\xFA\x07?\x02\x02\xFA\xFB" + + "\x07@\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07]\x02\x02\xFD6\x03\x02\x02" + + "\x02\xFE\xFF\x07_\x02\x02\xFF8\x03\x02\x02\x02\u0100\u0101\x07k\x02\x02" + + "\u0101\u0102\x07p\x02\x02\u0102\u0103\x07v\x02\x02\u0103:\x03\x02\x02" + + "\x02\u0104\u0105\x07u\x02\x02\u0105\u0106\x07v\x02\x02\u0106\u0107\x07" + + "t\x02\x02\u0107<\x03\x02\x02\x02\u0108\u0109\x07d\x02\x02\u0109\u010A" + + "\x07q\x02\x02\u010A\u010B\x07q\x02\x02\u010B\u010C\x07n\x02\x02\u010C" + ">\x03\x02\x02\x02\u010D\u010E\x07`\x02\x02\u010E@\x03\x02\x02\x02\u010F" + "\u0110\x07)\x02\x02\u0110B\x03\x02\x02\x02\u0111\u0112\x07c\x02\x02\u0112" + "\u0113\x07n\x02\x02\u0113\u0114\x07n\x02\x02\u0114D\x03\x02\x02\x02\u0115" + diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 9d6fdf5b2..3da7b4d67 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -23,6 +23,7 @@ import { TypeConstOrVarContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; +import { TypeSumDefContext } from "./QuintParser"; import { DotCallContext } from "./QuintParser"; import { LambdaConsContext } from "./QuintParser"; import { OperAppContext } from "./QuintParser"; @@ -67,6 +68,7 @@ import { DocumentedUnitContext } from "./QuintParser"; import { UnitContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeSumVariantContext } from "./QuintParser"; import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; import { ImportModContext } from "./QuintParser"; @@ -283,6 +285,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeAliasDef?: (ctx: TypeAliasDefContext) => void; + /** + * Enter a parse tree produced by the `typeSumDef` + * labeled alternative in `QuintParser.typeDef`. + * @param ctx the parse tree + */ + enterTypeSumDef?: (ctx: TypeSumDefContext) => void; + /** + * Exit a parse tree produced by the `typeSumDef` + * labeled alternative in `QuintParser.typeDef`. + * @param ctx the parse tree + */ + exitTypeSumDef?: (ctx: TypeSumDefContext) => void; + /** * Enter a parse tree produced by the `dotCall` * labeled alternative in `QuintParser.expr`. @@ -843,6 +858,17 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeDef?: (ctx: TypeDefContext) => void; + /** + * Enter a parse tree produced by `QuintParser.typeSumVariant`. + * @param ctx the parse tree + */ + enterTypeSumVariant?: (ctx: TypeSumVariantContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeSumVariant`. + * @param ctx the parse tree + */ + exitTypeSumVariant?: (ctx: TypeSumVariantContext) => void; + /** * Enter a parse tree produced by `QuintParser.nondetOperDef`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 875a2ed0f..1dc9097aa 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -109,52 +109,53 @@ export class QuintParser extends Parser { public static readonly RULE_unit = 3; public static readonly RULE_operDef = 4; public static readonly RULE_typeDef = 5; - public static readonly RULE_nondetOperDef = 6; - public static readonly RULE_qualifier = 7; - public static readonly RULE_importMod = 8; - public static readonly RULE_exportMod = 9; - public static readonly RULE_instanceMod = 10; - public static readonly RULE_moduleName = 11; - public static readonly RULE_name = 12; - public static readonly RULE_qualifiedName = 13; - public static readonly RULE_fromSource = 14; - public static readonly RULE_type = 15; - public static readonly RULE_typeUnionRecOne = 16; - public static readonly RULE_row = 17; - public static readonly RULE_rowLabel = 18; - public static readonly RULE_expr = 19; - public static readonly RULE_unitOrExpr = 20; - public static readonly RULE_lambda = 21; - public static readonly RULE_identOrHole = 22; - public static readonly RULE_parameter = 23; - public static readonly RULE_identOrStar = 24; - public static readonly RULE_argList = 25; - public static readonly RULE_recElem = 26; - public static readonly RULE_normalCallName = 27; - public static readonly RULE_nameAfterDot = 28; - public static readonly RULE_operator = 29; - public static readonly RULE_literal = 30; - public static readonly RULE_qualId = 31; - public static readonly RULE_simpleId = 32; + public static readonly RULE_typeSumVariant = 6; + public static readonly RULE_nondetOperDef = 7; + public static readonly RULE_qualifier = 8; + public static readonly RULE_importMod = 9; + public static readonly RULE_exportMod = 10; + public static readonly RULE_instanceMod = 11; + public static readonly RULE_moduleName = 12; + public static readonly RULE_name = 13; + public static readonly RULE_qualifiedName = 14; + public static readonly RULE_fromSource = 15; + public static readonly RULE_type = 16; + public static readonly RULE_typeUnionRecOne = 17; + public static readonly RULE_row = 18; + public static readonly RULE_rowLabel = 19; + public static readonly RULE_expr = 20; + public static readonly RULE_unitOrExpr = 21; + public static readonly RULE_lambda = 22; + public static readonly RULE_identOrHole = 23; + public static readonly RULE_parameter = 24; + public static readonly RULE_identOrStar = 25; + public static readonly RULE_argList = 26; + public static readonly RULE_recElem = 27; + public static readonly RULE_normalCallName = 28; + public static readonly RULE_nameAfterDot = 29; + public static readonly RULE_operator = 30; + public static readonly RULE_literal = 31; + public static readonly RULE_qualId = 32; + public static readonly RULE_simpleId = 33; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ - "modules", "module", "documentedUnit", "unit", "operDef", "typeDef", "nondetOperDef", - "qualifier", "importMod", "exportMod", "instanceMod", "moduleName", "name", - "qualifiedName", "fromSource", "type", "typeUnionRecOne", "row", "rowLabel", - "expr", "unitOrExpr", "lambda", "identOrHole", "parameter", "identOrStar", - "argList", "recElem", "normalCallName", "nameAfterDot", "operator", "literal", - "qualId", "simpleId", + "modules", "module", "documentedUnit", "unit", "operDef", "typeDef", "typeSumVariant", + "nondetOperDef", "qualifier", "importMod", "exportMod", "instanceMod", + "moduleName", "name", "qualifiedName", "fromSource", "type", "typeUnionRecOne", + "row", "rowLabel", "expr", "unitOrExpr", "lambda", "identOrHole", "parameter", + "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", + "operator", "literal", "qualId", "simpleId", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'nondet'", "'val'", "'def'", "'pure'", "'action'", - "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", "'export'", - "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", "'|'", "'^'", - "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, - undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Set'", - "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", - "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", + "','", "';'", "'type'", "'|'", "'nondet'", "'val'", "'def'", "'pure'", + "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", + "'export'", "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", + "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", + undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", + "'Set'", "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", + "'>'", "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -202,21 +203,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 67; + this.state = 69; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 66; + this.state = 68; this.module(); } } - this.state = 69; + this.state = 71; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 71; + this.state = 73; this.match(QuintParser.EOF); } } @@ -242,41 +243,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 76; + this.state = 78; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 73; + this.state = 75; this.match(QuintParser.DOCCOMMENT); } } - this.state = 78; + this.state = 80; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 79; + this.state = 81; this.match(QuintParser.T__0); - this.state = 80; + this.state = 82; this.qualId(); - this.state = 81; + this.state = 83; this.match(QuintParser.T__1); - this.state = 85; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__21))) !== 0) || _la === QuintParser.DOCCOMMENT) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__22))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 82; + this.state = 84; this.documentedUnit(); } } - this.state = 87; + this.state = 89; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 88; + this.state = 90; this.match(QuintParser.T__2); } } @@ -302,21 +303,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 93; + this.state = 95; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 90; + this.state = 92; this.match(QuintParser.DOCCOMMENT); } } - this.state = 95; + this.state = 97; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 96; + this.state = 98; this.unit(); } } @@ -339,20 +340,20 @@ export class QuintParser extends Parser { let _localctx: UnitContext = new UnitContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_unit); try { - this.state = 118; + this.state = 120; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: _localctx = new ConstContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 98; + this.state = 100; this.match(QuintParser.T__3); - this.state = 99; + this.state = 101; this.qualId(); - this.state = 100; + this.state = 102; this.match(QuintParser.T__4); - this.state = 101; + this.state = 103; this.type(0); } break; @@ -361,13 +362,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 103; + this.state = 105; this.match(QuintParser.T__5); - this.state = 104; + this.state = 106; this.qualId(); - this.state = 105; + this.state = 107; this.match(QuintParser.T__4); - this.state = 106; + this.state = 108; this.type(0); } break; @@ -376,13 +377,13 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 108; + this.state = 110; this.match(QuintParser.T__6); - this.state = 109; + this.state = 111; this.identOrHole(); - this.state = 110; + this.state = 112; this.match(QuintParser.ASGN); - this.state = 111; + this.state = 113; this.expr(0); } break; @@ -391,7 +392,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 113; + this.state = 115; this.instanceMod(); } break; @@ -400,7 +401,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 114; + this.state = 116; this.operDef(); } break; @@ -409,7 +410,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 115; + this.state = 117; this.typeDef(); } break; @@ -418,7 +419,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 116; + this.state = 118; this.importMod(); } break; @@ -427,7 +428,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 117; + this.state = 119; this.exportMod(); } break; @@ -455,53 +456,53 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 120; + this.state = 122; this.qualifier(); - this.state = 121; + this.state = 123; this.normalCallName(); - this.state = 158; + this.state = 160; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { case 1: { - this.state = 122; + this.state = 124; this.match(QuintParser.LPAREN); - this.state = 131; + this.state = 133; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__36 || _la === QuintParser.IDENTIFIER) { { - this.state = 123; + this.state = 125; this.parameter(); - this.state = 128; + this.state = 130; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 124; + this.state = 126; this.match(QuintParser.T__7); - this.state = 125; + this.state = 127; this.parameter(); } } - this.state = 130; + this.state = 132; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 133; + this.state = 135; this.match(QuintParser.RPAREN); - this.state = 136; + this.state = 138; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 134; + this.state = 136; this.match(QuintParser.T__4); - this.state = 135; + this.state = 137; this.type(0); } } @@ -511,72 +512,72 @@ export class QuintParser extends Parser { case 2: { - this.state = 138; + this.state = 140; this.match(QuintParser.T__4); - this.state = 139; + this.state = 141; this.type(0); } break; case 3: { - this.state = 140; + this.state = 142; this.match(QuintParser.LPAREN); { - this.state = 141; + this.state = 143; this.parameter(); - this.state = 142; + this.state = 144; this.match(QuintParser.T__4); - this.state = 143; + this.state = 145; this.type(0); - this.state = 151; + this.state = 153; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 144; + this.state = 146; this.match(QuintParser.T__7); - this.state = 145; + this.state = 147; this.parameter(); - this.state = 146; + this.state = 148; this.match(QuintParser.T__4); - this.state = 147; + this.state = 149; this.type(0); } } - this.state = 153; + this.state = 155; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 154; + this.state = 156; this.match(QuintParser.RPAREN); - this.state = 155; + this.state = 157; this.match(QuintParser.T__4); - this.state = 156; + this.state = 158; this.type(0); } break; } - this.state = 162; + this.state = 164; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 160; + this.state = 162; this.match(QuintParser.ASGN); - this.state = 161; + this.state = 163; this.expr(0); } } - this.state = 165; + this.state = 167; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 164; + this.state = 166; this.match(QuintParser.T__8); } } @@ -601,17 +602,18 @@ export class QuintParser extends Parser { public typeDef(): TypeDefContext { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); + let _la: number; try { - this.state = 174; + this.state = 190; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 12, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 167; + this.state = 169; this.match(QuintParser.T__9); - this.state = 168; + this.state = 170; this.qualId(); } break; @@ -620,16 +622,97 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 169; + this.state = 171; this.match(QuintParser.T__9); - this.state = 170; + this.state = 172; this.qualId(); - this.state = 171; + this.state = 173; this.match(QuintParser.ASGN); - this.state = 172; + this.state = 174; this.type(0); } break; + + case 3: + _localctx = new TypeSumDefContext(_localctx); + this.enterOuterAlt(_localctx, 3); + { + this.state = 176; + this.match(QuintParser.T__9); + this.state = 177; + (_localctx as TypeSumDefContext)._typeName = this.qualId(); + this.state = 178; + this.match(QuintParser.ASGN); + this.state = 180; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__10) { + { + this.state = 179; + this.match(QuintParser.T__10); + } + } + + this.state = 182; + this.typeSumVariant(); + this.state = 187; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__10) { + { + { + this.state = 183; + this.match(QuintParser.T__10); + this.state = 184; + this.typeSumVariant(); + } + } + this.state = 189; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } + break; + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public typeSumVariant(): TypeSumVariantContext { + let _localctx: TypeSumVariantContext = new TypeSumVariantContext(this._ctx, this.state); + this.enterRule(_localctx, 12, QuintParser.RULE_typeSumVariant); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 192; + _localctx._sumLabel = this.simpleId("variant label"); + this.state = 197; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.LPAREN) { + { + this.state = 193; + this.match(QuintParser.LPAREN); + this.state = 194; + this.type(0); + this.state = 195; + this.match(QuintParser.RPAREN); + } + } + } } catch (re) { @@ -649,37 +732,37 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nondetOperDef(): NondetOperDefContext { let _localctx: NondetOperDefContext = new NondetOperDefContext(this._ctx, this.state); - this.enterRule(_localctx, 12, QuintParser.RULE_nondetOperDef); + this.enterRule(_localctx, 14, QuintParser.RULE_nondetOperDef); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 176; - this.match(QuintParser.T__10); - this.state = 177; + this.state = 199; + this.match(QuintParser.T__11); + this.state = 200; this.qualId(); - this.state = 180; + this.state = 203; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 178; + this.state = 201; this.match(QuintParser.T__4); - this.state = 179; + this.state = 202; this.type(0); } } - this.state = 182; + this.state = 205; this.match(QuintParser.ASGN); - this.state = 183; + this.state = 206; this.expr(0); - this.state = 185; + this.state = 208; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 184; + this.state = 207; this.match(QuintParser.T__8); } } @@ -703,68 +786,68 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifier(): QualifierContext { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); - this.enterRule(_localctx, 14, QuintParser.RULE_qualifier); + this.enterRule(_localctx, 16, QuintParser.RULE_qualifier); try { - this.state = 196; + this.state = 219; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 15, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 18, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 187; - this.match(QuintParser.T__11); + this.state = 210; + this.match(QuintParser.T__12); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 188; - this.match(QuintParser.T__12); + this.state = 211; + this.match(QuintParser.T__13); } break; case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 189; - this.match(QuintParser.T__13); - this.state = 190; - this.match(QuintParser.T__11); + this.state = 212; + this.match(QuintParser.T__14); + this.state = 213; + this.match(QuintParser.T__12); } break; case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 191; + this.state = 214; + this.match(QuintParser.T__14); + this.state = 215; this.match(QuintParser.T__13); - this.state = 192; - this.match(QuintParser.T__12); } break; case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 193; - this.match(QuintParser.T__14); + this.state = 216; + this.match(QuintParser.T__15); } break; case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 194; - this.match(QuintParser.T__15); + this.state = 217; + this.match(QuintParser.T__16); } break; case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 195; - this.match(QuintParser.T__16); + this.state = 218; + this.match(QuintParser.T__17); } break; } @@ -786,31 +869,31 @@ export class QuintParser extends Parser { // @RuleVersion(0) public importMod(): ImportModContext { let _localctx: ImportModContext = new ImportModContext(this._ctx, this.state); - this.enterRule(_localctx, 16, QuintParser.RULE_importMod); + this.enterRule(_localctx, 18, QuintParser.RULE_importMod); let _la: number; try { - this.state = 216; + this.state = 239; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 19, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 198; - this.match(QuintParser.T__17); - this.state = 199; - this.name(); - this.state = 200; + this.state = 221; this.match(QuintParser.T__18); - this.state = 201; + this.state = 222; + this.name(); + this.state = 223; + this.match(QuintParser.T__19); + this.state = 224; this.identOrStar(); - this.state = 204; + this.state = 227; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__19) { + if (_la === QuintParser.T__20) { { - this.state = 202; - this.match(QuintParser.T__19); - this.state = 203; + this.state = 225; + this.match(QuintParser.T__20); + this.state = 226; this.fromSource(); } } @@ -821,30 +904,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 206; - this.match(QuintParser.T__17); - this.state = 207; + this.state = 229; + this.match(QuintParser.T__18); + this.state = 230; this.name(); - this.state = 210; + this.state = 233; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__21) { { - this.state = 208; - this.match(QuintParser.T__20); - this.state = 209; + this.state = 231; + this.match(QuintParser.T__21); + this.state = 232; this.name(); } } - this.state = 214; + this.state = 237; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__19) { + if (_la === QuintParser.T__20) { { - this.state = 212; - this.match(QuintParser.T__19); - this.state = 213; + this.state = 235; + this.match(QuintParser.T__20); + this.state = 236; this.fromSource(); } } @@ -870,22 +953,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public exportMod(): ExportModContext { let _localctx: ExportModContext = new ExportModContext(this._ctx, this.state); - this.enterRule(_localctx, 18, QuintParser.RULE_exportMod); + this.enterRule(_localctx, 20, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 229; + this.state = 252; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 21, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 218; - this.match(QuintParser.T__21); - this.state = 219; + this.state = 241; + this.match(QuintParser.T__22); + this.state = 242; this.name(); - this.state = 220; - this.match(QuintParser.T__18); - this.state = 221; + this.state = 243; + this.match(QuintParser.T__19); + this.state = 244; this.identOrStar(); } break; @@ -893,18 +976,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 223; - this.match(QuintParser.T__21); - this.state = 224; + this.state = 246; + this.match(QuintParser.T__22); + this.state = 247; this.name(); - this.state = 227; + this.state = 250; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__21) { { - this.state = 225; - this.match(QuintParser.T__20); - this.state = 226; + this.state = 248; + this.match(QuintParser.T__21); + this.state = 249; this.name(); } } @@ -930,63 +1013,63 @@ export class QuintParser extends Parser { // @RuleVersion(0) public instanceMod(): InstanceModContext { let _localctx: InstanceModContext = new InstanceModContext(this._ctx, this.state); - this.enterRule(_localctx, 20, QuintParser.RULE_instanceMod); + this.enterRule(_localctx, 22, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 277; + this.state = 300; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 26, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 231; - this.match(QuintParser.T__17); - this.state = 232; + this.state = 254; + this.match(QuintParser.T__18); + this.state = 255; this.moduleName(); - this.state = 233; + this.state = 256; this.match(QuintParser.LPAREN); { - this.state = 234; + this.state = 257; this.name(); - this.state = 235; + this.state = 258; this.match(QuintParser.ASGN); - this.state = 236; + this.state = 259; this.expr(0); - this.state = 244; + this.state = 267; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 237; + this.state = 260; this.match(QuintParser.T__7); - this.state = 238; + this.state = 261; this.name(); - this.state = 239; + this.state = 262; this.match(QuintParser.ASGN); - this.state = 240; + this.state = 263; this.expr(0); } } - this.state = 246; + this.state = 269; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 247; + this.state = 270; this.match(QuintParser.RPAREN); - this.state = 248; - this.match(QuintParser.T__18); - this.state = 249; + this.state = 271; + this.match(QuintParser.T__19); + this.state = 272; this.match(QuintParser.MUL); - this.state = 252; + this.state = 275; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__19) { + if (_la === QuintParser.T__20) { { - this.state = 250; - this.match(QuintParser.T__19); - this.state = 251; + this.state = 273; + this.match(QuintParser.T__20); + this.state = 274; this.fromSource(); } } @@ -997,54 +1080,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 254; - this.match(QuintParser.T__17); - this.state = 255; + this.state = 277; + this.match(QuintParser.T__18); + this.state = 278; this.moduleName(); - this.state = 256; + this.state = 279; this.match(QuintParser.LPAREN); { - this.state = 257; + this.state = 280; this.name(); - this.state = 258; + this.state = 281; this.match(QuintParser.ASGN); - this.state = 259; + this.state = 282; this.expr(0); - this.state = 267; + this.state = 290; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 260; + this.state = 283; this.match(QuintParser.T__7); - this.state = 261; + this.state = 284; this.name(); - this.state = 262; + this.state = 285; this.match(QuintParser.ASGN); - this.state = 263; + this.state = 286; this.expr(0); } } - this.state = 269; + this.state = 292; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 270; + this.state = 293; this.match(QuintParser.RPAREN); - this.state = 271; - this.match(QuintParser.T__20); - this.state = 272; + this.state = 294; + this.match(QuintParser.T__21); + this.state = 295; this.qualifiedName(); - this.state = 275; + this.state = 298; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__19) { + if (_la === QuintParser.T__20) { { - this.state = 273; - this.match(QuintParser.T__19); - this.state = 274; + this.state = 296; + this.match(QuintParser.T__20); + this.state = 297; this.fromSource(); } } @@ -1070,11 +1153,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public moduleName(): ModuleNameContext { let _localctx: ModuleNameContext = new ModuleNameContext(this._ctx, this.state); - this.enterRule(_localctx, 22, QuintParser.RULE_moduleName); + this.enterRule(_localctx, 24, QuintParser.RULE_moduleName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 279; + this.state = 302; this.qualId(); } } @@ -1095,11 +1178,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public name(): NameContext { let _localctx: NameContext = new NameContext(this._ctx, this.state); - this.enterRule(_localctx, 24, QuintParser.RULE_name); + this.enterRule(_localctx, 26, QuintParser.RULE_name); try { this.enterOuterAlt(_localctx, 1); { - this.state = 281; + this.state = 304; this.qualId(); } } @@ -1120,11 +1203,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 26, QuintParser.RULE_qualifiedName); + this.enterRule(_localctx, 28, QuintParser.RULE_qualifiedName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 283; + this.state = 306; this.qualId(); } } @@ -1145,11 +1228,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public fromSource(): FromSourceContext { let _localctx: FromSourceContext = new FromSourceContext(this._ctx, this.state); - this.enterRule(_localctx, 28, QuintParser.RULE_fromSource); + this.enterRule(_localctx, 30, QuintParser.RULE_fromSource); try { this.enterOuterAlt(_localctx, 1); { - this.state = 285; + this.state = 308; this.match(QuintParser.STRING); } } @@ -1180,67 +1263,67 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: TypeContext = new TypeContext(this._ctx, _parentState); let _prevctx: TypeContext = _localctx; - let _startState: number = 30; - this.enterRecursionRule(_localctx, 30, QuintParser.RULE_type, _p); + let _startState: number = 32; + this.enterRecursionRule(_localctx, 32, QuintParser.RULE_type, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 348; + this.state = 371; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 33, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 288; + this.state = 311; this.match(QuintParser.LPAREN); - this.state = 297; + this.state = 320; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__26) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & ((1 << (QuintParser.SET - 47)) | (1 << (QuintParser.LIST - 47)) | (1 << (QuintParser.LPAREN - 47)) | (1 << (QuintParser.IDENTIFIER - 47)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & ((1 << (QuintParser.SET - 47)) | (1 << (QuintParser.LIST - 47)) | (1 << (QuintParser.LPAREN - 47)) | (1 << (QuintParser.IDENTIFIER - 47)))) !== 0)) { { - this.state = 289; + this.state = 312; this.type(0); - this.state = 294; + this.state = 317; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 27, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 290; + this.state = 313; this.match(QuintParser.T__7); - this.state = 291; + this.state = 314; this.type(0); } } } - this.state = 296; + this.state = 319; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 27, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); } } } - this.state = 300; + this.state = 323; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 299; + this.state = 322; this.match(QuintParser.T__7); } } - this.state = 302; + this.state = 325; this.match(QuintParser.RPAREN); - this.state = 303; - this.match(QuintParser.T__23); - this.state = 304; + this.state = 326; + this.match(QuintParser.T__24); + this.state = 327; this.type(11); } break; @@ -1250,14 +1333,14 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 305; + this.state = 328; this.match(QuintParser.SET); - this.state = 306; - this.match(QuintParser.T__24); - this.state = 307; - this.type(0); - this.state = 308; + this.state = 329; this.match(QuintParser.T__25); + this.state = 330; + this.type(0); + this.state = 331; + this.match(QuintParser.T__26); } break; @@ -1266,14 +1349,14 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 310; + this.state = 333; this.match(QuintParser.LIST); - this.state = 311; - this.match(QuintParser.T__24); - this.state = 312; - this.type(0); - this.state = 313; + this.state = 334; this.match(QuintParser.T__25); + this.state = 335; + this.type(0); + this.state = 336; + this.match(QuintParser.T__26); } break; @@ -1282,43 +1365,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 315; + this.state = 338; this.match(QuintParser.LPAREN); - this.state = 316; + this.state = 339; this.type(0); - this.state = 317; + this.state = 340; this.match(QuintParser.T__7); - this.state = 318; + this.state = 341; this.type(0); - this.state = 323; + this.state = 346; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 319; + this.state = 342; this.match(QuintParser.T__7); - this.state = 320; + this.state = 343; this.type(0); } } } - this.state = 325; + this.state = 348; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); } - this.state = 327; + this.state = 350; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 326; + this.state = 349; this.match(QuintParser.T__7); } } - this.state = 329; + this.state = 352; this.match(QuintParser.RPAREN); } break; @@ -1328,11 +1411,11 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 331; + this.state = 354; this.match(QuintParser.T__1); - this.state = 332; + this.state = 355; this.row(); - this.state = 333; + this.state = 356; this.match(QuintParser.T__2); } break; @@ -1342,7 +1425,7 @@ export class QuintParser extends Parser { _localctx = new TypeUnionRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 336; + this.state = 359; this._errHandler.sync(this); _alt = 1; do { @@ -1350,7 +1433,7 @@ export class QuintParser extends Parser { case 1: { { - this.state = 335; + this.state = 358; this.typeUnionRecOne(); } } @@ -1358,9 +1441,9 @@ export class QuintParser extends Parser { default: throw new NoViableAltException(this); } - this.state = 338; + this.state = 361; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER); } break; @@ -1370,8 +1453,8 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 340; - this.match(QuintParser.T__26); + this.state = 363; + this.match(QuintParser.T__27); } break; @@ -1380,8 +1463,8 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 341; - this.match(QuintParser.T__27); + this.state = 364; + this.match(QuintParser.T__28); } break; @@ -1390,8 +1473,8 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 342; - this.match(QuintParser.T__28); + this.state = 365; + this.match(QuintParser.T__29); } break; @@ -1400,7 +1483,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstOrVarContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 343; + this.state = 366; this.qualId(); } break; @@ -1410,19 +1493,19 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 344; + this.state = 367; this.match(QuintParser.LPAREN); - this.state = 345; + this.state = 368; this.type(0); - this.state = 346; + this.state = 369; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 358; + this.state = 381; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1430,20 +1513,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 356; + this.state = 379; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 37, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 350; + this.state = 373; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 351; - this.match(QuintParser.T__22); - this.state = 352; + this.state = 374; + this.match(QuintParser.T__23); + this.state = 375; this.type(13); } break; @@ -1452,22 +1535,22 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 353; + this.state = 376; if (!(this.precpred(this._ctx, 12))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); } - this.state = 354; - this.match(QuintParser.T__23); - this.state = 355; + this.state = 377; + this.match(QuintParser.T__24); + this.state = 378; this.type(12); } break; } } } - this.state = 360; + this.state = 383; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } } } @@ -1488,44 +1571,44 @@ export class QuintParser extends Parser { // @RuleVersion(0) public typeUnionRecOne(): TypeUnionRecOneContext { let _localctx: TypeUnionRecOneContext = new TypeUnionRecOneContext(this._ctx, this.state); - this.enterRule(_localctx, 32, QuintParser.RULE_typeUnionRecOne); + this.enterRule(_localctx, 34, QuintParser.RULE_typeUnionRecOne); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 361; - this.match(QuintParser.T__29); - this.state = 362; + this.state = 384; + this.match(QuintParser.T__10); + this.state = 385; this.match(QuintParser.T__1); - this.state = 363; + this.state = 386; this.qualId(); - this.state = 364; + this.state = 387; this.match(QuintParser.T__4); - this.state = 365; + this.state = 388; this.match(QuintParser.STRING); - this.state = 368; + this.state = 391; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 39, this._ctx) ) { case 1: { - this.state = 366; + this.state = 389; this.match(QuintParser.T__7); - this.state = 367; + this.state = 390; this.row(); } break; } - this.state = 371; + this.state = 394; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 370; + this.state = 393; this.match(QuintParser.T__7); } } - this.state = 373; + this.state = 396; this.match(QuintParser.T__2); } } @@ -1546,11 +1629,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public row(): RowContext { let _localctx: RowContext = new RowContext(this._ctx, this.state); - this.enterRule(_localctx, 34, QuintParser.RULE_row); + this.enterRule(_localctx, 36, QuintParser.RULE_row); let _la: number; try { let _alt: number; - this.state = 398; + this.state = 421; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__2: @@ -1558,57 +1641,57 @@ export class QuintParser extends Parser { case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 382; + this.state = 405; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 375; + this.state = 398; this.rowLabel(); - this.state = 376; + this.state = 399; this.match(QuintParser.T__4); - this.state = 377; + this.state = 400; this.type(0); - this.state = 378; + this.state = 401; this.match(QuintParser.T__7); } } } - this.state = 384; + this.state = 407; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); } - this.state = 394; + this.state = 417; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.IDENTIFIER) { { { - this.state = 385; + this.state = 408; this.rowLabel(); - this.state = 386; + this.state = 409; this.match(QuintParser.T__4); - this.state = 387; + this.state = 410; this.type(0); } - this.state = 392; + this.state = 415; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 39, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: { - this.state = 389; + this.state = 412; this.match(QuintParser.T__7); } break; case 2: { - this.state = 390; - this.match(QuintParser.T__29); + this.state = 413; + this.match(QuintParser.T__10); { - this.state = 391; + this.state = 414; _localctx._rowVar = this.match(QuintParser.IDENTIFIER); } } @@ -1619,13 +1702,13 @@ export class QuintParser extends Parser { } break; - case QuintParser.T__29: + case QuintParser.T__10: this.enterOuterAlt(_localctx, 2); { - this.state = 396; - this.match(QuintParser.T__29); + this.state = 419; + this.match(QuintParser.T__10); { - this.state = 397; + this.state = 420; _localctx._rowVar = this.match(QuintParser.IDENTIFIER); } } @@ -1651,11 +1734,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public rowLabel(): RowLabelContext { let _localctx: RowLabelContext = new RowLabelContext(this._ctx, this.state); - this.enterRule(_localctx, 36, QuintParser.RULE_rowLabel); + this.enterRule(_localctx, 38, QuintParser.RULE_rowLabel); try { this.enterOuterAlt(_localctx, 1); { - this.state = 400; + this.state = 423; this.simpleId("record"); } } @@ -1686,23 +1769,23 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: ExprContext = new ExprContext(this._ctx, _parentState); let _prevctx: ExprContext = _localctx; - let _startState: number = 38; - this.enterRecursionRule(_localctx, 38, QuintParser.RULE_expr, _p); + let _startState: number = 40; + this.enterRecursionRule(_localctx, 40, QuintParser.RULE_expr, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 551; + this.state = 574; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 59, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { case 1: { _localctx = new LambdaConsContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 403; + this.state = 426; this.lambda(); } break; @@ -1712,21 +1795,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 404; + this.state = 427; this.normalCallName(); - this.state = 405; + this.state = 428; this.match(QuintParser.LPAREN); - this.state = 407; + this.state = 430; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__10 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__24 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { { - this.state = 406; + this.state = 429; this.argList(); } } - this.state = 409; + this.state = 432; this.match(QuintParser.RPAREN); } break; @@ -1736,9 +1819,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 411; + this.state = 434; this.match(QuintParser.MINUS); - this.state = 412; + this.state = 435; this.expr(25); } break; @@ -1748,13 +1831,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 413; + this.state = 436; this.qualId(); - this.state = 414; + this.state = 437; this.match(QuintParser.T__31); - this.state = 415; + this.state = 438; this.match(QuintParser.ASGN); - this.state = 416; + this.state = 439; this.expr(21); } break; @@ -1764,41 +1847,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 418; + this.state = 441; this.match(QuintParser.AND); - this.state = 419; + this.state = 442; this.match(QuintParser.T__1); - this.state = 420; + this.state = 443; this.expr(0); - this.state = 425; + this.state = 448; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 421; + this.state = 444; this.match(QuintParser.T__7); - this.state = 422; + this.state = 445; this.expr(0); } } } - this.state = 427; + this.state = 450; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); } - this.state = 429; + this.state = 452; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 428; + this.state = 451; this.match(QuintParser.T__7); } } - this.state = 431; + this.state = 454; this.match(QuintParser.T__2); } break; @@ -1808,41 +1891,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 433; + this.state = 456; this.match(QuintParser.OR); - this.state = 434; + this.state = 457; this.match(QuintParser.T__1); - this.state = 435; + this.state = 458; this.expr(0); - this.state = 440; + this.state = 463; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 436; + this.state = 459; this.match(QuintParser.T__7); - this.state = 437; + this.state = 460; this.expr(0); } } } - this.state = 442; + this.state = 465; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); } - this.state = 444; + this.state = 467; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 443; + this.state = 466; this.match(QuintParser.T__7); } } - this.state = 446; + this.state = 469; this.match(QuintParser.T__2); } break; @@ -1852,41 +1935,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 448; + this.state = 471; this.match(QuintParser.T__32); - this.state = 449; + this.state = 472; this.match(QuintParser.T__1); - this.state = 450; + this.state = 473; this.expr(0); - this.state = 455; + this.state = 478; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 451; + this.state = 474; this.match(QuintParser.T__7); - this.state = 452; + this.state = 475; this.expr(0); } } } - this.state = 457; + this.state = 480; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); } - this.state = 459; + this.state = 482; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 458; + this.state = 481; this.match(QuintParser.T__7); } } - this.state = 461; + this.state = 484; this.match(QuintParser.T__2); } break; @@ -1896,41 +1979,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 463; + this.state = 486; this.match(QuintParser.T__33); - this.state = 464; + this.state = 487; this.match(QuintParser.T__1); - this.state = 465; + this.state = 488; this.expr(0); - this.state = 470; + this.state = 493; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 466; + this.state = 489; this.match(QuintParser.T__7); - this.state = 467; + this.state = 490; this.expr(0); } } } - this.state = 472; + this.state = 495; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); } - this.state = 474; + this.state = 497; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 473; + this.state = 496; this.match(QuintParser.T__7); } } - this.state = 476; + this.state = 499; this.match(QuintParser.T__2); } break; @@ -1940,30 +2023,30 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 482; + this.state = 505; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.IDENTIFIER: { - this.state = 478; + this.state = 501; this.qualId(); } break; case QuintParser.INT: { - this.state = 479; + this.state = 502; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 480; + this.state = 503; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 481; + this.state = 504; this.match(QuintParser.STRING); } break; @@ -1978,43 +2061,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 484; + this.state = 507; this.match(QuintParser.LPAREN); - this.state = 485; + this.state = 508; this.expr(0); - this.state = 486; + this.state = 509; this.match(QuintParser.T__7); - this.state = 487; + this.state = 510; this.expr(0); - this.state = 492; + this.state = 515; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 488; + this.state = 511; this.match(QuintParser.T__7); - this.state = 489; + this.state = 512; this.expr(0); } } } - this.state = 494; + this.state = 517; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 496; + this.state = 519; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 495; + this.state = 518; this.match(QuintParser.T__7); } } - this.state = 498; + this.state = 521; this.match(QuintParser.RPAREN); } break; @@ -2024,39 +2107,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 500; + this.state = 523; this.match(QuintParser.T__1); - this.state = 501; + this.state = 524; this.recElem(); - this.state = 506; + this.state = 529; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 502; + this.state = 525; this.match(QuintParser.T__7); - this.state = 503; + this.state = 526; this.recElem(); } } } - this.state = 508; + this.state = 531; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); } - this.state = 510; + this.state = 533; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 509; + this.state = 532; this.match(QuintParser.T__7); } } - this.state = 512; + this.state = 535; this.match(QuintParser.T__2); } break; @@ -2066,48 +2149,48 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 514; - this.match(QuintParser.T__24); - this.state = 523; + this.state = 537; + this.match(QuintParser.T__25); + this.state = 546; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__10 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__24 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { { - this.state = 515; + this.state = 538; this.expr(0); - this.state = 520; + this.state = 543; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 516; + this.state = 539; this.match(QuintParser.T__7); - this.state = 517; + this.state = 540; this.expr(0); } } } - this.state = 522; + this.state = 545; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); } } } - this.state = 526; + this.state = 549; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 525; + this.state = 548; this.match(QuintParser.T__7); } } - this.state = 528; - this.match(QuintParser.T__25); + this.state = 551; + this.match(QuintParser.T__26); } break; @@ -2116,19 +2199,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 529; + this.state = 552; this.match(QuintParser.T__34); - this.state = 530; + this.state = 553; this.match(QuintParser.LPAREN); - this.state = 531; + this.state = 554; this.expr(0); - this.state = 532; + this.state = 555; this.match(QuintParser.RPAREN); - this.state = 533; + this.state = 556; this.expr(0); - this.state = 534; + this.state = 557; this.match(QuintParser.T__35); - this.state = 535; + this.state = 558; this.expr(5); } break; @@ -2138,9 +2221,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 537; + this.state = 560; this.operDef(); - this.state = 538; + this.state = 561; this.expr(4); } break; @@ -2150,9 +2233,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 540; + this.state = 563; this.nondetOperDef(); - this.state = 541; + this.state = 564; this.expr(3); } break; @@ -2162,11 +2245,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 543; + this.state = 566; this.match(QuintParser.LPAREN); - this.state = 544; + this.state = 567; this.expr(0); - this.state = 545; + this.state = 568; this.match(QuintParser.RPAREN); } break; @@ -2176,19 +2259,19 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 547; + this.state = 570; this.match(QuintParser.T__1); - this.state = 548; + this.state = 571; this.expr(0); - this.state = 549; + this.state = 572; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 615; + this.state = 638; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 64, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -2196,20 +2279,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 613; + this.state = 636; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 63, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 66, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 553; + this.state = 576; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 554; + this.state = 577; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 555; + this.state = 578; this.expr(26); } break; @@ -2218,11 +2301,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 556; + this.state = 579; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 557; + this.state = 580; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (QuintParser.MUL - 53)) | (1 << (QuintParser.DIV - 53)) | (1 << (QuintParser.MOD - 53)))) !== 0))) { @@ -2235,7 +2318,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 558; + this.state = 581; this.expr(25); } break; @@ -2244,11 +2327,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 559; + this.state = 582; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 560; + this.state = 583; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2261,7 +2344,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 561; + this.state = 584; this.expr(24); } break; @@ -2270,11 +2353,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 562; + this.state = 585; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 563; + this.state = 586; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & ((1 << (QuintParser.GT - 56)) | (1 << (QuintParser.LT - 56)) | (1 << (QuintParser.GE - 56)) | (1 << (QuintParser.LE - 56)) | (1 << (QuintParser.NE - 56)) | (1 << (QuintParser.EQ - 56)))) !== 0))) { @@ -2287,7 +2370,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 564; + this.state = 587; this.expr(23); } break; @@ -2296,13 +2379,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 565; + this.state = 588; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 566; + this.state = 589; this.match(QuintParser.ASGN); - this.state = 567; + this.state = 590; this.expr(21); const m = "QNT006: unexpected '=', did you mean '=='?" @@ -2315,13 +2398,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 570; + this.state = 593; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 571; + this.state = 594; this.match(QuintParser.AND); - this.state = 572; + this.state = 595; this.expr(19); } break; @@ -2330,13 +2413,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 573; + this.state = 596; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 574; + this.state = 597; this.match(QuintParser.OR); - this.state = 575; + this.state = 598; this.expr(17); } break; @@ -2345,13 +2428,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 576; + this.state = 599; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 577; + this.state = 600; this.match(QuintParser.IFF); - this.state = 578; + this.state = 601; this.expr(16); } break; @@ -2360,13 +2443,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 579; + this.state = 602; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 580; + this.state = 603; this.match(QuintParser.IMPLIES); - this.state = 581; + this.state = 604; this.expr(15); } break; @@ -2375,13 +2458,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 582; + this.state = 605; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 583; - this.match(QuintParser.T__22); - this.state = 584; + this.state = 606; + this.match(QuintParser.T__23); + this.state = 607; this.expr(9); } break; @@ -2390,32 +2473,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 585; + this.state = 608; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 586; - this.match(QuintParser.T__18); - this.state = 587; + this.state = 609; + this.match(QuintParser.T__19); + this.state = 610; this.nameAfterDot(); - this.state = 593; + this.state = 616; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 61, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 64, this._ctx) ) { case 1: { - this.state = 588; + this.state = 611; this.match(QuintParser.LPAREN); - this.state = 590; + this.state = 613; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__10 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__24 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { { - this.state = 589; + this.state = 612; this.argList(); } } - this.state = 592; + this.state = 615; this.match(QuintParser.RPAREN); } break; @@ -2427,16 +2510,16 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 595; + this.state = 618; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 596; - this.match(QuintParser.T__24); - this.state = 597; - this.expr(0); - this.state = 598; + this.state = 619; this.match(QuintParser.T__25); + this.state = 620; + this.expr(0); + this.state = 621; + this.match(QuintParser.T__26); } break; @@ -2444,13 +2527,13 @@ export class QuintParser extends Parser { { _localctx = new MatchContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 600; + this.state = 623; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 601; + this.state = 624; this.match(QuintParser.MATCH); - this.state = 609; + this.state = 632; this._errHandler.sync(this); _alt = 1; do { @@ -2458,17 +2541,17 @@ export class QuintParser extends Parser { case 1: { { - this.state = 602; - this.match(QuintParser.T__29); - this.state = 603; + this.state = 625; + this.match(QuintParser.T__10); + this.state = 626; this.match(QuintParser.STRING); - this.state = 604; + this.state = 627; this.match(QuintParser.T__4); - this.state = 605; + this.state = 628; this.parameter(); - this.state = 606; - this.match(QuintParser.T__23); - this.state = 607; + this.state = 629; + this.match(QuintParser.T__24); + this.state = 630; this.expr(0); } } @@ -2476,18 +2559,18 @@ export class QuintParser extends Parser { default: throw new NoViableAltException(this); } - this.state = 611; + this.state = 634; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 65, this._ctx); } while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER); } break; } } } - this.state = 617; + this.state = 640; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 64, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); } } } @@ -2508,17 +2591,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public unitOrExpr(): UnitOrExprContext { let _localctx: UnitOrExprContext = new UnitOrExprContext(this._ctx, this.state); - this.enterRule(_localctx, 40, QuintParser.RULE_unitOrExpr); + this.enterRule(_localctx, 42, QuintParser.RULE_unitOrExpr); try { - this.state = 627; + this.state = 650; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 618; + this.state = 641; this.unit(); - this.state = 619; + this.state = 642; this.match(QuintParser.EOF); } break; @@ -2526,9 +2609,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 621; + this.state = 644; this.expr(0); - this.state = 622; + this.state = 645; this.match(QuintParser.EOF); } break; @@ -2536,9 +2619,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 624; + this.state = 647; this.match(QuintParser.DOCCOMMENT); - this.state = 625; + this.state = 648; this.match(QuintParser.EOF); } break; @@ -2546,7 +2629,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 626; + this.state = 649; this.match(QuintParser.EOF); } break; @@ -2569,52 +2652,52 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambda(): LambdaContext { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); - this.enterRule(_localctx, 42, QuintParser.RULE_lambda); + this.enterRule(_localctx, 44, QuintParser.RULE_lambda); let _la: number; try { - this.state = 646; + this.state = 669; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 629; + this.state = 652; this.parameter(); - this.state = 630; - this.match(QuintParser.T__23); - this.state = 631; + this.state = 653; + this.match(QuintParser.T__24); + this.state = 654; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 633; + this.state = 656; this.match(QuintParser.LPAREN); - this.state = 634; + this.state = 657; this.parameter(); - this.state = 639; + this.state = 662; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 635; + this.state = 658; this.match(QuintParser.T__7); - this.state = 636; + this.state = 659; this.parameter(); } } - this.state = 641; + this.state = 664; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 642; + this.state = 665; this.match(QuintParser.RPAREN); - this.state = 643; - this.match(QuintParser.T__23); - this.state = 644; + this.state = 666; + this.match(QuintParser.T__24); + this.state = 667; this.expr(0); } break; @@ -2639,22 +2722,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrHole(): IdentOrHoleContext { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); - this.enterRule(_localctx, 44, QuintParser.RULE_identOrHole); + this.enterRule(_localctx, 46, QuintParser.RULE_identOrHole); try { - this.state = 650; + this.state = 673; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 648; + this.state = 671; this.match(QuintParser.T__36); } break; case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 2); { - this.state = 649; + this.state = 672; this.qualId(); } break; @@ -2679,11 +2762,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public parameter(): ParameterContext { let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 46, QuintParser.RULE_parameter); + this.enterRule(_localctx, 48, QuintParser.RULE_parameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 652; + this.state = 675; this.identOrHole(); } } @@ -2704,22 +2787,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 48, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 50, QuintParser.RULE_identOrStar); try { - this.state = 656; + this.state = 679; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 654; + this.state = 677; this.match(QuintParser.MUL); } break; case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 2); { - this.state = 655; + this.state = 678; this.qualId(); } break; @@ -2744,26 +2827,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 50, QuintParser.RULE_argList); + this.enterRule(_localctx, 52, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 658; + this.state = 681; this.expr(0); - this.state = 663; + this.state = 686; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 659; + this.state = 682; this.match(QuintParser.T__7); - this.state = 660; + this.state = 683; this.expr(0); } } - this.state = 665; + this.state = 688; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -2786,28 +2869,28 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 52, QuintParser.RULE_recElem); + this.enterRule(_localctx, 54, QuintParser.RULE_recElem); try { - this.state = 672; + this.state = 695; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 666; + this.state = 689; this.simpleId("record"); - this.state = 667; + this.state = 690; this.match(QuintParser.T__4); - this.state = 668; + this.state = 691; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 670; + this.state = 693; this.match(QuintParser.T__37); - this.state = 671; + this.state = 694; this.expr(0); } break; @@ -2832,16 +2915,16 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 54, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 56, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 676; + this.state = 699; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 674; + this.state = 697; this.qualId(); } break; @@ -2854,7 +2937,7 @@ export class QuintParser extends Parser { case QuintParser.MAP: this.enterOuterAlt(_localctx, 2); { - this.state = 675; + this.state = 698; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)) | (1 << (QuintParser.MAP - 43)))) !== 0))) { @@ -2890,16 +2973,16 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 56, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 58, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 680; + this.state = 703; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 678; + this.state = 701; this.qualId(); } break; @@ -2909,7 +2992,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 679; + this.state = 702; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -2945,12 +3028,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 58, QuintParser.RULE_operator); + this.enterRule(_localctx, 60, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 682; + this.state = 705; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -2981,12 +3064,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 60, QuintParser.RULE_literal); + this.enterRule(_localctx, 62, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 684; + this.state = 707; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3017,30 +3100,30 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 62, QuintParser.RULE_qualId); + this.enterRule(_localctx, 64, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 686; + this.state = 709; this.match(QuintParser.IDENTIFIER); - this.state = 691; + this.state = 714; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 74, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 77, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 687; + this.state = 710; this.match(QuintParser.T__38); - this.state = 688; + this.state = 711; this.match(QuintParser.IDENTIFIER); } } } - this.state = 693; + this.state = 716; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 74, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 77, this._ctx); } } } @@ -3061,15 +3144,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public simpleId(context: string): SimpleIdContext { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); - this.enterRule(_localctx, 64, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 66, QuintParser.RULE_simpleId); try { - this.state = 698; + this.state = 721; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 78, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 694; + this.state = 717; this.match(QuintParser.IDENTIFIER); } break; @@ -3077,7 +3160,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 695; + this.state = 718; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3108,10 +3191,10 @@ export class QuintParser extends Parser { public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { - case 15: + case 16: return this.type_sempred(_localctx as TypeContext, predIndex); - case 19: + case 20: return this.expr_sempred(_localctx as ExprContext, predIndex); } return true; @@ -3172,377 +3255,389 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03G\u02BF\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03G\u02D6\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + "\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16\x04\x17\t\x17\x04" + "\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04" + - "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x03\x02" + - "\x06\x02F\n\x02\r\x02\x0E\x02G\x03\x02\x03\x02\x03\x03\x07\x03M\n\x03" + - "\f\x03\x0E\x03P\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03V\n\x03\f" + - "\x03\x0E\x03Y\v\x03\x03\x03\x03\x03\x03\x04\x07\x04^\n\x04\f\x04\x0E\x04" + - "a\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + - "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + - "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05y\n\x05\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x81\n\x06\f\x06\x0E\x06\x84\v" + - "\x06\x05\x06\x86\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x8B\n\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x07\x06\x98\n\x06\f\x06\x0E\x06\x9B\v\x06\x03\x06\x03\x06\x03" + - "\x06\x03\x06\x05\x06\xA1\n\x06\x03\x06\x03\x06\x05\x06\xA5\n\x06\x03\x06" + - "\x05\x06\xA8\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + - "\x07\x05\x07\xB1\n\x07\x03\b\x03\b\x03\b\x03\b\x05\b\xB7\n\b\x03\b\x03" + - "\b\x03\b\x05\b\xBC\n\b\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t" + - "\x03\t\x05\t\xC7\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xCF\n\n" + - "\x03\n\x03\n\x03\n\x03\n\x05\n\xD5\n\n\x03\n\x03\n\x05\n\xD9\n\n\x05\n" + - "\xDB\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xE6" + - "\n\v\x05\v\xE8\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03" + - "\f\x03\f\x03\f\x07\f\xF5\n\f\f\f\x0E\f\xF8\v\f\x03\f\x03\f\x03\f\x03\f" + - "\x03\f\x05\f\xFF\n\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03" + - "\f\x03\f\x03\f\x07\f\u010C\n\f\f\f\x0E\f\u010F\v\f\x03\f\x03\f\x03\f\x03" + - "\f\x03\f\x05\f\u0116\n\f\x05\f\u0118\n\f\x03\r\x03\r\x03\x0E\x03\x0E\x03" + - "\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x07" + - "\x11\u0127\n\x11\f\x11\x0E\x11\u012A\v\x11\x05\x11\u012C\n\x11\x03\x11" + - "\x05\x11\u012F\n\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03" + - "\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03" + - "\x11\x03\x11\x03\x11\x03\x11\x07\x11\u0144\n\x11\f\x11\x0E\x11\u0147\v" + - "\x11\x03\x11\x05\x11\u014A\n\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11" + - "\x03\x11\x03\x11\x06\x11\u0153\n\x11\r\x11\x0E\x11\u0154\x03\x11\x03\x11" + - "\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x05\x11\u015F\n\x11\x03" + - "\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x07\x11\u0167\n\x11\f\x11" + - "\x0E\x11\u016A\v\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x05\x12\u0173\n\x12\x03\x12\x05\x12\u0176\n\x12\x03\x12\x03\x12\x03" + - "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u017F\n\x13\f\x13\x0E\x13" + - "\u0182\v\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05" + - "\x13\u018B\n\x13\x05\x13\u018D\n\x13\x03\x13\x03\x13\x05\x13\u0191\n\x13" + - "\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u019A" + - "\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01AA\n\x15\f" + - "\x15\x0E\x15\u01AD\v\x15\x03\x15\x05\x15\u01B0\n\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B9\n\x15\f\x15\x0E\x15" + - "\u01BC\v\x15\x03\x15\x05\x15\u01BF\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x07\x15\u01C8\n\x15\f\x15\x0E\x15\u01CB\v\x15" + - "\x03\x15\x05\x15\u01CE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x07\x15\u01D7\n\x15\f\x15\x0E\x15\u01DA\v\x15\x03\x15\x05" + - "\x15\u01DD\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15" + - "\u01E5\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01ED" + - "\n\x15\f\x15\x0E\x15\u01F0\v\x15\x03\x15\x05\x15\u01F3\n\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01FB\n\x15\f\x15\x0E\x15" + - "\u01FE\v\x15\x03\x15\x05\x15\u0201\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x07\x15\u0209\n\x15\f\x15\x0E\x15\u020C\v\x15\x05\x15" + - "\u020E\n\x15\x03\x15\x05\x15\u0211\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x05\x15\u022A\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u0251\n\x15\x03\x15\x05\x15" + - "\u0254\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x06\x15\u0264\n\x15" + - "\r\x15\x0E\x15\u0265\x07\x15\u0268\n\x15\f\x15\x0E\x15\u026B\v\x15\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x05" + - "\x16\u0276\n\x16\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + - "\x03\x17\x07\x17\u0280\n\x17\f\x17\x0E\x17\u0283\v\x17\x03\x17\x03\x17" + - "\x03\x17\x03\x17\x05\x17\u0289\n\x17\x03\x18\x03\x18\x05\x18\u028D\n\x18" + - "\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u0293\n\x1A\x03\x1B\x03\x1B\x03" + - "\x1B\x07\x1B\u0298\n\x1B\f\x1B\x0E\x1B\u029B\v\x1B\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02A3\n\x1C\x03\x1D\x03\x1D\x05\x1D" + - "\u02A7\n\x1D\x03\x1E\x03\x1E\x05\x1E\u02AB\n\x1E\x03\x1F\x03\x1F\x03 " + - "\x03 \x03!\x03!\x03!\x07!\u02B4\n!\f!\x0E!\u02B7\v!\x03\"\x03\"\x03\"" + - "\x03\"\x05\"\u02BD\n\"\x03\"\x02\x02\x04 (#\x02\x02\x04\x02\x06\x02\b" + - "\x02\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02" + - "\x1C\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x02" + - "6\x028\x02:\x02<\x02>\x02@\x02B\x02\x02\t\x03\x0279\x03\x0256\x03\x02" + - ":?\x03\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*,\x02\u031E\x02E\x03\x02" + - "\x02\x02\x04N\x03\x02\x02\x02\x06_\x03\x02\x02\x02\bx\x03\x02\x02\x02" + - "\nz\x03\x02\x02\x02\f\xB0\x03\x02\x02\x02\x0E\xB2\x03\x02\x02\x02\x10" + - "\xC6\x03\x02\x02\x02\x12\xDA\x03\x02\x02\x02\x14\xE7\x03\x02\x02\x02\x16" + - "\u0117\x03\x02\x02\x02\x18\u0119\x03\x02\x02\x02\x1A\u011B\x03\x02\x02" + - "\x02\x1C\u011D\x03\x02\x02\x02\x1E\u011F\x03\x02\x02\x02 \u015E\x03\x02" + - "\x02\x02\"\u016B\x03\x02\x02\x02$\u0190\x03\x02\x02\x02&\u0192\x03\x02" + - "\x02\x02(\u0229\x03\x02\x02\x02*\u0275\x03\x02\x02\x02,\u0288\x03\x02" + - "\x02\x02.\u028C\x03\x02\x02\x020\u028E\x03\x02\x02\x022\u0292\x03\x02" + - "\x02\x024\u0294\x03\x02\x02\x026\u02A2\x03\x02\x02\x028\u02A6\x03\x02" + - "\x02\x02:\u02AA\x03\x02\x02\x02<\u02AC\x03\x02\x02\x02>\u02AE\x03\x02" + - "\x02\x02@\u02B0\x03\x02\x02\x02B\u02BC\x03\x02\x02\x02DF\x05\x04\x03\x02" + - "ED\x03\x02\x02\x02FG\x03\x02\x02\x02GE\x03\x02\x02\x02GH\x03\x02\x02\x02" + - "HI\x03\x02\x02\x02IJ\x07\x02\x02\x03J\x03\x03\x02\x02\x02KM\x07D\x02\x02" + - "LK\x03\x02\x02\x02MP\x03\x02\x02\x02NL\x03\x02\x02\x02NO\x03\x02\x02\x02" + - "OQ\x03\x02\x02\x02PN\x03\x02\x02\x02QR\x07\x03\x02\x02RS\x05@!\x02SW\x07" + - "\x04\x02\x02TV\x05\x06\x04\x02UT\x03\x02\x02\x02VY\x03\x02\x02\x02WU\x03" + - "\x02\x02\x02WX\x03\x02\x02\x02XZ\x03\x02\x02\x02YW\x03\x02\x02\x02Z[\x07" + - "\x05\x02\x02[\x05\x03\x02\x02\x02\\^\x07D\x02\x02]\\\x03\x02\x02\x02^" + - "a\x03\x02\x02\x02_]\x03\x02\x02\x02_`\x03\x02\x02\x02`b\x03\x02\x02\x02" + - "a_\x03\x02\x02\x02bc\x05\b\x05\x02c\x07\x03\x02\x02\x02de\x07\x06\x02" + - "\x02ef\x05@!\x02fg\x07\x07\x02\x02gh\x05 \x11\x02hy\x03\x02\x02\x02ij" + - "\x07\b\x02\x02jk\x05@!\x02kl\x07\x07\x02\x02lm\x05 \x11\x02my\x03\x02" + - "\x02\x02no\x07\t\x02\x02op\x05.\x18\x02pq\x07@\x02\x02qr\x05(\x15\x02" + - "ry\x03\x02\x02\x02sy\x05\x16\f\x02ty\x05\n\x06\x02uy\x05\f\x07\x02vy\x05" + - "\x12\n\x02wy\x05\x14\v\x02xd\x03\x02\x02\x02xi\x03\x02\x02\x02xn\x03\x02" + - "\x02\x02xs\x03\x02\x02\x02xt\x03\x02\x02\x02xu\x03\x02\x02\x02xv\x03\x02" + - "\x02\x02xw\x03\x02\x02\x02y\t\x03\x02\x02\x02z{\x05\x10\t\x02{\xA0\x05" + - "8\x1D\x02|\x85\x07A\x02\x02}\x82\x050\x19\x02~\x7F\x07\n\x02\x02\x7F\x81" + - "\x050\x19\x02\x80~\x03\x02\x02\x02\x81\x84\x03\x02\x02\x02\x82\x80\x03" + - "\x02\x02\x02\x82\x83\x03\x02\x02\x02\x83\x86\x03\x02\x02\x02\x84\x82\x03" + - "\x02\x02\x02\x85}\x03\x02\x02\x02\x85\x86\x03\x02\x02\x02\x86\x87\x03" + - "\x02\x02\x02\x87\x8A\x07B\x02\x02\x88\x89\x07\x07\x02\x02\x89\x8B\x05" + - " \x11\x02\x8A\x88\x03\x02\x02\x02\x8A\x8B\x03\x02\x02\x02\x8B\xA1\x03" + - "\x02\x02\x02\x8C\x8D\x07\x07\x02\x02\x8D\xA1\x05 \x11\x02\x8E\x8F\x07" + - "A\x02\x02\x8F\x90\x050\x19\x02\x90\x91\x07\x07\x02\x02\x91\x99\x05 \x11" + - "\x02\x92\x93\x07\n\x02\x02\x93\x94\x050\x19\x02\x94\x95\x07\x07\x02\x02" + - "\x95\x96\x05 \x11\x02\x96\x98\x03\x02\x02\x02\x97\x92\x03\x02\x02\x02" + - "\x98\x9B\x03\x02\x02\x02\x99\x97\x03\x02\x02\x02\x99\x9A\x03\x02\x02\x02" + - "\x9A\x9C\x03\x02\x02\x02\x9B\x99\x03\x02\x02\x02\x9C\x9D\x07B\x02\x02" + - "\x9D\x9E\x07\x07\x02\x02\x9E\x9F\x05 \x11\x02\x9F\xA1\x03\x02\x02\x02" + - "\xA0|\x03\x02\x02\x02\xA0\x8C\x03\x02\x02\x02\xA0\x8E\x03\x02\x02\x02" + - "\xA0\xA1\x03\x02\x02\x02\xA1\xA4\x03\x02\x02\x02\xA2\xA3\x07@\x02\x02" + - "\xA3\xA5\x05(\x15\x02\xA4\xA2\x03\x02\x02\x02\xA4\xA5\x03\x02\x02\x02" + - "\xA5\xA7\x03\x02\x02\x02\xA6\xA8\x07\v\x02\x02\xA7\xA6\x03\x02\x02\x02" + - "\xA7\xA8\x03\x02\x02\x02\xA8\v\x03\x02\x02\x02\xA9\xAA\x07\f\x02\x02\xAA" + - "\xB1\x05@!\x02\xAB\xAC\x07\f\x02\x02\xAC\xAD\x05@!\x02\xAD\xAE\x07@\x02" + - "\x02\xAE\xAF\x05 \x11\x02\xAF\xB1\x03\x02\x02\x02\xB0\xA9\x03\x02\x02" + - "\x02\xB0\xAB\x03\x02\x02\x02\xB1\r\x03\x02\x02\x02\xB2\xB3\x07\r\x02\x02" + - "\xB3\xB6\x05@!\x02\xB4\xB5\x07\x07\x02\x02\xB5\xB7\x05 \x11\x02\xB6\xB4" + - "\x03\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB8\x03\x02\x02\x02\xB8\xB9" + - "\x07@\x02\x02\xB9\xBB\x05(\x15\x02\xBA\xBC\x07\v\x02\x02\xBB\xBA\x03\x02" + - "\x02\x02\xBB\xBC\x03\x02\x02\x02\xBC\x0F\x03\x02\x02\x02\xBD\xC7\x07\x0E" + - "\x02\x02\xBE\xC7\x07\x0F\x02\x02\xBF\xC0\x07\x10\x02\x02\xC0\xC7\x07\x0E" + - "\x02\x02\xC1\xC2\x07\x10\x02\x02\xC2\xC7\x07\x0F\x02\x02\xC3\xC7\x07\x11" + - "\x02\x02\xC4\xC7\x07\x12\x02\x02\xC5\xC7\x07\x13\x02\x02\xC6\xBD\x03\x02" + - "\x02\x02\xC6\xBE\x03\x02\x02\x02\xC6\xBF\x03\x02\x02\x02\xC6\xC1\x03\x02" + - "\x02\x02\xC6\xC3\x03\x02\x02\x02\xC6\xC4\x03\x02\x02\x02\xC6\xC5\x03\x02" + - "\x02\x02\xC7\x11\x03\x02\x02\x02\xC8\xC9\x07\x14\x02\x02\xC9\xCA\x05\x1A" + - "\x0E\x02\xCA\xCB\x07\x15\x02\x02\xCB\xCE\x052\x1A\x02\xCC\xCD\x07\x16" + - "\x02\x02\xCD\xCF\x05\x1E\x10\x02\xCE\xCC\x03\x02\x02\x02\xCE\xCF\x03\x02" + - "\x02\x02\xCF\xDB\x03\x02\x02\x02\xD0\xD1\x07\x14\x02\x02\xD1\xD4\x05\x1A" + - "\x0E\x02\xD2\xD3\x07\x17\x02\x02\xD3\xD5\x05\x1A\x0E\x02\xD4\xD2\x03\x02" + - "\x02\x02\xD4\xD5\x03\x02\x02\x02\xD5\xD8\x03\x02\x02\x02\xD6\xD7\x07\x16" + - "\x02\x02\xD7\xD9\x05\x1E\x10\x02\xD8\xD6\x03\x02\x02\x02\xD8\xD9\x03\x02" + - "\x02\x02\xD9\xDB\x03\x02\x02\x02\xDA\xC8\x03\x02\x02\x02\xDA\xD0\x03\x02" + - "\x02\x02\xDB\x13\x03\x02\x02\x02\xDC\xDD\x07\x18\x02\x02\xDD\xDE\x05\x1A" + - "\x0E\x02\xDE\xDF\x07\x15\x02\x02\xDF\xE0\x052\x1A\x02\xE0\xE8\x03\x02" + - "\x02\x02\xE1\xE2\x07\x18\x02\x02\xE2\xE5\x05\x1A\x0E\x02\xE3\xE4\x07\x17" + - "\x02\x02\xE4\xE6\x05\x1A\x0E\x02\xE5\xE3\x03\x02\x02\x02\xE5\xE6\x03\x02" + - "\x02\x02\xE6\xE8\x03\x02\x02\x02\xE7\xDC\x03\x02\x02\x02\xE7\xE1\x03\x02" + - "\x02\x02\xE8\x15\x03\x02\x02\x02\xE9\xEA\x07\x14\x02\x02\xEA\xEB\x05\x18" + - "\r\x02\xEB\xEC\x07A\x02\x02\xEC\xED\x05\x1A\x0E\x02\xED\xEE\x07@\x02\x02" + - "\xEE\xF6\x05(\x15\x02\xEF\xF0\x07\n\x02\x02\xF0\xF1\x05\x1A\x0E\x02\xF1" + - "\xF2\x07@\x02\x02\xF2\xF3\x05(\x15\x02\xF3\xF5\x03\x02\x02\x02\xF4\xEF" + - "\x03\x02\x02\x02\xF5\xF8\x03\x02\x02\x02\xF6\xF4\x03\x02\x02\x02\xF6\xF7" + - "\x03\x02\x02\x02\xF7\xF9\x03\x02\x02\x02\xF8\xF6\x03\x02\x02\x02\xF9\xFA" + - "\x07B\x02\x02\xFA\xFB\x07\x15\x02\x02\xFB\xFE\x077\x02\x02\xFC\xFD\x07" + - "\x16\x02\x02\xFD\xFF\x05\x1E\x10\x02\xFE\xFC\x03\x02\x02\x02\xFE\xFF\x03" + - "\x02\x02\x02\xFF\u0118\x03\x02\x02\x02\u0100\u0101\x07\x14\x02\x02\u0101" + - "\u0102\x05\x18\r\x02\u0102\u0103\x07A\x02\x02\u0103\u0104\x05\x1A\x0E" + - "\x02\u0104\u0105\x07@\x02\x02\u0105\u010D\x05(\x15\x02\u0106\u0107\x07" + - "\n\x02\x02\u0107\u0108\x05\x1A\x0E\x02\u0108\u0109\x07@\x02\x02\u0109" + - "\u010A\x05(\x15\x02\u010A\u010C\x03\x02\x02\x02\u010B\u0106\x03\x02\x02" + + "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + + "\t#\x03\x02\x06\x02H\n\x02\r\x02\x0E\x02I\x03\x02\x03\x02\x03\x03\x07" + + "\x03O\n\x03\f\x03\x0E\x03R\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03" + + "X\n\x03\f\x03\x0E\x03[\v\x03\x03\x03\x03\x03\x03\x04\x07\x04`\n\x04\f" + + "\x04\x0E\x04c\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05{\n\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x83\n\x06\f\x06\x0E" + + "\x06\x86\v\x06\x05\x06\x88\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x8D\n" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x06\x03\x06\x07\x06\x9A\n\x06\f\x06\x0E\x06\x9D\v\x06\x03\x06" + + "\x03\x06\x03\x06\x03\x06\x05\x06\xA3\n\x06\x03\x06\x03\x06\x05\x06\xA7" + + "\n\x06\x03\x06\x05\x06\xAA\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + + "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xB7\n\x07\x03" + + "\x07\x03\x07\x03\x07\x07\x07\xBC\n\x07\f\x07\x0E\x07\xBF\v\x07\x05\x07" + + "\xC1\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x05\b\xC8\n\b\x03\t\x03\t\x03" + + "\t\x03\t\x05\t\xCE\n\t\x03\t\x03\t\x03\t\x05\t\xD3\n\t\x03\n\x03\n\x03" + + "\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xDE\n\n\x03\v\x03\v\x03\v" + + "\x03\v\x03\v\x03\v\x05\v\xE6\n\v\x03\v\x03\v\x03\v\x03\v\x05\v\xEC\n\v" + + "\x03\v\x03\v\x05\v\xF0\n\v\x05\v\xF2\n\v\x03\f\x03\f\x03\f\x03\f\x03\f" + + "\x03\f\x03\f\x03\f\x03\f\x05\f\xFD\n\f\x05\f\xFF\n\f\x03\r\x03\r\x03\r" + + "\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x07\r\u010C\n\r\f\r\x0E" + + "\r\u010F\v\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0116\n\r\x03\r\x03\r" + + "\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x07\r\u0123\n\r" + + "\f\r\x0E\r\u0126\v\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u012D\n\r\x05" + + "\r\u012F\n\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03" + + "\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u013E\n\x12\f\x12" + + "\x0E\x12\u0141\v\x12\x05\x12\u0143\n\x12\x03\x12\x05\x12\u0146\n\x12\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x07\x12\u015B\n\x12\f\x12\x0E\x12\u015E\v\x12\x03\x12\x05\x12\u0161" + + "\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x06\x12" + + "\u016A\n\x12\r\x12\x0E\x12\u016B\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + + "\x03\x12\x03\x12\x03\x12\x05\x12\u0176\n\x12\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x03\x12\x03\x12\x07\x12\u017E\n\x12\f\x12\x0E\x12\u0181\v\x12\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13\u018A\n\x13" + + "\x03\x13\x05\x13\u018D\n\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x07\x14\u0196\n\x14\f\x14\x0E\x14\u0199\v\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u01A2\n\x14\x05\x14" + + "\u01A4\n\x14\x03\x14\x03\x14\x05\x14\u01A8\n\x14\x03\x15\x03\x15\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01B1\n\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x07\x16\u01C1\n\x16\f\x16\x0E\x16\u01C4\v\x16\x03" + + "\x16\x05\x16\u01C7\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x07\x16\u01D0\n\x16\f\x16\x0E\x16\u01D3\v\x16\x03\x16\x05\x16" + + "\u01D6\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07" + + "\x16\u01DF\n\x16\f\x16\x0E\x16\u01E2\v\x16\x03\x16\x05\x16\u01E5\n\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01EE" + + "\n\x16\f\x16\x0E\x16\u01F1\v\x16\x03\x16\x05\x16\u01F4\n\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01FC\n\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0204\n\x16\f\x16\x0E\x16\u0207" + + "\v\x16\x03\x16\x05\x16\u020A\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x07\x16\u0212\n\x16\f\x16\x0E\x16\u0215\v\x16\x03\x16\x05" + + "\x16\u0218\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16" + + "\u0220\n\x16\f\x16\x0E\x16\u0223\v\x16\x05\x16\u0225\n\x16\x03\x16\x05" + + "\x16\u0228\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u0241" + + "\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x05\x16\u0268\n\x16\x03\x16\x05\x16\u026B\n\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x06\x16\u027B\n\x16\r\x16\x0E\x16\u027C" + + "\x07\x16\u027F\n\x16\f\x16\x0E\x16\u0282\v\x16\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x05\x17\u028D\n\x17\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0297" + + "\n\x18\f\x18\x0E\x18\u029A\v\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + + "\u02A0\n\x18\x03\x19\x03\x19\x05\x19\u02A4\n\x19\x03\x1A\x03\x1A\x03\x1B" + + "\x03\x1B\x05\x1B\u02AA\n\x1B\x03\x1C\x03\x1C\x03\x1C\x07\x1C\u02AF\n\x1C" + + "\f\x1C\x0E\x1C\u02B2\v\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03" + + "\x1D\x05\x1D\u02BA\n\x1D\x03\x1E\x03\x1E\x05\x1E\u02BE\n\x1E\x03\x1F\x03" + + "\x1F\x05\x1F\u02C2\n\x1F\x03 \x03 \x03!\x03!\x03\"\x03\"\x03\"\x07\"\u02CB" + + "\n\"\f\"\x0E\"\u02CE\v\"\x03#\x03#\x03#\x03#\x05#\u02D4\n#\x03#\x02\x02" + + "\x04\"*$\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12" + + "\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&" + + "\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02" + + "B\x02D\x02\x02\t\x03\x0279\x03\x0256\x03\x02:?\x03\x02-3\x03\x02-0\x05" + + "\x02!!-05?\x03\x02*,\x02\u0338\x02G\x03\x02\x02\x02\x04P\x03\x02\x02\x02" + + "\x06a\x03\x02\x02\x02\bz\x03\x02\x02\x02\n|\x03\x02\x02\x02\f\xC0\x03" + + "\x02\x02\x02\x0E\xC2\x03\x02\x02\x02\x10\xC9\x03\x02\x02\x02\x12\xDD\x03" + + "\x02\x02\x02\x14\xF1\x03\x02\x02\x02\x16\xFE\x03\x02\x02\x02\x18\u012E" + + "\x03\x02\x02\x02\x1A\u0130\x03\x02\x02\x02\x1C\u0132\x03\x02\x02\x02\x1E" + + "\u0134\x03\x02\x02\x02 \u0136\x03\x02\x02\x02\"\u0175\x03\x02\x02\x02" + + "$\u0182\x03\x02\x02\x02&\u01A7\x03\x02\x02\x02(\u01A9\x03\x02\x02\x02" + + "*\u0240\x03\x02\x02\x02,\u028C\x03\x02\x02\x02.\u029F\x03\x02\x02\x02" + + "0\u02A3\x03\x02\x02\x022\u02A5\x03\x02\x02\x024\u02A9\x03\x02\x02\x02" + + "6\u02AB\x03\x02\x02\x028\u02B9\x03\x02\x02\x02:\u02BD\x03\x02\x02\x02" + + "<\u02C1\x03\x02\x02\x02>\u02C3\x03\x02\x02\x02@\u02C5\x03\x02\x02\x02" + + "B\u02C7\x03\x02\x02\x02D\u02D3\x03\x02\x02\x02FH\x05\x04\x03\x02GF\x03" + + "\x02\x02\x02HI\x03\x02\x02\x02IG\x03\x02\x02\x02IJ\x03\x02\x02\x02JK\x03" + + "\x02\x02\x02KL\x07\x02\x02\x03L\x03\x03\x02\x02\x02MO\x07D\x02\x02NM\x03" + + "\x02\x02\x02OR\x03\x02\x02\x02PN\x03\x02\x02\x02PQ\x03\x02\x02\x02QS\x03" + + "\x02\x02\x02RP\x03\x02\x02\x02ST\x07\x03\x02\x02TU\x05B\"\x02UY\x07\x04" + + "\x02\x02VX\x05\x06\x04\x02WV\x03\x02\x02\x02X[\x03\x02\x02\x02YW\x03\x02" + + "\x02\x02YZ\x03\x02\x02\x02Z\\\x03\x02\x02\x02[Y\x03\x02\x02\x02\\]\x07" + + "\x05\x02\x02]\x05\x03\x02\x02\x02^`\x07D\x02\x02_^\x03\x02\x02\x02`c\x03" + + "\x02\x02\x02a_\x03\x02\x02\x02ab\x03\x02\x02\x02bd\x03\x02\x02\x02ca\x03" + + "\x02\x02\x02de\x05\b\x05\x02e\x07\x03\x02\x02\x02fg\x07\x06\x02\x02gh" + + "\x05B\"\x02hi\x07\x07\x02\x02ij\x05\"\x12\x02j{\x03\x02\x02\x02kl\x07" + + "\b\x02\x02lm\x05B\"\x02mn\x07\x07\x02\x02no\x05\"\x12\x02o{\x03\x02\x02" + + "\x02pq\x07\t\x02\x02qr\x050\x19\x02rs\x07@\x02\x02st\x05*\x16\x02t{\x03" + + "\x02\x02\x02u{\x05\x18\r\x02v{\x05\n\x06\x02w{\x05\f\x07\x02x{\x05\x14" + + "\v\x02y{\x05\x16\f\x02zf\x03\x02\x02\x02zk\x03\x02\x02\x02zp\x03\x02\x02" + + "\x02zu\x03\x02\x02\x02zv\x03\x02\x02\x02zw\x03\x02\x02\x02zx\x03\x02\x02" + + "\x02zy\x03\x02\x02\x02{\t\x03\x02\x02\x02|}\x05\x12\n\x02}\xA2\x05:\x1E" + + "\x02~\x87\x07A\x02\x02\x7F\x84\x052\x1A\x02\x80\x81\x07\n\x02\x02\x81" + + "\x83\x052\x1A\x02\x82\x80\x03\x02\x02\x02\x83\x86\x03\x02\x02\x02\x84" + + "\x82\x03\x02\x02\x02\x84\x85\x03\x02\x02\x02\x85\x88\x03\x02\x02\x02\x86" + + "\x84\x03\x02\x02\x02\x87\x7F\x03\x02\x02\x02\x87\x88\x03\x02\x02\x02\x88" + + "\x89\x03\x02\x02\x02\x89\x8C\x07B\x02\x02\x8A\x8B\x07\x07\x02\x02\x8B" + + "\x8D\x05\"\x12\x02\x8C\x8A\x03\x02\x02\x02\x8C\x8D\x03\x02\x02\x02\x8D" + + "\xA3\x03\x02\x02\x02\x8E\x8F\x07\x07\x02\x02\x8F\xA3\x05\"\x12\x02\x90" + + "\x91\x07A\x02\x02\x91\x92\x052\x1A\x02\x92\x93\x07\x07\x02\x02\x93\x9B" + + "\x05\"\x12\x02\x94\x95\x07\n\x02\x02\x95\x96\x052\x1A\x02\x96\x97\x07" + + "\x07\x02\x02\x97\x98\x05\"\x12\x02\x98\x9A\x03\x02\x02\x02\x99\x94\x03" + + "\x02\x02\x02\x9A\x9D\x03\x02\x02\x02\x9B\x99\x03\x02\x02\x02\x9B\x9C\x03" + + "\x02\x02\x02\x9C\x9E\x03\x02\x02\x02\x9D\x9B\x03\x02\x02\x02\x9E\x9F\x07" + + "B\x02\x02\x9F\xA0\x07\x07\x02\x02\xA0\xA1\x05\"\x12\x02\xA1\xA3\x03\x02" + + "\x02\x02\xA2~\x03\x02\x02\x02\xA2\x8E\x03\x02\x02\x02\xA2\x90\x03\x02" + + "\x02\x02\xA2\xA3\x03\x02\x02\x02\xA3\xA6\x03\x02\x02\x02\xA4\xA5\x07@" + + "\x02\x02\xA5\xA7\x05*\x16\x02\xA6\xA4\x03\x02\x02\x02\xA6\xA7\x03\x02" + + "\x02\x02\xA7\xA9\x03\x02\x02\x02\xA8\xAA\x07\v\x02\x02\xA9\xA8\x03\x02" + + "\x02\x02\xA9\xAA\x03\x02\x02\x02\xAA\v\x03\x02\x02\x02\xAB\xAC\x07\f\x02" + + "\x02\xAC\xC1\x05B\"\x02\xAD\xAE\x07\f\x02\x02\xAE\xAF\x05B\"\x02\xAF\xB0" + + "\x07@\x02\x02\xB0\xB1\x05\"\x12\x02\xB1\xC1\x03\x02\x02\x02\xB2\xB3\x07" + + "\f\x02\x02\xB3\xB4\x05B\"\x02\xB4\xB6\x07@\x02\x02\xB5\xB7\x07\r\x02\x02" + + "\xB6\xB5\x03\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB8\x03\x02\x02\x02" + + "\xB8\xBD\x05\x0E\b\x02\xB9\xBA\x07\r\x02\x02\xBA\xBC\x05\x0E\b\x02\xBB" + + "\xB9\x03\x02\x02\x02\xBC\xBF\x03\x02\x02\x02\xBD\xBB\x03\x02\x02\x02\xBD" + + "\xBE\x03\x02\x02\x02\xBE\xC1\x03\x02\x02\x02\xBF\xBD\x03\x02\x02\x02\xC0" + + "\xAB\x03\x02\x02\x02\xC0\xAD\x03\x02\x02\x02\xC0\xB2\x03\x02\x02\x02\xC1" + + "\r\x03\x02\x02\x02\xC2\xC7\x05D#\x02\xC3\xC4\x07A\x02\x02\xC4\xC5\x05" + + "\"\x12\x02\xC5\xC6\x07B\x02\x02\xC6\xC8\x03\x02\x02\x02\xC7\xC3\x03\x02" + + "\x02\x02\xC7\xC8\x03\x02\x02\x02\xC8\x0F\x03\x02\x02\x02\xC9\xCA\x07\x0E" + + "\x02\x02\xCA\xCD\x05B\"\x02\xCB\xCC\x07\x07\x02\x02\xCC\xCE\x05\"\x12" + + "\x02\xCD\xCB\x03\x02\x02\x02\xCD\xCE\x03\x02\x02\x02\xCE\xCF\x03\x02\x02" + + "\x02\xCF\xD0\x07@\x02\x02\xD0\xD2\x05*\x16\x02\xD1\xD3\x07\v\x02\x02\xD2" + + "\xD1\x03\x02\x02\x02\xD2\xD3\x03\x02\x02\x02\xD3\x11\x03\x02\x02\x02\xD4" + + "\xDE\x07\x0F\x02\x02\xD5\xDE\x07\x10\x02\x02\xD6\xD7\x07\x11\x02\x02\xD7" + + "\xDE\x07\x0F\x02\x02\xD8\xD9\x07\x11\x02\x02\xD9\xDE\x07\x10\x02\x02\xDA" + + "\xDE\x07\x12\x02\x02\xDB\xDE\x07\x13\x02\x02\xDC\xDE\x07\x14\x02\x02\xDD" + + "\xD4\x03\x02\x02\x02\xDD\xD5\x03\x02\x02\x02\xDD\xD6\x03\x02\x02\x02\xDD" + + "\xD8\x03\x02\x02\x02\xDD\xDA\x03\x02\x02\x02\xDD\xDB\x03\x02\x02\x02\xDD" + + "\xDC\x03\x02\x02\x02\xDE\x13\x03\x02\x02\x02\xDF\xE0\x07\x15\x02\x02\xE0" + + "\xE1\x05\x1C\x0F\x02\xE1\xE2\x07\x16\x02\x02\xE2\xE5\x054\x1B\x02\xE3" + + "\xE4\x07\x17\x02\x02\xE4\xE6\x05 \x11\x02\xE5\xE3\x03\x02\x02\x02\xE5" + + "\xE6\x03\x02\x02\x02\xE6\xF2\x03\x02\x02\x02\xE7\xE8\x07\x15\x02\x02\xE8" + + "\xEB\x05\x1C\x0F\x02\xE9\xEA\x07\x18\x02\x02\xEA\xEC\x05\x1C\x0F\x02\xEB" + + "\xE9\x03\x02\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\xEF\x03\x02\x02\x02\xED" + + "\xEE\x07\x17\x02\x02\xEE\xF0\x05 \x11\x02\xEF\xED\x03\x02\x02\x02\xEF" + + "\xF0\x03\x02\x02\x02\xF0\xF2\x03\x02\x02\x02\xF1\xDF\x03\x02\x02\x02\xF1" + + "\xE7\x03\x02\x02\x02\xF2\x15\x03\x02\x02\x02\xF3\xF4\x07\x19\x02\x02\xF4" + + "\xF5\x05\x1C\x0F\x02\xF5\xF6\x07\x16\x02\x02\xF6\xF7\x054\x1B\x02\xF7" + + "\xFF\x03\x02\x02\x02\xF8\xF9\x07\x19\x02\x02\xF9\xFC\x05\x1C\x0F\x02\xFA" + + "\xFB\x07\x18\x02\x02\xFB\xFD\x05\x1C\x0F\x02\xFC\xFA\x03\x02\x02\x02\xFC" + + "\xFD\x03\x02\x02\x02\xFD\xFF\x03\x02\x02\x02\xFE\xF3\x03\x02\x02\x02\xFE" + + "\xF8\x03\x02\x02\x02\xFF\x17\x03\x02\x02\x02\u0100\u0101\x07\x15\x02\x02" + + "\u0101\u0102\x05\x1A\x0E\x02\u0102\u0103\x07A\x02\x02\u0103\u0104\x05" + + "\x1C\x0F\x02\u0104\u0105\x07@\x02\x02\u0105\u010D\x05*\x16\x02\u0106\u0107" + + "\x07\n\x02\x02\u0107\u0108\x05\x1C\x0F\x02\u0108\u0109\x07@\x02\x02\u0109" + + "\u010A\x05*\x16\x02\u010A\u010C\x03\x02\x02\x02\u010B\u0106\x03\x02\x02" + "\x02\u010C\u010F\x03\x02\x02\x02\u010D\u010B\x03\x02\x02\x02\u010D\u010E" + "\x03\x02\x02\x02\u010E\u0110\x03\x02\x02\x02\u010F\u010D\x03\x02\x02\x02" + - "\u0110\u0111\x07B\x02\x02\u0111\u0112\x07\x17\x02\x02\u0112\u0115\x05" + - "\x1C\x0F\x02\u0113\u0114\x07\x16\x02\x02\u0114\u0116\x05\x1E\x10\x02\u0115" + - "\u0113\x03\x02\x02\x02\u0115\u0116\x03\x02\x02\x02\u0116\u0118\x03\x02" + - "\x02\x02\u0117\xE9\x03\x02\x02\x02\u0117\u0100\x03\x02\x02\x02\u0118\x17" + - "\x03\x02\x02\x02\u0119\u011A\x05@!\x02\u011A\x19\x03\x02\x02\x02\u011B" + - "\u011C\x05@!\x02\u011C\x1B\x03\x02\x02\x02\u011D\u011E\x05@!\x02\u011E" + - "\x1D\x03\x02\x02\x02\u011F\u0120\x07*\x02\x02\u0120\x1F\x03\x02\x02\x02" + - "\u0121\u0122\b\x11\x01\x02\u0122\u012B\x07A\x02\x02\u0123\u0128\x05 \x11" + - "\x02\u0124\u0125\x07\n\x02\x02\u0125\u0127\x05 \x11\x02\u0126\u0124\x03" + - "\x02\x02\x02\u0127\u012A\x03\x02\x02\x02\u0128\u0126\x03\x02\x02\x02\u0128" + - "\u0129\x03\x02\x02\x02\u0129\u012C\x03\x02\x02\x02\u012A\u0128\x03\x02" + - "\x02\x02\u012B\u0123\x03\x02\x02\x02\u012B\u012C\x03\x02\x02\x02\u012C" + - "\u012E\x03\x02\x02\x02\u012D\u012F\x07\n\x02\x02\u012E\u012D\x03\x02\x02" + - "\x02\u012E\u012F\x03\x02\x02\x02\u012F\u0130\x03\x02\x02\x02\u0130\u0131" + - "\x07B\x02\x02\u0131\u0132\x07\x1A\x02\x02\u0132\u015F\x05 \x11\r\u0133" + - "\u0134\x071\x02\x02\u0134\u0135\x07\x1B\x02\x02\u0135\u0136\x05 \x11\x02" + - "\u0136\u0137\x07\x1C\x02\x02\u0137\u015F\x03\x02\x02\x02\u0138\u0139\x07" + - "2\x02\x02\u0139\u013A\x07\x1B\x02\x02\u013A\u013B\x05 \x11\x02\u013B\u013C" + - "\x07\x1C\x02\x02\u013C\u015F\x03\x02\x02\x02\u013D\u013E\x07A\x02\x02" + - "\u013E\u013F\x05 \x11\x02\u013F\u0140\x07\n\x02\x02\u0140\u0145\x05 \x11" + - "\x02\u0141\u0142\x07\n\x02\x02\u0142\u0144\x05 \x11\x02\u0143\u0141\x03" + - "\x02\x02\x02\u0144\u0147\x03\x02\x02\x02\u0145\u0143\x03\x02\x02\x02\u0145" + - "\u0146\x03\x02\x02\x02\u0146\u0149\x03\x02\x02\x02\u0147\u0145\x03\x02" + - "\x02\x02\u0148\u014A\x07\n\x02\x02\u0149\u0148\x03\x02\x02\x02\u0149\u014A" + - "\x03\x02\x02\x02\u014A\u014B\x03\x02\x02\x02\u014B\u014C\x07B\x02\x02" + - "\u014C\u015F\x03\x02\x02\x02\u014D\u014E\x07\x04\x02\x02\u014E\u014F\x05" + - "$\x13\x02\u014F\u0150\x07\x05\x02\x02\u0150\u015F\x03\x02\x02\x02\u0151" + - "\u0153\x05\"\x12\x02\u0152\u0151\x03\x02\x02\x02\u0153\u0154\x03\x02\x02" + - "\x02\u0154\u0152\x03\x02\x02\x02\u0154\u0155\x03\x02\x02\x02\u0155\u015F" + - "\x03\x02\x02\x02\u0156\u015F\x07\x1D\x02\x02\u0157\u015F\x07\x1E\x02\x02" + - "\u0158\u015F\x07\x1F\x02\x02\u0159\u015F\x05@!\x02\u015A\u015B\x07A\x02" + - "\x02\u015B\u015C\x05 \x11\x02\u015C\u015D\x07B\x02\x02\u015D\u015F\x03" + - "\x02\x02\x02\u015E\u0121\x03\x02\x02\x02\u015E\u0133\x03\x02\x02\x02\u015E" + - "\u0138\x03\x02\x02\x02\u015E\u013D\x03\x02\x02\x02\u015E\u014D\x03\x02" + - "\x02\x02\u015E\u0152\x03\x02\x02\x02\u015E\u0156\x03\x02\x02\x02\u015E" + - "\u0157\x03\x02\x02\x02\u015E\u0158\x03\x02\x02\x02\u015E\u0159\x03\x02" + - "\x02\x02\u015E\u015A\x03\x02\x02\x02\u015F\u0168\x03\x02\x02\x02\u0160" + - "\u0161\f\x0F\x02\x02\u0161\u0162\x07\x19\x02\x02\u0162\u0167\x05 \x11" + - "\x0F\u0163\u0164\f\x0E\x02\x02\u0164\u0165\x07\x1A\x02\x02\u0165\u0167" + - "\x05 \x11\x0E\u0166\u0160\x03\x02\x02\x02\u0166\u0163\x03\x02\x02\x02" + - "\u0167\u016A\x03\x02\x02\x02\u0168\u0166\x03\x02\x02\x02\u0168\u0169\x03" + - "\x02\x02\x02\u0169!\x03\x02\x02\x02\u016A\u0168\x03\x02\x02\x02\u016B" + - "\u016C\x07 \x02\x02\u016C\u016D\x07\x04\x02\x02\u016D\u016E\x05@!\x02" + - "\u016E\u016F\x07\x07\x02\x02\u016F\u0172\x07*\x02\x02\u0170\u0171\x07" + - "\n\x02\x02\u0171\u0173\x05$\x13\x02\u0172\u0170\x03\x02\x02\x02\u0172" + - "\u0173\x03\x02\x02\x02\u0173\u0175\x03\x02\x02\x02\u0174\u0176\x07\n\x02" + - "\x02\u0175\u0174\x03\x02\x02\x02\u0175\u0176\x03\x02\x02\x02\u0176\u0177" + - "\x03\x02\x02\x02\u0177\u0178\x07\x05\x02\x02\u0178#\x03\x02\x02\x02\u0179" + - "\u017A\x05&\x14\x02\u017A\u017B\x07\x07\x02\x02\u017B\u017C\x05 \x11\x02" + - "\u017C\u017D\x07\n\x02\x02\u017D\u017F\x03\x02\x02\x02\u017E\u0179\x03" + - "\x02\x02\x02\u017F\u0182\x03\x02\x02\x02\u0180\u017E\x03\x02\x02\x02\u0180" + - "\u0181\x03\x02\x02\x02\u0181\u018C\x03\x02\x02\x02\u0182\u0180\x03\x02" + - "\x02\x02\u0183\u0184\x05&\x14\x02\u0184\u0185\x07\x07\x02\x02\u0185\u0186" + - "\x05 \x11\x02\u0186\u018A\x03\x02\x02\x02\u0187\u018B\x07\n\x02\x02\u0188" + - "\u0189\x07 \x02\x02\u0189\u018B\x07C\x02\x02\u018A\u0187\x03\x02\x02\x02" + - "\u018A\u0188\x03\x02\x02\x02\u018A\u018B\x03\x02\x02\x02\u018B\u018D\x03" + - "\x02\x02\x02\u018C\u0183\x03\x02\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D" + - "\u0191\x03\x02\x02\x02\u018E\u018F\x07 \x02\x02\u018F\u0191\x07C\x02\x02" + - "\u0190\u0180\x03\x02\x02\x02\u0190\u018E\x03\x02\x02\x02\u0191%\x03\x02" + - "\x02\x02\u0192\u0193\x05B\"\x02\u0193\'\x03\x02\x02\x02\u0194\u0195\b" + - "\x15\x01\x02\u0195\u022A\x05,\x17\x02\u0196\u0197\x058\x1D\x02\u0197\u0199" + - "\x07A\x02\x02\u0198\u019A\x054\x1B\x02\u0199\u0198\x03\x02\x02\x02\u0199" + - "\u019A\x03\x02\x02\x02\u019A\u019B\x03\x02\x02\x02\u019B\u019C\x07B\x02" + - "\x02\u019C\u022A\x03\x02\x02\x02\u019D\u019E\x076\x02\x02\u019E\u022A" + - "\x05(\x15\x1B\u019F\u01A0\x05@!\x02\u01A0\u01A1\x07\"\x02\x02\u01A1\u01A2" + - "\x07@\x02\x02\u01A2\u01A3\x05(\x15\x17\u01A3\u022A\x03\x02\x02\x02\u01A4" + - "\u01A5\x07-\x02\x02\u01A5\u01A6\x07\x04\x02\x02\u01A6\u01AB\x05(\x15\x02" + - "\u01A7\u01A8\x07\n\x02\x02\u01A8\u01AA\x05(\x15\x02\u01A9\u01A7\x03\x02" + - "\x02\x02\u01AA\u01AD\x03\x02\x02\x02\u01AB\u01A9\x03\x02\x02\x02\u01AB" + - "\u01AC\x03\x02\x02\x02\u01AC\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02" + - "\x02\x02\u01AE\u01B0\x07\n\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01AF\u01B0" + - "\x03\x02\x02\x02\u01B0\u01B1\x03\x02\x02\x02\u01B1\u01B2\x07\x05\x02\x02" + - "\u01B2\u022A\x03\x02\x02\x02\u01B3\u01B4\x07.\x02\x02\u01B4\u01B5\x07" + - "\x04\x02\x02\u01B5\u01BA\x05(\x15\x02\u01B6\u01B7\x07\n\x02\x02\u01B7" + - "\u01B9\x05(\x15\x02\u01B8\u01B6\x03\x02\x02\x02\u01B9\u01BC\x03\x02\x02" + - "\x02\u01BA\u01B8\x03\x02\x02\x02\u01BA\u01BB\x03\x02\x02\x02\u01BB\u01BE" + - "\x03\x02\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BD\u01BF\x07\n\x02\x02" + - "\u01BE\u01BD\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C0\x03" + - "\x02\x02\x02\u01C0\u01C1\x07\x05\x02\x02\u01C1\u022A\x03\x02\x02\x02\u01C2" + - "\u01C3\x07#\x02\x02\u01C3\u01C4\x07\x04\x02\x02\u01C4\u01C9\x05(\x15\x02" + - "\u01C5\u01C6\x07\n\x02\x02\u01C6\u01C8\x05(\x15\x02\u01C7\u01C5\x03\x02" + - "\x02\x02\u01C8\u01CB\x03\x02\x02\x02\u01C9\u01C7\x03\x02\x02\x02\u01C9" + - "\u01CA\x03\x02\x02\x02\u01CA\u01CD\x03\x02\x02\x02\u01CB\u01C9\x03\x02" + - "\x02\x02\u01CC\u01CE\x07\n\x02\x02\u01CD\u01CC\x03\x02\x02\x02\u01CD\u01CE" + - "\x03\x02\x02\x02\u01CE\u01CF\x03\x02\x02\x02\u01CF\u01D0\x07\x05\x02\x02" + - "\u01D0\u022A\x03\x02\x02\x02\u01D1\u01D2\x07$\x02\x02\u01D2\u01D3\x07" + - "\x04\x02\x02\u01D3\u01D8\x05(\x15\x02\u01D4\u01D5\x07\n\x02\x02\u01D5" + - "\u01D7\x05(\x15\x02\u01D6\u01D4\x03\x02\x02\x02\u01D7\u01DA\x03\x02\x02" + - "\x02\u01D8\u01D6\x03\x02\x02\x02\u01D8\u01D9\x03\x02\x02\x02\u01D9\u01DC" + - "\x03\x02\x02\x02\u01DA\u01D8\x03\x02\x02\x02\u01DB\u01DD\x07\n\x02\x02" + - "\u01DC\u01DB\x03\x02\x02\x02\u01DC\u01DD\x03\x02\x02\x02\u01DD\u01DE\x03" + - "\x02\x02\x02\u01DE\u01DF\x07\x05\x02\x02\u01DF\u022A\x03\x02\x02\x02\u01E0" + - "\u01E5\x05@!\x02\u01E1\u01E5\x07,\x02\x02\u01E2\u01E5\x07+\x02\x02\u01E3" + - "\u01E5\x07*\x02\x02\u01E4\u01E0\x03\x02\x02\x02\u01E4\u01E1\x03\x02\x02" + - "\x02\u01E4\u01E2\x03\x02\x02\x02\u01E4\u01E3\x03\x02\x02\x02\u01E5\u022A" + - "\x03\x02\x02\x02\u01E6\u01E7\x07A\x02\x02\u01E7\u01E8\x05(\x15\x02\u01E8" + - "\u01E9\x07\n\x02\x02\u01E9\u01EE\x05(\x15\x02\u01EA\u01EB\x07\n\x02\x02" + - "\u01EB\u01ED\x05(\x15\x02\u01EC\u01EA\x03\x02\x02\x02\u01ED\u01F0\x03" + - "\x02\x02\x02\u01EE\u01EC\x03\x02\x02\x02\u01EE\u01EF\x03\x02\x02\x02\u01EF" + - "\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03\x02\x02\x02\u01F1\u01F3\x07\n\x02" + - "\x02\u01F2\u01F1\x03\x02\x02\x02\u01F2\u01F3\x03\x02\x02\x02\u01F3\u01F4" + - "\x03\x02\x02\x02\u01F4\u01F5\x07B\x02\x02\u01F5\u022A\x03\x02\x02\x02" + - "\u01F6\u01F7\x07\x04\x02\x02\u01F7\u01FC\x056\x1C\x02\u01F8\u01F9\x07" + - "\n\x02\x02\u01F9\u01FB\x056\x1C\x02\u01FA\u01F8\x03\x02\x02\x02\u01FB" + - "\u01FE\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02\u01FC\u01FD\x03\x02" + - "\x02\x02\u01FD\u0200\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02\u01FF" + - "\u0201\x07\n\x02\x02\u0200\u01FF\x03\x02\x02\x02\u0200\u0201\x03\x02\x02" + - "\x02\u0201\u0202\x03\x02\x02\x02\u0202\u0203\x07\x05\x02\x02\u0203\u022A" + - "\x03\x02\x02\x02\u0204\u020D\x07\x1B\x02\x02\u0205"; + "\u0110\u0111\x07B\x02\x02\u0111\u0112\x07\x16\x02\x02\u0112\u0115\x07" + + "7\x02\x02\u0113\u0114\x07\x17\x02\x02\u0114\u0116\x05 \x11\x02\u0115\u0113" + + "\x03\x02\x02\x02\u0115\u0116\x03\x02\x02\x02\u0116\u012F\x03\x02\x02\x02" + + "\u0117\u0118\x07\x15\x02\x02\u0118\u0119\x05\x1A\x0E\x02\u0119\u011A\x07" + + "A\x02\x02\u011A\u011B\x05\x1C\x0F\x02\u011B\u011C\x07@\x02\x02\u011C\u0124" + + "\x05*\x16\x02\u011D\u011E\x07\n\x02\x02\u011E\u011F\x05\x1C\x0F\x02\u011F" + + "\u0120\x07@\x02\x02\u0120\u0121\x05*\x16\x02\u0121\u0123\x03\x02\x02\x02" + + "\u0122\u011D\x03\x02\x02\x02\u0123\u0126\x03\x02\x02\x02\u0124\u0122\x03" + + "\x02\x02\x02\u0124\u0125\x03\x02\x02\x02\u0125\u0127\x03\x02\x02\x02\u0126" + + "\u0124\x03\x02\x02\x02\u0127\u0128\x07B\x02\x02\u0128\u0129\x07\x18\x02" + + "\x02\u0129\u012C\x05\x1E\x10\x02\u012A\u012B\x07\x17\x02\x02\u012B\u012D" + + "\x05 \x11\x02\u012C\u012A\x03\x02\x02\x02\u012C\u012D\x03\x02\x02\x02" + + "\u012D\u012F\x03\x02\x02\x02\u012E\u0100\x03\x02\x02\x02\u012E\u0117\x03" + + "\x02\x02\x02\u012F\x19\x03\x02\x02\x02\u0130\u0131\x05B\"\x02\u0131\x1B" + + "\x03\x02\x02\x02\u0132\u0133\x05B\"\x02\u0133\x1D\x03\x02\x02\x02\u0134" + + "\u0135\x05B\"\x02\u0135\x1F\x03\x02\x02\x02\u0136\u0137\x07*\x02\x02\u0137" + + "!\x03\x02\x02\x02\u0138\u0139\b\x12\x01\x02\u0139\u0142\x07A\x02\x02\u013A" + + "\u013F\x05\"\x12\x02\u013B\u013C\x07\n\x02\x02\u013C\u013E\x05\"\x12\x02" + + "\u013D\u013B\x03\x02\x02\x02\u013E\u0141\x03\x02\x02\x02\u013F\u013D\x03" + + "\x02\x02\x02\u013F\u0140\x03\x02\x02\x02\u0140\u0143\x03\x02\x02\x02\u0141" + + "\u013F\x03\x02\x02\x02\u0142\u013A\x03\x02\x02\x02\u0142\u0143\x03\x02" + + "\x02\x02\u0143\u0145\x03\x02\x02\x02\u0144\u0146\x07\n\x02\x02\u0145\u0144" + + "\x03\x02\x02\x02\u0145\u0146\x03\x02\x02\x02\u0146\u0147\x03\x02\x02\x02" + + "\u0147\u0148\x07B\x02\x02\u0148\u0149\x07\x1B\x02\x02\u0149\u0176\x05" + + "\"\x12\r\u014A\u014B\x071\x02\x02\u014B\u014C\x07\x1C\x02\x02\u014C\u014D" + + "\x05\"\x12\x02\u014D\u014E\x07\x1D\x02\x02\u014E\u0176\x03\x02\x02\x02" + + "\u014F\u0150\x072\x02\x02\u0150\u0151\x07\x1C\x02\x02\u0151\u0152\x05" + + "\"\x12\x02\u0152\u0153\x07\x1D\x02\x02\u0153\u0176\x03\x02\x02\x02\u0154" + + "\u0155\x07A\x02\x02\u0155\u0156\x05\"\x12\x02\u0156\u0157\x07\n\x02\x02" + + "\u0157\u015C\x05\"\x12\x02\u0158\u0159\x07\n\x02\x02\u0159\u015B\x05\"" + + "\x12\x02\u015A\u0158\x03\x02\x02\x02\u015B\u015E\x03\x02\x02\x02\u015C" + + "\u015A\x03\x02\x02\x02\u015C\u015D\x03\x02\x02\x02\u015D\u0160\x03\x02" + + "\x02\x02\u015E\u015C\x03\x02\x02\x02\u015F\u0161\x07\n\x02\x02\u0160\u015F" + + "\x03\x02\x02\x02\u0160\u0161\x03\x02\x02\x02\u0161\u0162\x03\x02\x02\x02" + + "\u0162\u0163\x07B\x02\x02\u0163\u0176\x03\x02\x02\x02\u0164\u0165\x07" + + "\x04\x02\x02\u0165\u0166\x05&\x14\x02\u0166\u0167\x07\x05\x02\x02\u0167" + + "\u0176\x03\x02\x02\x02\u0168\u016A\x05$\x13\x02\u0169\u0168\x03\x02\x02" + + "\x02\u016A\u016B\x03\x02\x02\x02\u016B\u0169\x03\x02\x02\x02\u016B\u016C" + + "\x03\x02\x02\x02\u016C\u0176\x03\x02\x02\x02\u016D\u0176\x07\x1E\x02\x02" + + "\u016E\u0176\x07\x1F\x02\x02\u016F\u0176\x07 \x02\x02\u0170\u0176\x05" + + "B\"\x02\u0171\u0172\x07A\x02\x02\u0172\u0173\x05\"\x12\x02\u0173\u0174" + + "\x07B\x02\x02\u0174\u0176\x03\x02\x02\x02\u0175\u0138\x03\x02\x02\x02" + + "\u0175\u014A\x03\x02\x02\x02\u0175\u014F\x03\x02\x02\x02\u0175\u0154\x03" + + "\x02\x02\x02\u0175\u0164\x03\x02\x02\x02\u0175\u0169\x03\x02\x02\x02\u0175" + + "\u016D\x03\x02\x02\x02\u0175\u016E\x03\x02\x02\x02\u0175\u016F\x03\x02" + + "\x02\x02\u0175\u0170\x03\x02\x02\x02\u0175\u0171\x03\x02\x02\x02\u0176" + + "\u017F\x03\x02\x02\x02\u0177\u0178\f\x0F\x02\x02\u0178\u0179\x07\x1A\x02" + + "\x02\u0179\u017E\x05\"\x12\x0F\u017A\u017B\f\x0E\x02\x02\u017B\u017C\x07" + + "\x1B\x02\x02\u017C\u017E\x05\"\x12\x0E\u017D\u0177\x03\x02\x02\x02\u017D" + + "\u017A\x03\x02\x02\x02\u017E\u0181\x03\x02\x02\x02\u017F\u017D\x03\x02" + + "\x02\x02\u017F\u0180\x03\x02\x02\x02\u0180#\x03\x02\x02\x02\u0181\u017F" + + "\x03\x02\x02\x02\u0182\u0183\x07\r\x02\x02\u0183\u0184\x07\x04\x02\x02" + + "\u0184\u0185\x05B\"\x02\u0185\u0186\x07\x07\x02\x02\u0186\u0189\x07*\x02" + + "\x02\u0187\u0188\x07\n\x02\x02\u0188\u018A\x05&\x14\x02\u0189\u0187\x03" + + "\x02\x02\x02\u0189\u018A\x03\x02\x02\x02\u018A\u018C\x03\x02\x02\x02\u018B" + + "\u018D\x07\n\x02\x02\u018C\u018B\x03\x02\x02\x02\u018C\u018D\x03\x02\x02" + + "\x02\u018D\u018E\x03\x02\x02\x02\u018E\u018F\x07\x05\x02\x02\u018F%\x03" + + "\x02\x02\x02\u0190\u0191\x05(\x15\x02\u0191\u0192\x07\x07\x02\x02\u0192" + + "\u0193\x05\"\x12\x02\u0193\u0194\x07\n\x02\x02\u0194\u0196\x03\x02\x02" + + "\x02\u0195\u0190\x03\x02\x02\x02\u0196\u0199\x03\x02\x02\x02\u0197\u0195" + + "\x03\x02\x02\x02\u0197\u0198\x03\x02\x02\x02\u0198\u01A3\x03\x02\x02\x02" + + "\u0199\u0197\x03\x02\x02\x02\u019A\u019B\x05(\x15\x02\u019B\u019C\x07" + + "\x07\x02\x02\u019C\u019D\x05\"\x12\x02\u019D\u01A1\x03\x02\x02\x02\u019E" + + "\u01A2\x07\n\x02\x02\u019F\u01A0\x07\r\x02\x02\u01A0\u01A2\x07C\x02\x02" + + "\u01A1\u019E\x03\x02\x02\x02\u01A1\u019F\x03\x02\x02\x02\u01A1\u01A2\x03" + + "\x02\x02\x02\u01A2\u01A4\x03\x02\x02\x02\u01A3\u019A\x03\x02\x02\x02\u01A3" + + "\u01A4\x03\x02\x02\x02\u01A4\u01A8\x03\x02\x02\x02\u01A5\u01A6\x07\r\x02" + + "\x02\u01A6\u01A8\x07C\x02\x02\u01A7\u0197\x03\x02\x02\x02\u01A7\u01A5" + + "\x03\x02\x02\x02\u01A8\'\x03\x02\x02\x02\u01A9\u01AA\x05D#\x02\u01AA)" + + "\x03\x02\x02\x02\u01AB\u01AC\b\x16\x01\x02\u01AC\u0241\x05.\x18\x02\u01AD" + + "\u01AE\x05:\x1E\x02\u01AE\u01B0\x07A\x02\x02\u01AF\u01B1\x056\x1C\x02" + + "\u01B0\u01AF\x03\x02\x02\x02\u01B0\u01B1\x03\x02\x02\x02\u01B1\u01B2\x03" + + "\x02\x02\x02\u01B2\u01B3\x07B\x02\x02\u01B3\u0241\x03\x02\x02\x02\u01B4" + + "\u01B5\x076\x02\x02\u01B5\u0241\x05*\x16\x1B\u01B6\u01B7\x05B\"\x02\u01B7" + + "\u01B8\x07\"\x02\x02\u01B8\u01B9\x07@\x02\x02\u01B9\u01BA\x05*\x16\x17" + + "\u01BA\u0241\x03\x02\x02\x02\u01BB\u01BC\x07-\x02\x02\u01BC\u01BD\x07" + + "\x04\x02\x02\u01BD\u01C2\x05*\x16\x02\u01BE\u01BF\x07\n\x02\x02\u01BF" + + "\u01C1\x05*\x16\x02\u01C0\u01BE\x03\x02\x02\x02\u01C1\u01C4\x03\x02\x02" + + "\x02\u01C2\u01C0\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3\u01C6" + + "\x03\x02\x02\x02\u01C4\u01C2\x03\x02\x02\x02\u01C5\u01C7\x07\n\x02\x02" + + "\u01C6\u01C5\x03\x02\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01C8\x03" + + "\x02\x02\x02\u01C8\u01C9\x07\x05\x02\x02\u01C9\u0241\x03\x02\x02\x02\u01CA" + + "\u01CB\x07.\x02\x02\u01CB\u01CC\x07\x04\x02\x02\u01CC\u01D1\x05*\x16\x02" + + "\u01CD\u01CE\x07\n\x02\x02\u01CE\u01D0\x05*\x16\x02\u01CF\u01CD\x03\x02" + + "\x02\x02\u01D0\u01D3\x03\x02\x02\x02\u01D1\u01CF\x03\x02\x02\x02\u01D1" + + "\u01D2\x03\x02\x02\x02\u01D2\u01D5\x03\x02\x02\x02\u01D3\u01D1\x03\x02" + + "\x02\x02\u01D4\u01D6\x07\n\x02\x02\u01D5\u01D4\x03\x02\x02\x02\u01D5\u01D6" + + "\x03\x02\x02\x02\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01D8\x07\x05\x02\x02" + + "\u01D8\u0241\x03\x02\x02\x02\u01D9\u01DA\x07#\x02\x02\u01DA\u01DB\x07" + + "\x04\x02\x02\u01DB\u01E0\x05*\x16\x02\u01DC\u01DD\x07\n\x02\x02\u01DD" + + "\u01DF\x05*\x16\x02\u01DE\u01DC\x03\x02\x02\x02\u01DF\u01E2\x03\x02\x02" + + "\x02\u01E0\u01DE\x03\x02\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01E4" + + "\x03\x02\x02\x02\u01E2\u01E0\x03\x02\x02\x02\u01E3\u01E5\x07\n\x02\x02" + + "\u01E4\u01E3\x03\x02\x02\x02\u01E4\u01E5\x03\x02\x02\x02\u01E5\u01E6\x03" + + "\x02\x02\x02\u01E6\u01E7\x07\x05\x02\x02\u01E7\u0241\x03\x02\x02\x02\u01E8" + + "\u01E9\x07$\x02\x02\u01E9\u01EA\x07\x04\x02\x02\u01EA\u01EF\x05*\x16\x02" + + "\u01EB\u01EC\x07\n\x02\x02\u01EC\u01EE\x05*\x16\x02\u01ED\u01EB\x03\x02" + + "\x02\x02\u01EE\u01F1\x03\x02\x02\x02\u01EF\u01ED\x03\x02\x02\x02\u01EF" + + "\u01F0\x03\x02\x02\x02\u01F0\u01F3\x03\x02\x02\x02\u01F1\u01EF\x03\x02" + + "\x02\x02\u01F2\u01F4\x07\n\x02\x02\u01F3\u01F2\x03\x02\x02\x02\u01F3\u01F4" + + "\x03\x02\x02\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5\u01F6\x07\x05\x02\x02" + + "\u01F6\u0241\x03\x02\x02\x02\u01F7\u01FC\x05B\"\x02\u01F8\u01FC\x07,\x02" + + "\x02\u01F9\u01FC\x07+\x02\x02\u01FA\u01FC\x07*\x02\x02\u01FB\u01F7\x03" + + "\x02\x02\x02\u01FB\u01F8\x03\x02\x02\x02\u01FB\u01F9\x03\x02\x02\x02\u01FB" + + "\u01FA\x03\x02\x02\x02\u01FC\u0241\x03\x02\x02\x02\u01FD\u01FE\x07"; private static readonly _serializedATNSegment1: string = - "\u020A\x05(\x15\x02\u0206\u0207\x07\n\x02\x02\u0207\u0209\x05(\x15\x02" + - "\u0208\u0206\x03\x02\x02\x02\u0209\u020C\x03\x02\x02\x02\u020A\u0208\x03" + - "\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B\u020E\x03\x02\x02\x02\u020C" + - "\u020A\x03\x02\x02\x02\u020D\u0205\x03\x02\x02\x02\u020D\u020E\x03\x02" + - "\x02\x02\u020E\u0210\x03\x02\x02\x02\u020F\u0211\x07\n\x02\x02\u0210\u020F" + - "\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211\u0212\x03\x02\x02\x02" + - "\u0212\u022A\x07\x1C\x02\x02\u0213\u0214\x07%\x02\x02\u0214\u0215\x07" + - "A\x02\x02\u0215\u0216\x05(\x15\x02\u0216\u0217\x07B\x02\x02\u0217\u0218" + - "\x05(\x15\x02\u0218\u0219\x07&\x02\x02\u0219\u021A\x05(\x15\x07\u021A" + - "\u022A\x03\x02\x02\x02\u021B\u021C\x05\n\x06\x02\u021C\u021D\x05(\x15" + - "\x06\u021D\u022A\x03\x02\x02\x02\u021E\u021F\x05\x0E\b\x02\u021F\u0220" + - "\x05(\x15\x05\u0220\u022A\x03\x02\x02\x02\u0221\u0222\x07A\x02\x02\u0222" + - "\u0223\x05(\x15\x02\u0223\u0224\x07B\x02\x02\u0224\u022A\x03\x02\x02\x02" + - "\u0225\u0226\x07\x04\x02\x02\u0226\u0227\x05(\x15\x02\u0227\u0228\x07" + - "\x05\x02\x02\u0228\u022A\x03\x02\x02\x02\u0229\u0194\x03\x02\x02\x02\u0229" + - "\u0196\x03\x02\x02\x02\u0229\u019D\x03\x02\x02\x02\u0229\u019F\x03\x02" + - "\x02\x02\u0229\u01A4\x03\x02\x02\x02\u0229\u01B3\x03\x02\x02\x02\u0229" + - "\u01C2\x03\x02\x02\x02\u0229\u01D1\x03\x02\x02\x02\u0229\u01E4\x03\x02" + - "\x02\x02\u0229\u01E6\x03\x02\x02\x02\u0229\u01F6\x03\x02\x02\x02\u0229" + - "\u0204\x03\x02\x02\x02\u0229\u0213\x03\x02\x02\x02\u0229\u021B\x03\x02" + - "\x02\x02\u0229\u021E\x03\x02\x02\x02\u0229\u0221\x03\x02\x02\x02\u0229" + - "\u0225\x03\x02\x02\x02\u022A\u0269\x03\x02\x02\x02\u022B\u022C\f\x1C\x02" + - "\x02\u022C\u022D\x07!\x02\x02\u022D\u0268\x05(\x15\x1C\u022E\u022F\f\x1A" + - "\x02\x02\u022F\u0230\t\x02\x02\x02\u0230\u0268\x05(\x15\x1B\u0231\u0232" + - "\f\x19\x02\x02\u0232\u0233\t\x03\x02\x02\u0233\u0268\x05(\x15\x1A\u0234" + - "\u0235\f\x18\x02\x02\u0235\u0236\t\x04\x02\x02\u0236\u0268\x05(\x15\x19" + - "\u0237\u0238\f\x16\x02\x02\u0238\u0239\x07@\x02\x02\u0239\u023A\x05(\x15" + - "\x17\u023A\u023B\b\x15\x01\x02\u023B\u0268\x03\x02\x02\x02\u023C\u023D" + - "\f\x14\x02\x02\u023D\u023E\x07-\x02\x02\u023E\u0268\x05(\x15\x15\u023F" + - "\u0240\f\x12\x02\x02\u0240\u0241\x07.\x02\x02\u0241\u0268\x05(\x15\x13" + - "\u0242\u0243\f\x11\x02\x02\u0243\u0244\x07/\x02\x02\u0244\u0268\x05(\x15" + - "\x12\u0245\u0246\f\x10\x02\x02\u0246\u0247\x070\x02\x02\u0247\u0268\x05" + - "(\x15\x11\u0248\u0249\f\n\x02\x02\u0249\u024A\x07\x19\x02\x02\u024A\u0268" + - "\x05(\x15\v\u024B\u024C\f \x02\x02\u024C\u024D\x07\x15\x02\x02\u024D\u0253" + - "\x05:\x1E\x02\u024E\u0250\x07A\x02\x02\u024F\u0251\x054\x1B\x02\u0250" + - "\u024F\x03\x02\x02\x02\u0250\u0251\x03\x02\x02\x02\u0251\u0252\x03\x02" + - "\x02\x02\u0252\u0254\x07B\x02\x02\u0253\u024E\x03\x02\x02\x02\u0253\u0254" + - "\x03\x02\x02\x02\u0254\u0268\x03\x02\x02\x02\u0255\u0256\f\x1D\x02\x02" + - "\u0256\u0257\x07\x1B\x02\x02\u0257\u0258\x05(\x15\x02\u0258\u0259\x07" + - "\x1C\x02\x02\u0259\u0268\x03\x02\x02\x02\u025A\u025B\f\x0F\x02\x02\u025B" + - "\u0263\x074\x02\x02\u025C\u025D\x07 \x02\x02\u025D\u025E\x07*\x02\x02" + - "\u025E\u025F\x07\x07\x02\x02\u025F\u0260\x050\x19\x02\u0260\u0261\x07" + - "\x1A\x02\x02\u0261\u0262\x05(\x15\x02\u0262\u0264\x03\x02\x02\x02\u0263" + - "\u025C\x03\x02\x02\x02\u0264\u0265\x03\x02\x02\x02\u0265\u0263\x03\x02" + - "\x02\x02\u0265\u0266\x03\x02\x02\x02\u0266\u0268\x03\x02\x02\x02\u0267" + - "\u022B\x03\x02\x02\x02\u0267\u022E\x03\x02\x02\x02\u0267\u0231\x03\x02" + - "\x02\x02\u0267\u0234\x03\x02\x02\x02\u0267\u0237\x03\x02\x02\x02\u0267" + - "\u023C\x03\x02\x02\x02\u0267\u023F\x03\x02\x02\x02\u0267\u0242\x03\x02" + - "\x02\x02\u0267\u0245\x03\x02\x02\x02\u0267\u0248\x03\x02\x02\x02\u0267" + - "\u024B\x03\x02\x02\x02\u0267\u0255\x03\x02\x02\x02\u0267\u025A\x03\x02" + - "\x02\x02\u0268\u026B\x03\x02\x02\x02\u0269\u0267\x03\x02\x02\x02\u0269" + - "\u026A\x03\x02\x02\x02\u026A)\x03\x02\x02\x02\u026B\u0269\x03\x02\x02" + - "\x02\u026C\u026D\x05\b\x05\x02\u026D\u026E\x07\x02\x02\x03\u026E\u0276" + - "\x03\x02\x02\x02\u026F\u0270\x05(\x15\x02\u0270\u0271\x07\x02\x02\x03" + - "\u0271\u0276\x03\x02\x02\x02\u0272\u0273\x07D\x02\x02\u0273\u0276\x07" + - "\x02\x02\x03\u0274\u0276\x07\x02\x02\x03\u0275\u026C\x03\x02\x02\x02\u0275" + - "\u026F\x03\x02\x02\x02\u0275\u0272\x03\x02\x02\x02\u0275\u0274\x03\x02" + - "\x02\x02\u0276+\x03\x02\x02\x02\u0277\u0278\x050\x19\x02\u0278\u0279\x07" + - "\x1A\x02\x02\u0279\u027A\x05(\x15\x02\u027A\u0289\x03\x02\x02\x02\u027B" + - "\u027C\x07A\x02\x02\u027C\u0281\x050\x19\x02\u027D\u027E\x07\n\x02\x02" + - "\u027E\u0280\x050\x19\x02\u027F\u027D\x03\x02\x02\x02\u0280\u0283\x03" + - "\x02\x02\x02\u0281\u027F\x03\x02\x02\x02\u0281\u0282\x03\x02\x02\x02\u0282" + - "\u0284\x03\x02\x02\x02\u0283\u0281\x03\x02\x02\x02\u0284\u0285\x07B\x02" + - "\x02\u0285\u0286\x07\x1A\x02\x02\u0286\u0287\x05(\x15\x02\u0287\u0289" + - "\x03\x02\x02\x02\u0288\u0277\x03\x02\x02\x02\u0288\u027B\x03\x02\x02\x02" + - "\u0289-\x03\x02\x02\x02\u028A\u028D\x07\'\x02\x02\u028B\u028D\x05@!\x02" + - "\u028C\u028A\x03\x02\x02\x02\u028C\u028B\x03\x02\x02\x02\u028D/\x03\x02" + - "\x02\x02\u028E\u028F\x05.\x18\x02\u028F1\x03\x02\x02\x02\u0290\u0293\x07" + - "7\x02\x02\u0291\u0293\x05@!\x02\u0292\u0290\x03\x02\x02\x02\u0292\u0291" + - "\x03\x02\x02\x02\u02933\x03\x02\x02\x02\u0294\u0299\x05(\x15\x02\u0295" + - "\u0296\x07\n\x02\x02\u0296\u0298\x05(\x15\x02\u0297\u0295\x03\x02\x02" + - "\x02\u0298\u029B\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u0299\u029A" + - "\x03\x02\x02\x02\u029A5\x03\x02\x02\x02\u029B\u0299\x03\x02\x02\x02\u029C" + - "\u029D\x05B\"\x02\u029D\u029E\x07\x07\x02\x02\u029E\u029F\x05(\x15\x02" + - "\u029F\u02A3\x03\x02\x02\x02\u02A0\u02A1\x07(\x02\x02\u02A1\u02A3\x05" + - "(\x15\x02\u02A2\u029C\x03\x02\x02\x02\u02A2\u02A0\x03\x02\x02\x02\u02A3" + - "7\x03\x02\x02\x02\u02A4\u02A7\x05@!\x02\u02A5\u02A7\t\x05\x02\x02\u02A6" + - "\u02A4\x03\x02\x02\x02\u02A6\u02A5\x03\x02\x02\x02\u02A79\x03\x02\x02" + - "\x02\u02A8\u02AB\x05@!\x02\u02A9\u02AB\t\x06\x02\x02\u02AA\u02A8\x03\x02" + - "\x02\x02\u02AA\u02A9\x03\x02\x02\x02\u02AB;\x03\x02\x02\x02\u02AC\u02AD" + - "\t\x07\x02\x02\u02AD=\x03\x02\x02\x02\u02AE\u02AF\t\b\x02\x02\u02AF?\x03" + - "\x02\x02\x02\u02B0\u02B5\x07C\x02\x02\u02B1\u02B2\x07)\x02\x02\u02B2\u02B4" + - "\x07C\x02\x02\u02B3\u02B1\x03\x02\x02\x02\u02B4\u02B7\x03\x02\x02\x02" + - "\u02B5\u02B3\x03\x02\x02\x02\u02B5\u02B6\x03\x02\x02\x02\u02B6A\x03\x02" + - "\x02\x02\u02B7\u02B5\x03\x02\x02\x02\u02B8\u02BD\x07C\x02\x02\u02B9\u02BA" + - "\x05@!\x02\u02BA\u02BB\b\"\x01\x02\u02BB\u02BD\x03\x02\x02\x02\u02BC\u02B8" + - "\x03\x02\x02\x02\u02BC\u02B9\x03\x02\x02\x02\u02BDC\x03\x02\x02\x02NG" + - "NW_x\x82\x85\x8A\x99\xA0\xA4\xA7\xB0\xB6\xBB\xC6\xCE\xD4\xD8\xDA\xE5\xE7" + - "\xF6\xFE\u010D\u0115\u0117\u0128\u012B\u012E\u0145\u0149\u0154\u015E\u0166" + - "\u0168\u0172\u0175\u0180\u018A\u018C\u0190\u0199\u01AB\u01AF\u01BA\u01BE" + - "\u01C9\u01CD\u01D8\u01DC\u01E4\u01EE\u01F2\u01FC\u0200\u020A\u020D\u0210" + - "\u0229\u0250\u0253\u0265\u0267\u0269\u0275\u0281\u0288\u028C\u0292\u0299" + - "\u02A2\u02A6\u02AA\u02B5\u02BC"; + "A\x02\x02\u01FE\u01FF\x05*\x16\x02\u01FF\u0200\x07\n\x02\x02\u0200\u0205" + + "\x05*\x16\x02\u0201\u0202\x07\n\x02\x02\u0202\u0204\x05*\x16\x02\u0203" + + "\u0201\x03\x02\x02\x02\u0204\u0207\x03\x02\x02\x02\u0205\u0203\x03\x02" + + "\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0209\x03\x02\x02\x02\u0207" + + "\u0205\x03\x02\x02\x02\u0208\u020A\x07\n\x02\x02\u0209\u0208\x03\x02\x02" + + "\x02\u0209\u020A\x03\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B\u020C" + + "\x07B\x02\x02\u020C\u0241\x03\x02\x02\x02\u020D\u020E\x07\x04\x02\x02" + + "\u020E\u0213\x058\x1D\x02\u020F\u0210\x07\n\x02\x02\u0210\u0212\x058\x1D" + + "\x02\u0211\u020F\x03\x02\x02\x02\u0212\u0215\x03\x02\x02\x02\u0213\u0211" + + "\x03\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0217\x03\x02\x02\x02" + + "\u0215\u0213\x03\x02\x02\x02\u0216\u0218\x07\n\x02\x02\u0217\u0216\x03" + + "\x02\x02\x02\u0217\u0218\x03\x02\x02\x02\u0218\u0219\x03\x02\x02\x02\u0219" + + "\u021A\x07\x05\x02\x02\u021A\u0241\x03\x02\x02\x02\u021B\u0224\x07\x1C" + + "\x02\x02\u021C\u0221\x05*\x16\x02\u021D\u021E\x07\n\x02\x02\u021E\u0220" + + "\x05*\x16\x02\u021F\u021D\x03\x02\x02\x02\u0220\u0223\x03\x02\x02\x02" + + "\u0221\u021F\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225\x03" + + "\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224\u021C\x03\x02\x02\x02\u0224" + + "\u0225\x03\x02\x02\x02\u0225\u0227\x03\x02\x02\x02\u0226\u0228\x07\n\x02" + + "\x02\u0227\u0226\x03\x02\x02\x02\u0227\u0228\x03\x02\x02\x02\u0228\u0229" + + "\x03\x02\x02\x02\u0229\u0241\x07\x1D\x02\x02\u022A\u022B\x07%\x02\x02" + + "\u022B\u022C\x07A\x02\x02\u022C\u022D\x05*\x16\x02\u022D\u022E\x07B\x02" + + "\x02\u022E\u022F\x05*\x16\x02\u022F\u0230\x07&\x02\x02\u0230\u0231\x05" + + "*\x16\x07\u0231\u0241\x03\x02\x02\x02\u0232\u0233\x05\n\x06\x02\u0233" + + "\u0234\x05*\x16\x06\u0234\u0241\x03\x02\x02\x02\u0235\u0236\x05\x10\t" + + "\x02\u0236\u0237\x05*\x16\x05\u0237\u0241\x03\x02\x02\x02\u0238\u0239" + + "\x07A\x02\x02\u0239\u023A\x05*\x16\x02\u023A\u023B\x07B\x02\x02\u023B" + + "\u0241\x03\x02\x02\x02\u023C\u023D\x07\x04\x02\x02\u023D\u023E\x05*\x16" + + "\x02\u023E\u023F\x07\x05\x02\x02\u023F\u0241\x03\x02\x02\x02\u0240\u01AB" + + "\x03\x02\x02\x02\u0240\u01AD\x03\x02\x02\x02\u0240\u01B4\x03\x02\x02\x02" + + "\u0240\u01B6\x03\x02\x02\x02\u0240\u01BB\x03\x02\x02\x02\u0240\u01CA\x03" + + "\x02\x02\x02\u0240\u01D9\x03\x02\x02\x02\u0240\u01E8\x03\x02\x02\x02\u0240" + + "\u01FB\x03\x02\x02\x02\u0240\u01FD\x03\x02\x02\x02\u0240\u020D\x03\x02" + + "\x02\x02\u0240\u021B\x03\x02\x02\x02\u0240\u022A\x03\x02\x02\x02\u0240" + + "\u0232\x03\x02\x02\x02\u0240\u0235\x03\x02\x02\x02\u0240\u0238\x03\x02" + + "\x02\x02\u0240\u023C\x03\x02\x02\x02\u0241\u0280\x03\x02\x02\x02\u0242" + + "\u0243\f\x1C\x02\x02\u0243\u0244\x07!\x02\x02\u0244\u027F\x05*\x16\x1C" + + "\u0245\u0246\f\x1A\x02\x02\u0246\u0247\t\x02\x02\x02\u0247\u027F\x05*" + + "\x16\x1B\u0248\u0249\f\x19\x02\x02\u0249\u024A\t\x03\x02\x02\u024A\u027F" + + "\x05*\x16\x1A\u024B\u024C\f\x18\x02\x02\u024C\u024D\t\x04\x02\x02\u024D" + + "\u027F\x05*\x16\x19\u024E\u024F\f\x16\x02\x02\u024F\u0250\x07@\x02\x02" + + "\u0250\u0251\x05*\x16\x17\u0251\u0252\b\x16\x01\x02\u0252\u027F\x03\x02" + + "\x02\x02\u0253\u0254\f\x14\x02\x02\u0254\u0255\x07-\x02\x02\u0255\u027F" + + "\x05*\x16\x15\u0256\u0257\f\x12\x02\x02\u0257\u0258\x07.\x02\x02\u0258" + + "\u027F\x05*\x16\x13\u0259\u025A\f\x11\x02\x02\u025A\u025B\x07/\x02\x02" + + "\u025B\u027F\x05*\x16\x12\u025C\u025D\f\x10\x02\x02\u025D\u025E\x070\x02" + + "\x02\u025E\u027F\x05*\x16\x11\u025F\u0260\f\n\x02\x02\u0260\u0261\x07" + + "\x1A\x02\x02\u0261\u027F\x05*\x16\v\u0262\u0263\f \x02\x02\u0263\u0264" + + "\x07\x16\x02\x02\u0264\u026A\x05<\x1F\x02\u0265\u0267\x07A\x02\x02\u0266" + + "\u0268\x056\x1C\x02\u0267\u0266\x03\x02\x02\x02\u0267\u0268\x03\x02\x02" + + "\x02\u0268\u0269\x03\x02\x02\x02\u0269\u026B\x07B\x02\x02\u026A\u0265" + + "\x03\x02\x02\x02\u026A\u026B\x03\x02\x02\x02\u026B\u027F\x03\x02\x02\x02" + + "\u026C\u026D\f\x1D\x02\x02\u026D\u026E\x07\x1C\x02\x02\u026E\u026F\x05" + + "*\x16\x02\u026F\u0270\x07\x1D\x02\x02\u0270\u027F\x03\x02\x02\x02\u0271" + + "\u0272\f\x0F\x02\x02\u0272\u027A\x074\x02\x02\u0273\u0274\x07\r\x02\x02" + + "\u0274\u0275\x07*\x02\x02\u0275\u0276\x07\x07\x02\x02\u0276\u0277\x05" + + "2\x1A\x02\u0277\u0278\x07\x1B\x02\x02\u0278\u0279\x05*\x16\x02\u0279\u027B" + + "\x03\x02\x02\x02\u027A\u0273\x03\x02\x02\x02\u027B\u027C\x03\x02\x02\x02" + + "\u027C\u027A\x03\x02\x02\x02\u027C\u027D\x03\x02\x02\x02\u027D\u027F\x03" + + "\x02\x02\x02\u027E\u0242\x03\x02\x02\x02\u027E\u0245\x03\x02\x02\x02\u027E" + + "\u0248\x03\x02\x02\x02\u027E\u024B\x03\x02\x02\x02\u027E\u024E\x03\x02" + + "\x02\x02\u027E\u0253\x03\x02\x02\x02\u027E\u0256\x03\x02\x02\x02\u027E" + + "\u0259\x03\x02\x02\x02\u027E\u025C\x03\x02\x02\x02\u027E\u025F\x03\x02" + + "\x02\x02\u027E\u0262\x03\x02\x02\x02\u027E\u026C\x03\x02\x02\x02\u027E" + + "\u0271\x03\x02\x02\x02\u027F\u0282\x03\x02\x02\x02\u0280\u027E\x03\x02" + + "\x02\x02\u0280\u0281\x03\x02\x02\x02\u0281+\x03\x02\x02\x02\u0282\u0280" + + "\x03\x02\x02\x02\u0283\u0284\x05\b\x05\x02\u0284\u0285\x07\x02\x02\x03" + + "\u0285\u028D\x03\x02\x02\x02\u0286\u0287\x05*\x16\x02\u0287\u0288\x07" + + "\x02\x02\x03\u0288\u028D\x03\x02\x02\x02\u0289\u028A\x07D\x02\x02\u028A" + + "\u028D\x07\x02\x02\x03\u028B\u028D\x07\x02\x02\x03\u028C\u0283\x03\x02" + + "\x02\x02\u028C\u0286\x03\x02\x02\x02\u028C\u0289\x03\x02\x02\x02\u028C" + + "\u028B\x03\x02\x02\x02\u028D-\x03\x02\x02\x02\u028E\u028F\x052\x1A\x02" + + "\u028F\u0290\x07\x1B\x02\x02\u0290\u0291\x05*\x16\x02\u0291\u02A0\x03" + + "\x02\x02\x02\u0292\u0293\x07A\x02\x02\u0293\u0298\x052\x1A\x02\u0294\u0295" + + "\x07\n\x02\x02\u0295\u0297\x052\x1A\x02\u0296\u0294\x03\x02\x02\x02\u0297" + + "\u029A\x03\x02\x02\x02\u0298\u0296\x03\x02\x02\x02\u0298\u0299\x03\x02" + + "\x02\x02\u0299\u029B\x03\x02\x02\x02\u029A\u0298\x03\x02\x02\x02\u029B" + + "\u029C\x07B\x02\x02\u029C\u029D\x07\x1B\x02\x02\u029D\u029E\x05*\x16\x02" + + "\u029E\u02A0\x03\x02\x02\x02\u029F\u028E\x03\x02\x02\x02\u029F\u0292\x03" + + "\x02\x02\x02\u02A0/\x03\x02\x02\x02\u02A1\u02A4\x07\'\x02\x02\u02A2\u02A4" + + "\x05B\"\x02\u02A3\u02A1\x03\x02\x02\x02\u02A3\u02A2\x03\x02\x02\x02\u02A4" + + "1\x03\x02\x02\x02\u02A5\u02A6\x050\x19\x02\u02A63\x03\x02\x02\x02\u02A7" + + "\u02AA\x077\x02\x02\u02A8\u02AA\x05B\"\x02\u02A9\u02A7\x03\x02\x02\x02" + + "\u02A9\u02A8\x03\x02\x02\x02\u02AA5\x03\x02\x02\x02\u02AB\u02B0\x05*\x16" + + "\x02\u02AC\u02AD\x07\n\x02\x02\u02AD\u02AF\x05*\x16\x02\u02AE\u02AC\x03" + + "\x02\x02\x02\u02AF\u02B2\x03\x02\x02\x02\u02B0\u02AE\x03\x02\x02\x02\u02B0" + + "\u02B1\x03\x02\x02\x02\u02B17\x03\x02\x02\x02\u02B2\u02B0\x03\x02\x02" + + "\x02\u02B3\u02B4\x05D#\x02\u02B4\u02B5\x07\x07\x02\x02\u02B5\u02B6\x05" + + "*\x16\x02\u02B6\u02BA\x03\x02\x02\x02\u02B7\u02B8\x07(\x02\x02\u02B8\u02BA" + + "\x05*\x16\x02\u02B9\u02B3\x03\x02\x02\x02\u02B9\u02B7\x03\x02\x02\x02" + + "\u02BA9\x03\x02\x02\x02\u02BB\u02BE\x05B\"\x02\u02BC\u02BE\t\x05\x02\x02" + + "\u02BD\u02BB\x03\x02\x02\x02\u02BD\u02BC\x03\x02\x02\x02\u02BE;\x03\x02" + + "\x02\x02\u02BF\u02C2\x05B\"\x02\u02C0\u02C2\t\x06\x02\x02\u02C1\u02BF" + + "\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C2=\x03\x02\x02\x02\u02C3" + + "\u02C4\t\x07\x02\x02\u02C4?\x03\x02\x02\x02\u02C5\u02C6\t\b\x02\x02\u02C6" + + "A\x03\x02\x02\x02\u02C7\u02CC\x07C\x02\x02\u02C8\u02C9\x07)\x02\x02\u02C9" + + "\u02CB\x07C\x02\x02\u02CA\u02C8\x03\x02\x02\x02\u02CB\u02CE\x03\x02\x02" + + "\x02\u02CC\u02CA\x03\x02\x02\x02\u02CC\u02CD\x03\x02\x02\x02\u02CDC\x03" + + "\x02\x02\x02\u02CE\u02CC\x03\x02\x02\x02\u02CF\u02D4\x07C\x02\x02\u02D0" + + "\u02D1\x05B\"\x02\u02D1\u02D2\b#\x01\x02\u02D2\u02D4\x03\x02\x02\x02\u02D3" + + "\u02CF\x03\x02\x02\x02\u02D3\u02D0\x03\x02\x02\x02\u02D4E\x03\x02\x02" + + "\x02QIPYaz\x84\x87\x8C\x9B\xA2\xA6\xA9\xB6\xBD\xC0\xC7\xCD\xD2\xDD\xE5" + + "\xEB\xEF\xF1\xFC\xFE\u010D\u0115\u0124\u012C\u012E\u013F\u0142\u0145\u015C" + + "\u0160\u016B\u0175\u017D\u017F\u0189\u018C\u0197\u01A1\u01A3\u01A7\u01B0" + + "\u01C2\u01C6\u01D1\u01D5\u01E0\u01E4\u01EF\u01F3\u01FB\u0205\u0209\u0213" + + "\u0217\u0221\u0224\u0227\u0240\u0267\u026A\u027C\u027E\u0280\u028C\u0298" + + "\u029F\u02A3\u02A9\u02B0\u02B9\u02BD\u02C1\u02CC\u02D3"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4076,6 +4171,84 @@ export class TypeAliasDefContext extends TypeDefContext { } } } +export class TypeSumDefContext extends TypeDefContext { + public _typeName!: QualIdContext; + public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } + public typeSumVariant(): TypeSumVariantContext[]; + public typeSumVariant(i: number): TypeSumVariantContext; + public typeSumVariant(i?: number): TypeSumVariantContext | TypeSumVariantContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeSumVariantContext); + } else { + return this.getRuleContext(i, TypeSumVariantContext); + } + } + public qualId(): QualIdContext { + return this.getRuleContext(0, QualIdContext); + } + constructor(ctx: TypeDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeSumDef) { + listener.enterTypeSumDef(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeSumDef) { + listener.exitTypeSumDef(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeSumDef) { + return visitor.visitTypeSumDef(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeSumVariantContext extends ParserRuleContext { + public _sumLabel!: SimpleIdContext; + public simpleId(): SimpleIdContext { + return this.getRuleContext(0, SimpleIdContext); + } + public LPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LPAREN, 0); } + public type(): TypeContext | undefined { + return this.tryGetRuleContext(0, TypeContext); + } + public RPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.RPAREN, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeSumVariant; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeSumVariant) { + listener.enterTypeSumVariant(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeSumVariant) { + listener.exitTypeSumVariant(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeSumVariant) { + return visitor.visitTypeSumVariant(this); + } else { + return visitor.visitChildren(this); + } + } +} export class NondetOperDefContext extends ParserRuleContext { diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 736f1e6ff..062d7b797 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -23,6 +23,7 @@ import { TypeConstOrVarContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; +import { TypeSumDefContext } from "./QuintParser"; import { DotCallContext } from "./QuintParser"; import { LambdaConsContext } from "./QuintParser"; import { OperAppContext } from "./QuintParser"; @@ -67,6 +68,7 @@ import { DocumentedUnitContext } from "./QuintParser"; import { UnitContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeSumVariantContext } from "./QuintParser"; import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; import { ImportModContext } from "./QuintParser"; @@ -216,6 +218,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeAliasDef?: (ctx: TypeAliasDefContext) => Result; + /** + * Visit a parse tree produced by the `typeSumDef` + * labeled alternative in `QuintParser.typeDef`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeSumDef?: (ctx: TypeSumDefContext) => Result; + /** * Visit a parse tree produced by the `dotCall` * labeled alternative in `QuintParser.expr`. @@ -562,6 +572,13 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeDef?: (ctx: TypeDefContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.typeSumVariant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeSumVariant?: (ctx: TypeSumVariantContext) => Result; + /** * Visit a parse tree produced by `QuintParser.nondetOperDef`. * @param ctx the parse tree diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index be7c04172..7d1620239 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -29,7 +29,7 @@ import { import { QuintDef, QuintEx, isAnnotatedDef } from './quintIr' import { ExecutionFrame } from './runtime/trace' import { zerog } from './idGenerator' -import { QuintType, Row } from './quintTypes' +import { ConcreteFixedRow, QuintType, Row } from './quintTypes' import { TypeScheme } from './types/base' import { canonicalTypeScheme } from './types/printing' import { definitionToString, flattenRow, qualifierToString, rowToString } from './IRprinting' @@ -185,6 +185,9 @@ export function prettyQuintType(type: QuintType): Doc { } return group([text('{ '), prettyRow(type.fields), text('}')]) } + case 'sum': { + return group([text('{ '), prettySumRow(type.fields), text('}')]) + } case 'union': { const records = type.records.map(rec => { return group([ @@ -214,6 +217,19 @@ function prettyRow(row: Row, showFieldName = true): Doc { return group([nest(' ', [linebreak, docJoin([text(','), line()], fieldsDocs)]), ...otherDoc, linebreak]) } +function prettySumRow(row: ConcreteFixedRow): Doc { + const [fields, other] = flattenRow(row) + + const fieldsDocs = fields.map(f => { + if (other.kind === 'empty') { + return group(text(f.fieldName)) + } else { + return group([text(`${f.fieldName}(`), prettyQuintType(f.fieldType), text(')')]) + } + }) + + return group([nest(' ', [linebreak, docJoin([text(','), line()], fieldsDocs)]), linebreak]) +} /** * Print an execution frame and its children recursively. * Since this function is printing a tree, we need precise text alignment. diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 5bf00ae4b..6f5961714 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -12,7 +12,7 @@ import { QuintName, QuintOpDef, } from '../quintIr' -import { QuintType, Row } from '../quintTypes' +import { ConcreteFixedRow, QuintSumType, QuintType, Row, RowField, unitValue } from '../quintTypes' import { strict as assert } from 'assert' import { ErrorMessage, Loc } from './quintParserFrontend' import { compact, zipWith } from 'lodash' @@ -64,6 +64,8 @@ export class ToIrListener implements QuintListener { protected identOrStarStack: string[] = [] // the stack of rows for records and unions protected rowStack: Row[] = [] + // the stack of variants for a sum + protected variantStack: RowField[] = [] // an internal counter to assign unique numbers protected idGen: IdGenerator @@ -357,8 +359,8 @@ export class ToIrListener implements QuintListener { const id = this.getId(ctx) const def: QuintTypeDef = { - kind: 'typedef', id, + kind: 'typedef', name, type, } @@ -366,6 +368,50 @@ export class ToIrListener implements QuintListener { this.definitionStack.push(def) } + // type T = | A | B(t1) | C(t2) + exitTypeSumDef(ctx: p.TypeSumDefContext) { + const name = ctx._typeName!.text! + const defId = this.idGen.nextId() + this.sourceMap.set(defId, this.loc(ctx)) + + const typeId = this.idGen.nextId() + this.sourceMap.set(typeId, this.loc(ctx)) + + const fields: RowField[] = popMany(this.variantStack, this.variantStack.length) + const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } + const type: QuintSumType = { id: defId, kind: 'sum', fields: row } + + const def: QuintTypeDef = { + id: defId, + name, + kind: 'typedef', + type, + } + + this.definitionStack.push(def) + } + + exitTypeSumVariant(ctx: p.TypeSumVariantContext) { + const fieldName = ctx._sumLabel!.text! + const poppedType = this.popType().value + + let fieldType: QuintType + + // Check if we have an accompanying type, and if not, then synthesize the + // unit type. + // + // I.e., we interpert a variant `A` as `A({})`. + if (poppedType === undefined) { + const id = this.idGen.nextId() + this.sourceMap.set(id, this.loc(ctx)) + fieldType = unitValue(id) + } else { + fieldType = poppedType + } + + this.variantStack.push({ fieldName, fieldType }) + } + // module Foo = Proto(x = a, y = b) // module Foo = Proto(x = a, y = b) from "" exitInstanceMod(ctx: p.InstanceModContext) { diff --git a/quint/src/quintTypes.ts b/quint/src/quintTypes.ts index 5fa865ea0..065a41446 100644 --- a/quint/src/quintTypes.ts +++ b/quint/src/quintTypes.ts @@ -74,6 +74,24 @@ export interface QuintRecordType extends WithOptionalId { fields: Row } +// A value of the unit type, i.e. an empty record +export function unitValue(id: bigint): QuintRecordType { + return { + id, + kind: 'rec', + fields: { kind: 'row', fields: [], other: { kind: 'empty' } }, + } +} + +export function isTheUnit(r: QuintType): Boolean { + return r.kind === 'rec' && r.fields.kind === 'row' && r.fields.fields.length === 0 && r.fields.other.kind === 'empty' +} + +export interface QuintSumType extends WithOptionalId { + kind: 'sum' + fields: ConcreteFixedRow +} + export interface QuintUnionType extends WithOptionalId { kind: 'union' tag: string @@ -98,16 +116,27 @@ export type QuintType = | QuintOperType | QuintTupleType | QuintRecordType + | QuintSumType | QuintUnionType /** * Row types, used to express tuples and records. */ -export type ConcreteRow = { kind: 'row'; fields: { fieldName: string; fieldType: QuintType }[]; other: Row } +export type RowField = { fieldName: string; fieldType: QuintType } +export interface ConcreteRow { + kind: 'row' + fields: RowField[] + other: Row +} +export interface ConcreteFixedRow extends ConcreteRow { + kind: 'row' + fields: RowField[] + other: EmptyRow +} export type VarRow = { kind: 'var'; name: string } export type EmptyRow = { kind: 'empty' } -export type Row = ConcreteRow | VarRow | EmptyRow +export type Row = ConcreteFixedRow | ConcreteRow | VarRow | EmptyRow /* * Collects all type and row variable names from a given type diff --git a/quint/test/IRprinting.test.ts b/quint/test/IRprinting.test.ts index cf398cfd4..4013ad7e9 100644 --- a/quint/test/IRprinting.test.ts +++ b/quint/test/IRprinting.test.ts @@ -3,6 +3,7 @@ import { assert } from 'chai' import { buildDef, buildExpression, buildModuleWithDefs, buildType } from './builders/ir' import { definitionToString, expressionToString, moduleToString, typeToString } from '../src/IRprinting' import { toScheme } from '../src/types/base' +import { QuintSumType, unitValue } from '../src' describe('moduleToString', () => { const quintModule = buildModuleWithDefs(['var S: Set[int]', 'val f = S.filter(x => x + 1)']) @@ -219,6 +220,22 @@ describe('typeToString', () => { assert.deepEqual(typeToString(type), expectedType) }) + it('pretty prints sum types', () => { + const type: QuintSumType = { + kind: 'sum', + fields: { + kind: 'row', + fields: [ + { fieldName: 'A', fieldType: { kind: 'int', id: 0n } }, + { fieldName: 'B', fieldType: unitValue(0n) }, + ], + other: { kind: 'empty' }, + }, + } + const expectedType = '| A(int)\n| B' + assert.deepEqual(typeToString(type), expectedType) + }) + it('pretty prints union types', () => { const type = buildType('| { tag: "A", a: int } | { tag: "B", b: str }') const expectedType = '| { tag: "A", a: int }\n| { tag: "B", b: str }' diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 426b83eda..3dc443781 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -15,6 +15,7 @@ import { right } from '@sweet-monads/either' import { newIdGenerator } from '../../src/idGenerator' import { collectIds } from '../util' import { fileSourceResolver } from '../../src/parsing/sourceResolver' +import { isTheUnit } from '../../src' // read a Quint file from the test data directory function readQuint(name: string): string { @@ -128,6 +129,27 @@ describe('parsing', () => { it('parses out of order definitions', () => { parseAndCompare('_0099unorderedDefs') }) + + it('parses sum types', () => { + const mod = ` + module SumTypes { + type T = + | A + | B(int) + } + ` + const result = parsePhase1fromText(newIdGenerator(), mod, 'test') + assert(result.isRight()) + const typeDef = result.value.modules[0].defs[0] + assert(typeDef.kind === 'typedef') + const sumType = typeDef.type! + assert(sumType.kind === 'sum') + const [variantA, variantB] = sumType.fields.fields + assert(variantA.fieldName === 'A') + assert(isTheUnit(variantA.fieldType)) + assert(variantB.fieldName === 'B') + assert(variantB.fieldType.kind === 'int') + }) }) describe('parse errors', () => { diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 7dc3fc500..82e0aaa6e 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M1","defs":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","defs":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":11,"name":"Proto","defs":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":503,"name":"withConsts","defs":[{"id":102,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":101,"kind":"app","opcode":"ipow","args":[{"id":99,"kind":"int","value":2},{"id":100,"kind":"int","value":3}]}},{"id":105,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"iuminus","args":[{"id":103,"kind":"int","value":100}]}},{"id":109,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"igt","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"igte","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ilt","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":121,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":120,"kind":"app","opcode":"ilte","args":[{"id":118,"kind":"int","value":2},{"id":119,"kind":"int","value":3}]}},{"id":125,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":124,"kind":"app","opcode":"eq","args":[{"id":122,"kind":"int","value":2},{"id":123,"kind":"int","value":3}]}},{"id":129,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":128,"kind":"app","opcode":"neq","args":[{"id":126,"kind":"int","value":2},{"id":127,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":135,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"eq","args":[{"id":132,"kind":"app","opcode":"iadd","args":[{"id":130,"kind":"int","value":2},{"id":131,"kind":"int","value":2}]},{"id":133,"kind":"int","value":4}]}},{"id":139,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"in","args":[{"id":136,"kind":"int","value":1},{"id":137,"kind":"name","name":"Nat"}]}},{"id":151,"kind":"def","name":"withType","qualifier":"val","expr":{"id":150,"kind":"app","opcode":"Set","args":[{"id":148,"kind":"int","value":1},{"id":149,"kind":"int","value":2}]},"typeAnnotation":{"id":147,"kind":"set","elem":{"id":146,"kind":"int"}}},{"id":152,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":157,"kind":"int"},"id":158},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":160,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":159,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":197,"kind":"int"},"id":198},{"id":219,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":218,"kind":"app","opcode":"and","args":[{"id":216,"kind":"bool","value":false},{"id":217,"kind":"bool","value":true}]}},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":223,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":222,"kind":"app","opcode":"or","args":[{"id":220,"kind":"bool","value":false},{"id":221,"kind":"bool","value":true}]}},{"id":227,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":226,"kind":"app","opcode":"implies","args":[{"id":224,"kind":"bool","value":false},{"id":225,"kind":"bool","value":true}]}},{"id":256,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":255,"kind":"app","opcode":"and","args":[{"id":252,"kind":"bool","value":false},{"id":253,"kind":"bool","value":true},{"id":254,"kind":"bool","value":false}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":261,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":260,"kind":"app","opcode":"actionAll","args":[{"id":257,"kind":"bool","value":false},{"id":258,"kind":"bool","value":true},{"id":259,"kind":"bool","value":false}]}},{"id":266,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":265,"kind":"app","opcode":"or","args":[{"id":262,"kind":"bool","value":false},{"id":263,"kind":"bool","value":true},{"id":264,"kind":"bool","value":false}]}},{"id":271,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":270,"kind":"app","opcode":"actionAny","args":[{"id":267,"kind":"bool","value":false},{"id":268,"kind":"bool","value":true},{"id":269,"kind":"bool","value":false}]}},{"id":276,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":275,"kind":"app","opcode":"ite","args":[{"id":272,"kind":"bool","value":true},{"id":273,"kind":"int","value":1},{"id":274,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":292,"kind":"fun","arg":{"id":290,"kind":"str"},"res":{"id":291,"kind":"int"}},"id":293},{"id":301,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":301,"kind":"lambda","params":[{"id":298,"name":"a"},{"id":299,"name":"b"}],"qualifier":"def","expr":{"id":300,"kind":"int","value":1}}},{"id":313,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":312,"kind":"app","opcode":"in","args":[{"id":310,"kind":"int","value":1},{"id":311,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":358,"kind":"def","name":"one","qualifier":"val","expr":{"id":357,"kind":"app","opcode":"head","args":[{"id":356,"kind":"app","opcode":"List","args":[{"id":354,"kind":"int","value":1},{"id":355,"kind":"int","value":2}]}]}},{"id":363,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":362,"kind":"app","opcode":"Tup","args":[{"id":359,"kind":"int","value":1},{"id":360,"kind":"int","value":2},{"id":361,"kind":"int","value":3}]}},{"id":368,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"Tup","args":[{"id":364,"kind":"int","value":1},{"id":365,"kind":"int","value":2},{"id":366,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":372,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":371,"kind":"app","opcode":"Tup","args":[{"id":369,"kind":"int","value":4},{"id":370,"kind":"int","value":5}]}},{"id":377,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":376,"kind":"app","opcode":"List","args":[{"id":373,"kind":"int","value":1},{"id":374,"kind":"int","value":2},{"id":375,"kind":"int","value":3}]}},{"id":382,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":381,"kind":"app","opcode":"List","args":[{"id":378,"kind":"int","value":1},{"id":379,"kind":"int","value":2},{"id":380,"kind":"int","value":3}]}},{"id":389,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":388,"kind":"app","opcode":"nth","args":[{"id":386,"kind":"app","opcode":"List","args":[{"id":383,"kind":"int","value":2},{"id":384,"kind":"int","value":3},{"id":385,"kind":"int","value":4}]},{"id":387,"kind":"int","value":2}]}},{"id":395,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":394,"kind":"app","opcode":"Rec","args":[{"id":391,"kind":"str","value":"name"},{"id":390,"kind":"str","value":"igor"},{"id":393,"kind":"str","value":"year"},{"id":392,"kind":"int","value":1981}]}},{"id":401,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":400,"kind":"app","opcode":"Rec","args":[{"id":396,"kind":"str","value":"name"},{"id":397,"kind":"str","value":"igor"},{"id":398,"kind":"str","value":"year"},{"id":399,"kind":"int","value":1981}]}},{"id":414,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Set","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":443,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"in","args":[{"id":440,"kind":"int","value":2},{"id":441,"kind":"app","opcode":"Set","args":[]}]}},{"id":447,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"subseteq","args":[{"id":444,"kind":"app","opcode":"Set","args":[]},{"id":445,"kind":"app","opcode":"Set","args":[]}]}},{"id":456,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"in","args":[{"id":449,"kind":"app","opcode":"Set","args":[{"id":448,"kind":"int","value":1}]},{"id":454,"kind":"app","opcode":"powerset","args":[{"id":453,"kind":"app","opcode":"Set","args":[{"id":450,"kind":"int","value":1},{"id":451,"kind":"int","value":2},{"id":452,"kind":"int","value":3}]}]}]}},{"kind":"typedef","id":469,"name":"INT_SET","type":{"id":468,"kind":"set","elem":{"id":467,"kind":"int"}}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":470,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"typedef","id":482,"name":"ENTRY_TYPE","type":{"id":481,"kind":"union","tag":"tag","records":[{"tagValue":"Cat","fields":{"kind":"row","fields":[{"fieldName":"name","fieldType":{"id":476,"kind":"str"}},{"fieldName":"year","fieldType":{"id":477,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"Date","fields":{"kind":"row","fields":[{"fieldName":"day","fieldType":{"id":478,"kind":"int"}},{"fieldName":"month","fieldType":{"id":479,"kind":"int"}},{"fieldName":"year","fieldType":{"id":480,"kind":"int"}}],"other":{"kind":"empty"}}}]}},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":67,"kind":"union","tag":"tag","records":[{"tagValue":"circle","fields":{"kind":"row","fields":[{"fieldName":"radius","fieldType":{"id":63,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"rectangle","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"dog","fields":{"kind":"row","fields":[{"fieldName":"name","fieldType":{"id":66,"kind":"str"}}],"other":{"kind":"empty"}}}]},"id":68},{"kind":"const","name":"MyUnionWithComma","typeAnnotation":{"id":73,"kind":"union","tag":"tag","records":[{"tagValue":"circle","fields":{"kind":"row","fields":[{"fieldName":"radius","fieldType":{"id":69,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"rectangle","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":70,"kind":"int"}},{"fieldName":"height","fieldType":{"id":71,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"dog","fields":{"kind":"row","fields":[{"fieldName":"name","fieldType":{"id":72,"kind":"str"}}],"other":{"kind":"empty"}}}]},"id":74},{"kind":"var","name":"i","typeAnnotation":{"id":75,"kind":"int"},"id":76},{"kind":"var","name":"j","typeAnnotation":{"id":77,"kind":"bool"},"id":78},{"id":82,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":81,"kind":"app","opcode":"iadd","args":[{"id":79,"kind":"int","value":1},{"id":80,"kind":"int","value":2}]}},{"id":86,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":85,"kind":"app","opcode":"isub","args":[{"id":83,"kind":"int","value":1},{"id":84,"kind":"int","value":2}]}},{"id":90,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":89,"kind":"app","opcode":"imul","args":[{"id":87,"kind":"int","value":2},{"id":88,"kind":"int","value":3}]}},{"id":94,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":93,"kind":"app","opcode":"idiv","args":[{"id":91,"kind":"int","value":2},{"id":92,"kind":"int","value":3}]}},{"id":98,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":97,"kind":"app","opcode":"imod","args":[{"id":95,"kind":"int","value":2},{"id":96,"kind":"int","value":3}]}},{"id":145,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":144,"kind":"app","opcode":"exists","args":[{"id":140,"kind":"name","name":"Bool"},{"id":143,"kind":"lambda","params":[{"id":141,"name":"x"}],"qualifier":"def","expr":{"id":142,"kind":"name","name":"x"}}]}},{"id":156,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":155,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":154,"kind":"set","elem":{"id":153,"kind":"const","name":"PROC"}}},{"id":166,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":166,"kind":"lambda","params":[{"id":161,"name":"x"},{"id":162,"name":"y"}],"qualifier":"puredef","expr":{"id":165,"kind":"app","opcode":"iadd","args":[{"id":163,"kind":"name","name":"x"},{"id":164,"kind":"name","name":"y"}]}}},{"id":171,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":171,"kind":"lambda","params":[{"id":167,"name":"factor"}],"qualifier":"def","expr":{"id":170,"kind":"app","opcode":"imul","args":[{"id":168,"kind":"name","name":"factor"},{"id":169,"kind":"name","name":"n"}]}}},{"id":176,"kind":"def","name":"A","qualifier":"action","expr":{"id":176,"kind":"lambda","params":[{"id":172,"name":"x"}],"qualifier":"action","expr":{"id":175,"kind":"app","opcode":"assign","args":[{"id":174,"kind":"name","name":"n"},{"id":173,"kind":"name","name":"x"}]}}},{"id":180,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":177,"name":"x"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"not","args":[{"id":178,"kind":"name","name":"x"}]}}},{"id":190,"kind":"def","name":"H","qualifier":"def","expr":{"id":190,"kind":"lambda","params":[{"id":181,"name":"x"},{"id":182,"name":"y"}],"qualifier":"def","expr":{"id":189,"kind":"app","opcode":"iadd","args":[{"id":187,"kind":"name","name":"x"},{"id":188,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":186,"kind":"oper","args":[{"id":183,"kind":"int"},{"id":184,"kind":"int"}],"res":{"id":185,"kind":"int"}}},{"id":196,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":196,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"def","expr":{"id":195,"kind":"name","name":"x"}},"typeAnnotation":{"id":194,"kind":"oper","args":[{"id":192,"kind":"var","name":"a"}],"res":{"id":193,"kind":"var","name":"a"}}},{"id":202,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":201,"kind":"app","opcode":"assign","args":[{"id":200,"kind":"name","name":"k"},{"id":199,"kind":"int","value":3}]}},{"id":215,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":215,"kind":"lambda","params":[{"id":203,"name":"x"},{"id":205,"name":"y"}],"qualifier":"puredef","expr":{"id":213,"kind":"app","opcode":"ite","args":[{"id":210,"kind":"app","opcode":"ilt","args":[{"id":208,"kind":"name","name":"x"},{"id":209,"kind":"name","name":"y"}]},{"id":211,"kind":"name","name":"x"},{"id":212,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":204,"kind":"int"},{"id":206,"kind":"int"}],"res":{"id":207,"kind":"int"}}},{"id":230,"kind":"def","name":"F","qualifier":"def","expr":{"id":230,"kind":"lambda","params":[{"id":228,"name":"x"}],"qualifier":"def","expr":{"id":229,"kind":"name","name":"x"}}},{"id":289,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":289,"kind":"lambda","params":[{"id":277,"name":"x"},{"id":278,"name":"y"}],"qualifier":"def","expr":{"id":288,"kind":"app","opcode":"ite","args":[{"id":281,"kind":"app","opcode":"ilt","args":[{"id":279,"kind":"name","name":"x"},{"id":280,"kind":"int","value":10}]},{"id":284,"kind":"app","opcode":"iadd","args":[{"id":282,"kind":"name","name":"y"},{"id":283,"kind":"int","value":5}]},{"id":287,"kind":"app","opcode":"imod","args":[{"id":285,"kind":"name","name":"y"},{"id":286,"kind":"int","value":5}]}]}}},{"id":297,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":296,"kind":"app","opcode":"get","args":[{"id":294,"kind":"name","name":"f1"},{"id":295,"kind":"str","value":"a"}]}},{"id":305,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":304,"kind":"app","opcode":"MyOper","args":[{"id":302,"kind":"str","value":"a"},{"id":303,"kind":"int","value":42}]}},{"id":309,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":308,"kind":"app","opcode":"MyOper","args":[{"id":306,"kind":"str","value":"a"},{"id":307,"kind":"int","value":42}]}},{"id":321,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":320,"kind":"app","opcode":"filter","args":[{"id":314,"kind":"name","name":"S"},{"id":319,"kind":"lambda","params":[{"id":315,"name":"x"}],"qualifier":"def","expr":{"id":318,"kind":"app","opcode":"igt","args":[{"id":316,"kind":"name","name":"x"},{"id":317,"kind":"int","value":10}]}}]}},{"id":339,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"filter","args":[{"id":334,"kind":"name","name":"S"},{"id":337,"kind":"lambda","params":[{"id":335,"name":"_"}],"qualifier":"def","expr":{"id":336,"kind":"bool","value":true}}]}},{"id":347,"kind":"def","name":"f","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"mapBy","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"iadd","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":1}]}}]}},{"id":353,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":352,"kind":"app","opcode":"exclude","args":[{"id":348,"kind":"name","name":"S"},{"id":351,"kind":"app","opcode":"Set","args":[{"id":349,"kind":"int","value":3},{"id":350,"kind":"int","value":4}]}]}},{"id":409,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"with","args":[{"id":407,"kind":"app","opcode":"with","args":[{"id":406,"kind":"name","name":"test_record"},{"id":403,"kind":"str","value":"name"},{"id":402,"kind":"str","value":"quint"}]},{"id":405,"kind":"str","value":"year"},{"id":404,"kind":"int","value":2023}]}},{"id":425,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":424,"kind":"let","opdef":{"id":420,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":419,"kind":"app","opcode":"Rec","args":[{"id":416,"kind":"str","value":"a"},{"id":415,"kind":"int","value":1},{"id":418,"kind":"str","value":"b"},{"id":417,"kind":"str","value":"foo"}]}},"expr":{"id":423,"kind":"app","opcode":"field","args":[{"id":421,"kind":"name","name":"my_rec"},{"id":422,"kind":"str","value":"a"}]}}},{"id":434,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":433,"kind":"let","opdef":{"id":429,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Tup","args":[{"id":426,"kind":"str","value":"a"},{"id":427,"kind":"int","value":3}]}},"expr":{"id":432,"kind":"app","opcode":"item","args":[{"id":430,"kind":"name","name":"my_tup"},{"id":431,"kind":"int","value":2}]}}},{"id":439,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":439,"kind":"lambda","params":[{"id":435,"name":"s"}],"qualifier":"def","expr":{"id":438,"kind":"app","opcode":"eq","args":[{"id":436,"kind":"name","name":"s"},{"id":437,"kind":"app","opcode":"List","args":[]}]}}},{"id":460,"kind":"assume","name":"positive","assumption":{"id":459,"kind":"app","opcode":"igt","args":[{"id":457,"kind":"name","name":"N"},{"id":458,"kind":"int","value":0}]}},{"id":464,"kind":"assume","name":"_","assumption":{"id":463,"kind":"app","opcode":"neq","args":[{"id":461,"kind":"name","name":"N"},{"id":462,"kind":"int","value":0}]}},{"id":465,"kind":"import","defName":"foo","protoName":"M1"},{"id":466,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":471,"kind":"const","name":"INT_SET"},"id":472},{"id":475,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":474,"name":"N"},{"id":473,"kind":"name","name":"N"}]],"identityOverride":false},{"id":502,"kind":"def","name":"isValid","qualifier":"def","expr":{"id":502,"kind":"lambda","params":[{"id":483,"name":"entry"}],"qualifier":"def","expr":{"id":501,"kind":"app","opcode":"unionMatch","args":[{"id":484,"kind":"name","name":"entry"},{"id":497,"kind":"str","value":"Cat"},{"id":498,"kind":"lambda","params":[{"id":485,"name":"cat"}],"qualifier":"def","expr":{"id":490,"kind":"app","opcode":"neq","args":[{"id":488,"kind":"app","opcode":"field","args":[{"id":486,"kind":"name","name":"cat"},{"id":487,"kind":"str","value":"name"}]},{"id":489,"kind":"str","value":""}]}},{"id":499,"kind":"str","value":"Date"},{"id":500,"kind":"lambda","params":[{"id":491,"name":"date"}],"qualifier":"def","expr":{"id":496,"kind":"app","opcode":"igt","args":[{"id":494,"kind":"app","opcode":"field","args":[{"id":492,"kind":"name","name":"date"},{"id":493,"kind":"str","value":"year"}]},{"id":495,"kind":"int","value":0}]}}]}}},{"id":237,"kind":"def","name":"G","qualifier":"val","expr":{"id":237,"kind":"lambda","params":[{"id":231,"name":"x"}],"qualifier":"val","expr":{"id":236,"kind":"app","opcode":"and","args":[{"id":233,"kind":"app","opcode":"F","args":[{"id":232,"kind":"name","name":"x"}]},{"id":235,"kind":"app","opcode":"not","args":[{"id":234,"kind":"name","name":"x"}]}]}}},{"id":244,"kind":"def","name":"test_and_arg","qualifier":"val","expr":{"id":244,"kind":"lambda","params":[{"id":238,"name":"x"}],"qualifier":"val","expr":{"id":243,"kind":"app","opcode":"and","args":[{"id":240,"kind":"app","opcode":"F","args":[{"id":239,"kind":"name","name":"x"}]},{"id":242,"kind":"app","opcode":"not","args":[{"id":241,"kind":"name","name":"x"}]}]}}},{"id":251,"kind":"def","name":"test_or_arg","qualifier":"val","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"val","expr":{"id":250,"kind":"app","opcode":"or","args":[{"id":247,"kind":"app","opcode":"F","args":[{"id":246,"kind":"name","name":"x"}]},{"id":249,"kind":"app","opcode":"not","args":[{"id":248,"kind":"name","name":"x"}]}]}}},{"id":333,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":332,"kind":"let","opdef":{"id":324,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":323,"kind":"app","opcode":"oneOf","args":[{"id":322,"kind":"name","name":"S"}]}},"expr":{"id":331,"kind":"app","opcode":"actionAll","args":[{"id":327,"kind":"app","opcode":"igt","args":[{"id":325,"kind":"name","name":"x"},{"id":326,"kind":"int","value":10}]},{"id":330,"kind":"app","opcode":"assign","args":[{"id":329,"kind":"name","name":"k"},{"id":328,"kind":"name","name":"x"}]}]}}}]}],"table":{"142":{"kind":"param","reference":141},"153":{"kind":"type","reference":152},"163":{"kind":"param","reference":161},"164":{"kind":"param","reference":162},"168":{"kind":"param","reference":167},"169":{"kind":"var","reference":158,"typeAnnotation":{"id":157,"kind":"int"}},"173":{"kind":"param","reference":172},"174":{"kind":"var","reference":158,"typeAnnotation":{"id":157,"kind":"int"}},"178":{"kind":"param","reference":177},"187":{"kind":"param","reference":181},"188":{"kind":"param","reference":182},"195":{"kind":"param","reference":191},"200":{"kind":"var","reference":198,"typeAnnotation":{"id":197,"kind":"int"}},"208":{"kind":"param","reference":203},"209":{"kind":"param","reference":205},"211":{"kind":"param","reference":203},"212":{"kind":"param","reference":205},"229":{"kind":"param","reference":228},"232":{"kind":"param","reference":231},"233":{"kind":"def","reference":230},"234":{"kind":"param","reference":231},"239":{"kind":"param","reference":238},"240":{"kind":"def","reference":230},"241":{"kind":"param","reference":238},"246":{"kind":"param","reference":245},"247":{"kind":"def","reference":230},"248":{"kind":"param","reference":245},"279":{"kind":"param","reference":277},"282":{"kind":"param","reference":278},"285":{"kind":"param","reference":278},"294":{"kind":"var","reference":293,"typeAnnotation":{"id":292,"kind":"fun","arg":{"id":290,"kind":"str"},"res":{"id":291,"kind":"int"}}},"304":{"kind":"def","reference":301},"308":{"kind":"def","reference":301},"314":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"316":{"kind":"param","reference":315},"322":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"325":{"kind":"def","reference":324},"328":{"kind":"def","reference":324},"329":{"kind":"var","reference":198,"typeAnnotation":{"id":197,"kind":"int"}},"334":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"340":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"342":{"kind":"param","reference":341},"348":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"406":{"kind":"def","reference":395},"421":{"kind":"def","reference":420},"430":{"kind":"def","reference":429},"436":{"kind":"param","reference":435},"457":{"kind":"const","reference":13,"typeAnnotation":{"id":12,"kind":"int"}},"461":{"kind":"const","reference":13,"typeAnnotation":{"id":12,"kind":"int"}},"471":{"kind":"type","reference":469,"typeAnnotation":{"id":468,"kind":"set","elem":{"id":467,"kind":"int"}}},"473":{"kind":"const","reference":13,"typeAnnotation":{"id":12,"kind":"int"}},"474":{"kind":"const","reference":473,"typeAnnotation":{"id":7,"kind":"int"}},"484":{"kind":"param","reference":483},"486":{"kind":"param","reference":485},"492":{"kind":"param","reference":491}}} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M1","defs":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","defs":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":11,"name":"Proto","defs":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":503,"name":"withConsts","defs":[{"id":102,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":101,"kind":"app","opcode":"ipow","args":[{"id":99,"kind":"int","value":2},{"id":100,"kind":"int","value":3}]}},{"id":105,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"iuminus","args":[{"id":103,"kind":"int","value":100}]}},{"id":109,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"igt","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"igte","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ilt","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":121,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":120,"kind":"app","opcode":"ilte","args":[{"id":118,"kind":"int","value":2},{"id":119,"kind":"int","value":3}]}},{"id":125,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":124,"kind":"app","opcode":"eq","args":[{"id":122,"kind":"int","value":2},{"id":123,"kind":"int","value":3}]}},{"id":129,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":128,"kind":"app","opcode":"neq","args":[{"id":126,"kind":"int","value":2},{"id":127,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":135,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"eq","args":[{"id":132,"kind":"app","opcode":"iadd","args":[{"id":130,"kind":"int","value":2},{"id":131,"kind":"int","value":2}]},{"id":133,"kind":"int","value":4}]}},{"id":139,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"in","args":[{"id":136,"kind":"int","value":1},{"id":137,"kind":"name","name":"Nat"}]}},{"id":151,"kind":"def","name":"withType","qualifier":"val","expr":{"id":150,"kind":"app","opcode":"Set","args":[{"id":148,"kind":"int","value":1},{"id":149,"kind":"int","value":2}]},"typeAnnotation":{"id":147,"kind":"set","elem":{"id":146,"kind":"int"}}},{"id":152,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":157,"kind":"int"},"id":158},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":160,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":159,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":197,"kind":"int"},"id":198},{"id":219,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":218,"kind":"app","opcode":"and","args":[{"id":216,"kind":"bool","value":false},{"id":217,"kind":"bool","value":true}]}},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":223,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":222,"kind":"app","opcode":"or","args":[{"id":220,"kind":"bool","value":false},{"id":221,"kind":"bool","value":true}]}},{"id":227,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":226,"kind":"app","opcode":"implies","args":[{"id":224,"kind":"bool","value":false},{"id":225,"kind":"bool","value":true}]}},{"id":256,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":255,"kind":"app","opcode":"and","args":[{"id":252,"kind":"bool","value":false},{"id":253,"kind":"bool","value":true},{"id":254,"kind":"bool","value":false}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":261,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":260,"kind":"app","opcode":"actionAll","args":[{"id":257,"kind":"bool","value":false},{"id":258,"kind":"bool","value":true},{"id":259,"kind":"bool","value":false}]}},{"id":266,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":265,"kind":"app","opcode":"or","args":[{"id":262,"kind":"bool","value":false},{"id":263,"kind":"bool","value":true},{"id":264,"kind":"bool","value":false}]}},{"id":271,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":270,"kind":"app","opcode":"actionAny","args":[{"id":267,"kind":"bool","value":false},{"id":268,"kind":"bool","value":true},{"id":269,"kind":"bool","value":false}]}},{"id":276,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":275,"kind":"app","opcode":"ite","args":[{"id":272,"kind":"bool","value":true},{"id":273,"kind":"int","value":1},{"id":274,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":292,"kind":"fun","arg":{"id":290,"kind":"str"},"res":{"id":291,"kind":"int"}},"id":293},{"id":301,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":301,"kind":"lambda","params":[{"id":298,"name":"a"},{"id":299,"name":"b"}],"qualifier":"def","expr":{"id":300,"kind":"int","value":1}}},{"id":313,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":312,"kind":"app","opcode":"in","args":[{"id":310,"kind":"int","value":1},{"id":311,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":358,"kind":"def","name":"one","qualifier":"val","expr":{"id":357,"kind":"app","opcode":"head","args":[{"id":356,"kind":"app","opcode":"List","args":[{"id":354,"kind":"int","value":1},{"id":355,"kind":"int","value":2}]}]}},{"id":363,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":362,"kind":"app","opcode":"Tup","args":[{"id":359,"kind":"int","value":1},{"id":360,"kind":"int","value":2},{"id":361,"kind":"int","value":3}]}},{"id":368,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"Tup","args":[{"id":364,"kind":"int","value":1},{"id":365,"kind":"int","value":2},{"id":366,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":372,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":371,"kind":"app","opcode":"Tup","args":[{"id":369,"kind":"int","value":4},{"id":370,"kind":"int","value":5}]}},{"id":377,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":376,"kind":"app","opcode":"List","args":[{"id":373,"kind":"int","value":1},{"id":374,"kind":"int","value":2},{"id":375,"kind":"int","value":3}]}},{"id":382,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":381,"kind":"app","opcode":"List","args":[{"id":378,"kind":"int","value":1},{"id":379,"kind":"int","value":2},{"id":380,"kind":"int","value":3}]}},{"id":389,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":388,"kind":"app","opcode":"nth","args":[{"id":386,"kind":"app","opcode":"List","args":[{"id":383,"kind":"int","value":2},{"id":384,"kind":"int","value":3},{"id":385,"kind":"int","value":4}]},{"id":387,"kind":"int","value":2}]}},{"id":395,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":394,"kind":"app","opcode":"Rec","args":[{"id":391,"kind":"str","value":"name"},{"id":390,"kind":"str","value":"igor"},{"id":393,"kind":"str","value":"year"},{"id":392,"kind":"int","value":1981}]}},{"id":401,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":400,"kind":"app","opcode":"Rec","args":[{"id":396,"kind":"str","value":"name"},{"id":397,"kind":"str","value":"igor"},{"id":398,"kind":"str","value":"year"},{"id":399,"kind":"int","value":1981}]}},{"id":414,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Set","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":443,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"in","args":[{"id":440,"kind":"int","value":2},{"id":441,"kind":"app","opcode":"Set","args":[]}]}},{"id":447,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"subseteq","args":[{"id":444,"kind":"app","opcode":"Set","args":[]},{"id":445,"kind":"app","opcode":"Set","args":[]}]}},{"id":456,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"in","args":[{"id":449,"kind":"app","opcode":"Set","args":[{"id":448,"kind":"int","value":1}]},{"id":454,"kind":"app","opcode":"powerset","args":[{"id":453,"kind":"app","opcode":"Set","args":[{"id":450,"kind":"int","value":1},{"id":451,"kind":"int","value":2},{"id":452,"kind":"int","value":3}]}]}]}},{"id":469,"kind":"typedef","name":"INT_SET","type":{"id":468,"kind":"set","elem":{"id":467,"kind":"int"}}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":470,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"id":482,"kind":"typedef","name":"ENTRY_TYPE","type":{"id":481,"kind":"union","tag":"tag","records":[{"tagValue":"Cat","fields":{"kind":"row","fields":[{"fieldName":"name","fieldType":{"id":476,"kind":"str"}},{"fieldName":"year","fieldType":{"id":477,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"Date","fields":{"kind":"row","fields":[{"fieldName":"day","fieldType":{"id":478,"kind":"int"}},{"fieldName":"month","fieldType":{"id":479,"kind":"int"}},{"fieldName":"year","fieldType":{"id":480,"kind":"int"}}],"other":{"kind":"empty"}}}]}},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":67,"kind":"union","tag":"tag","records":[{"tagValue":"circle","fields":{"kind":"row","fields":[{"fieldName":"radius","fieldType":{"id":63,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"rectangle","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"dog","fields":{"kind":"row","fields":[{"fieldName":"name","fieldType":{"id":66,"kind":"str"}}],"other":{"kind":"empty"}}}]},"id":68},{"kind":"const","name":"MyUnionWithComma","typeAnnotation":{"id":73,"kind":"union","tag":"tag","records":[{"tagValue":"circle","fields":{"kind":"row","fields":[{"fieldName":"radius","fieldType":{"id":69,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"rectangle","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":70,"kind":"int"}},{"fieldName":"height","fieldType":{"id":71,"kind":"int"}}],"other":{"kind":"empty"}}},{"tagValue":"dog","fields":{"kind":"row","fields":[{"fieldName":"name","fieldType":{"id":72,"kind":"str"}}],"other":{"kind":"empty"}}}]},"id":74},{"kind":"var","name":"i","typeAnnotation":{"id":75,"kind":"int"},"id":76},{"kind":"var","name":"j","typeAnnotation":{"id":77,"kind":"bool"},"id":78},{"id":82,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":81,"kind":"app","opcode":"iadd","args":[{"id":79,"kind":"int","value":1},{"id":80,"kind":"int","value":2}]}},{"id":86,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":85,"kind":"app","opcode":"isub","args":[{"id":83,"kind":"int","value":1},{"id":84,"kind":"int","value":2}]}},{"id":90,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":89,"kind":"app","opcode":"imul","args":[{"id":87,"kind":"int","value":2},{"id":88,"kind":"int","value":3}]}},{"id":94,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":93,"kind":"app","opcode":"idiv","args":[{"id":91,"kind":"int","value":2},{"id":92,"kind":"int","value":3}]}},{"id":98,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":97,"kind":"app","opcode":"imod","args":[{"id":95,"kind":"int","value":2},{"id":96,"kind":"int","value":3}]}},{"id":145,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":144,"kind":"app","opcode":"exists","args":[{"id":140,"kind":"name","name":"Bool"},{"id":143,"kind":"lambda","params":[{"id":141,"name":"x"}],"qualifier":"def","expr":{"id":142,"kind":"name","name":"x"}}]}},{"id":156,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":155,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":154,"kind":"set","elem":{"id":153,"kind":"const","name":"PROC"}}},{"id":166,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":166,"kind":"lambda","params":[{"id":161,"name":"x"},{"id":162,"name":"y"}],"qualifier":"puredef","expr":{"id":165,"kind":"app","opcode":"iadd","args":[{"id":163,"kind":"name","name":"x"},{"id":164,"kind":"name","name":"y"}]}}},{"id":171,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":171,"kind":"lambda","params":[{"id":167,"name":"factor"}],"qualifier":"def","expr":{"id":170,"kind":"app","opcode":"imul","args":[{"id":168,"kind":"name","name":"factor"},{"id":169,"kind":"name","name":"n"}]}}},{"id":176,"kind":"def","name":"A","qualifier":"action","expr":{"id":176,"kind":"lambda","params":[{"id":172,"name":"x"}],"qualifier":"action","expr":{"id":175,"kind":"app","opcode":"assign","args":[{"id":174,"kind":"name","name":"n"},{"id":173,"kind":"name","name":"x"}]}}},{"id":180,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":177,"name":"x"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"not","args":[{"id":178,"kind":"name","name":"x"}]}}},{"id":190,"kind":"def","name":"H","qualifier":"def","expr":{"id":190,"kind":"lambda","params":[{"id":181,"name":"x"},{"id":182,"name":"y"}],"qualifier":"def","expr":{"id":189,"kind":"app","opcode":"iadd","args":[{"id":187,"kind":"name","name":"x"},{"id":188,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":186,"kind":"oper","args":[{"id":183,"kind":"int"},{"id":184,"kind":"int"}],"res":{"id":185,"kind":"int"}}},{"id":196,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":196,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"def","expr":{"id":195,"kind":"name","name":"x"}},"typeAnnotation":{"id":194,"kind":"oper","args":[{"id":192,"kind":"var","name":"a"}],"res":{"id":193,"kind":"var","name":"a"}}},{"id":202,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":201,"kind":"app","opcode":"assign","args":[{"id":200,"kind":"name","name":"k"},{"id":199,"kind":"int","value":3}]}},{"id":215,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":215,"kind":"lambda","params":[{"id":203,"name":"x"},{"id":205,"name":"y"}],"qualifier":"puredef","expr":{"id":213,"kind":"app","opcode":"ite","args":[{"id":210,"kind":"app","opcode":"ilt","args":[{"id":208,"kind":"name","name":"x"},{"id":209,"kind":"name","name":"y"}]},{"id":211,"kind":"name","name":"x"},{"id":212,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":204,"kind":"int"},{"id":206,"kind":"int"}],"res":{"id":207,"kind":"int"}}},{"id":230,"kind":"def","name":"F","qualifier":"def","expr":{"id":230,"kind":"lambda","params":[{"id":228,"name":"x"}],"qualifier":"def","expr":{"id":229,"kind":"name","name":"x"}}},{"id":289,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":289,"kind":"lambda","params":[{"id":277,"name":"x"},{"id":278,"name":"y"}],"qualifier":"def","expr":{"id":288,"kind":"app","opcode":"ite","args":[{"id":281,"kind":"app","opcode":"ilt","args":[{"id":279,"kind":"name","name":"x"},{"id":280,"kind":"int","value":10}]},{"id":284,"kind":"app","opcode":"iadd","args":[{"id":282,"kind":"name","name":"y"},{"id":283,"kind":"int","value":5}]},{"id":287,"kind":"app","opcode":"imod","args":[{"id":285,"kind":"name","name":"y"},{"id":286,"kind":"int","value":5}]}]}}},{"id":297,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":296,"kind":"app","opcode":"get","args":[{"id":294,"kind":"name","name":"f1"},{"id":295,"kind":"str","value":"a"}]}},{"id":305,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":304,"kind":"app","opcode":"MyOper","args":[{"id":302,"kind":"str","value":"a"},{"id":303,"kind":"int","value":42}]}},{"id":309,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":308,"kind":"app","opcode":"MyOper","args":[{"id":306,"kind":"str","value":"a"},{"id":307,"kind":"int","value":42}]}},{"id":321,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":320,"kind":"app","opcode":"filter","args":[{"id":314,"kind":"name","name":"S"},{"id":319,"kind":"lambda","params":[{"id":315,"name":"x"}],"qualifier":"def","expr":{"id":318,"kind":"app","opcode":"igt","args":[{"id":316,"kind":"name","name":"x"},{"id":317,"kind":"int","value":10}]}}]}},{"id":339,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"filter","args":[{"id":334,"kind":"name","name":"S"},{"id":337,"kind":"lambda","params":[{"id":335,"name":"_"}],"qualifier":"def","expr":{"id":336,"kind":"bool","value":true}}]}},{"id":347,"kind":"def","name":"f","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"mapBy","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"iadd","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":1}]}}]}},{"id":353,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":352,"kind":"app","opcode":"exclude","args":[{"id":348,"kind":"name","name":"S"},{"id":351,"kind":"app","opcode":"Set","args":[{"id":349,"kind":"int","value":3},{"id":350,"kind":"int","value":4}]}]}},{"id":409,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"with","args":[{"id":407,"kind":"app","opcode":"with","args":[{"id":406,"kind":"name","name":"test_record"},{"id":403,"kind":"str","value":"name"},{"id":402,"kind":"str","value":"quint"}]},{"id":405,"kind":"str","value":"year"},{"id":404,"kind":"int","value":2023}]}},{"id":425,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":424,"kind":"let","opdef":{"id":420,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":419,"kind":"app","opcode":"Rec","args":[{"id":416,"kind":"str","value":"a"},{"id":415,"kind":"int","value":1},{"id":418,"kind":"str","value":"b"},{"id":417,"kind":"str","value":"foo"}]}},"expr":{"id":423,"kind":"app","opcode":"field","args":[{"id":421,"kind":"name","name":"my_rec"},{"id":422,"kind":"str","value":"a"}]}}},{"id":434,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":433,"kind":"let","opdef":{"id":429,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Tup","args":[{"id":426,"kind":"str","value":"a"},{"id":427,"kind":"int","value":3}]}},"expr":{"id":432,"kind":"app","opcode":"item","args":[{"id":430,"kind":"name","name":"my_tup"},{"id":431,"kind":"int","value":2}]}}},{"id":439,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":439,"kind":"lambda","params":[{"id":435,"name":"s"}],"qualifier":"def","expr":{"id":438,"kind":"app","opcode":"eq","args":[{"id":436,"kind":"name","name":"s"},{"id":437,"kind":"app","opcode":"List","args":[]}]}}},{"id":460,"kind":"assume","name":"positive","assumption":{"id":459,"kind":"app","opcode":"igt","args":[{"id":457,"kind":"name","name":"N"},{"id":458,"kind":"int","value":0}]}},{"id":464,"kind":"assume","name":"_","assumption":{"id":463,"kind":"app","opcode":"neq","args":[{"id":461,"kind":"name","name":"N"},{"id":462,"kind":"int","value":0}]}},{"id":465,"kind":"import","defName":"foo","protoName":"M1"},{"id":466,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":471,"kind":"const","name":"INT_SET"},"id":472},{"id":475,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":474,"name":"N"},{"id":473,"kind":"name","name":"N"}]],"identityOverride":false},{"id":502,"kind":"def","name":"isValid","qualifier":"def","expr":{"id":502,"kind":"lambda","params":[{"id":483,"name":"entry"}],"qualifier":"def","expr":{"id":501,"kind":"app","opcode":"unionMatch","args":[{"id":484,"kind":"name","name":"entry"},{"id":497,"kind":"str","value":"Cat"},{"id":498,"kind":"lambda","params":[{"id":485,"name":"cat"}],"qualifier":"def","expr":{"id":490,"kind":"app","opcode":"neq","args":[{"id":488,"kind":"app","opcode":"field","args":[{"id":486,"kind":"name","name":"cat"},{"id":487,"kind":"str","value":"name"}]},{"id":489,"kind":"str","value":""}]}},{"id":499,"kind":"str","value":"Date"},{"id":500,"kind":"lambda","params":[{"id":491,"name":"date"}],"qualifier":"def","expr":{"id":496,"kind":"app","opcode":"igt","args":[{"id":494,"kind":"app","opcode":"field","args":[{"id":492,"kind":"name","name":"date"},{"id":493,"kind":"str","value":"year"}]},{"id":495,"kind":"int","value":0}]}}]}}},{"id":237,"kind":"def","name":"G","qualifier":"val","expr":{"id":237,"kind":"lambda","params":[{"id":231,"name":"x"}],"qualifier":"val","expr":{"id":236,"kind":"app","opcode":"and","args":[{"id":233,"kind":"app","opcode":"F","args":[{"id":232,"kind":"name","name":"x"}]},{"id":235,"kind":"app","opcode":"not","args":[{"id":234,"kind":"name","name":"x"}]}]}}},{"id":244,"kind":"def","name":"test_and_arg","qualifier":"val","expr":{"id":244,"kind":"lambda","params":[{"id":238,"name":"x"}],"qualifier":"val","expr":{"id":243,"kind":"app","opcode":"and","args":[{"id":240,"kind":"app","opcode":"F","args":[{"id":239,"kind":"name","name":"x"}]},{"id":242,"kind":"app","opcode":"not","args":[{"id":241,"kind":"name","name":"x"}]}]}}},{"id":251,"kind":"def","name":"test_or_arg","qualifier":"val","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"val","expr":{"id":250,"kind":"app","opcode":"or","args":[{"id":247,"kind":"app","opcode":"F","args":[{"id":246,"kind":"name","name":"x"}]},{"id":249,"kind":"app","opcode":"not","args":[{"id":248,"kind":"name","name":"x"}]}]}}},{"id":333,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":332,"kind":"let","opdef":{"id":324,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":323,"kind":"app","opcode":"oneOf","args":[{"id":322,"kind":"name","name":"S"}]}},"expr":{"id":331,"kind":"app","opcode":"actionAll","args":[{"id":327,"kind":"app","opcode":"igt","args":[{"id":325,"kind":"name","name":"x"},{"id":326,"kind":"int","value":10}]},{"id":330,"kind":"app","opcode":"assign","args":[{"id":329,"kind":"name","name":"k"},{"id":328,"kind":"name","name":"x"}]}]}}}]}],"table":{"142":{"kind":"param","reference":141},"153":{"kind":"type","reference":152},"163":{"kind":"param","reference":161},"164":{"kind":"param","reference":162},"168":{"kind":"param","reference":167},"169":{"kind":"var","reference":158,"typeAnnotation":{"id":157,"kind":"int"}},"173":{"kind":"param","reference":172},"174":{"kind":"var","reference":158,"typeAnnotation":{"id":157,"kind":"int"}},"178":{"kind":"param","reference":177},"187":{"kind":"param","reference":181},"188":{"kind":"param","reference":182},"195":{"kind":"param","reference":191},"200":{"kind":"var","reference":198,"typeAnnotation":{"id":197,"kind":"int"}},"208":{"kind":"param","reference":203},"209":{"kind":"param","reference":205},"211":{"kind":"param","reference":203},"212":{"kind":"param","reference":205},"229":{"kind":"param","reference":228},"232":{"kind":"param","reference":231},"233":{"kind":"def","reference":230},"234":{"kind":"param","reference":231},"239":{"kind":"param","reference":238},"240":{"kind":"def","reference":230},"241":{"kind":"param","reference":238},"246":{"kind":"param","reference":245},"247":{"kind":"def","reference":230},"248":{"kind":"param","reference":245},"279":{"kind":"param","reference":277},"282":{"kind":"param","reference":278},"285":{"kind":"param","reference":278},"294":{"kind":"var","reference":293,"typeAnnotation":{"id":292,"kind":"fun","arg":{"id":290,"kind":"str"},"res":{"id":291,"kind":"int"}}},"304":{"kind":"def","reference":301},"308":{"kind":"def","reference":301},"314":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"316":{"kind":"param","reference":315},"322":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"325":{"kind":"def","reference":324},"328":{"kind":"def","reference":324},"329":{"kind":"var","reference":198,"typeAnnotation":{"id":197,"kind":"int"}},"334":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"340":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"342":{"kind":"param","reference":341},"348":{"kind":"const","reference":16,"typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}}},"406":{"kind":"def","reference":395},"421":{"kind":"def","reference":420},"430":{"kind":"def","reference":429},"436":{"kind":"param","reference":435},"457":{"kind":"const","reference":13,"typeAnnotation":{"id":12,"kind":"int"}},"461":{"kind":"const","reference":13,"typeAnnotation":{"id":12,"kind":"int"}},"471":{"kind":"type","reference":469,"typeAnnotation":{"id":468,"kind":"set","elem":{"id":467,"kind":"int"}}},"473":{"kind":"const","reference":13,"typeAnnotation":{"id":12,"kind":"int"}},"474":{"kind":"const","reference":473,"typeAnnotation":{"id":7,"kind":"int"}},"484":{"kind":"param","reference":483},"486":{"kind":"param","reference":485},"492":{"kind":"param","reference":491}}} \ No newline at end of file